From aca2ce50f9f0ff2a7f3d222ab6c5e22028121a58 Mon Sep 17 00:00:00 2001 From: Nicolas Boisselier Date: Sat, 2 Apr 2016 18:42:50 +0200 Subject: [PATCH] add files --- awstatstotals/awstats.php | 71 + awstatstotals/awstatstotals.php | 442 ++ betterawstats/bawstats.info | 5 + betterawstats/bawstats.install | 38 + betterawstats/bawstats.module | 167 + betterawstats/config.php | 798 ++++ betterawstats/core/config.inc.php | 441 ++ betterawstats/core/config_default.inc.php | 639 +++ betterawstats/core/data.inc.php | 403 ++ betterawstats/core/display.inc.php | 1669 ++++++++ betterawstats/core/display_helpers.php | 786 ++++ betterawstats/core/extras.inc.php | 87 + betterawstats/core/helpers.inc.php | 393 ++ betterawstats/core/index.html | 0 betterawstats/core/language.inc.php | 177 + betterawstats/core/library.inc.php | 200 + betterawstats/docs/FAQ.txt | 3 + betterawstats/docs/LICENSE.TXT | 341 ++ betterawstats/docs/history.txt | 209 + betterawstats/docs/index.html | 0 betterawstats/docs/install.drupal.txt | 142 + betterawstats/docs/install.txt | 38 + betterawstats/favicon.ico | Bin 0 -> 766 bytes betterawstats/horizontal.css | 50 + betterawstats/icons/bar.png | Bin 0 -> 193 bytes betterawstats/icons/btn_empty.gif | Bin 0 -> 268 bytes betterawstats/icons/circ-blue.png | Bin 0 -> 5320 bytes betterawstats/icons/circ-green.png | Bin 0 -> 5773 bytes betterawstats/icons/collapse.gif | Bin 0 -> 978 bytes betterawstats/icons/empty.png | Bin 0 -> 138 bytes betterawstats/icons/expand.gif | Bin 0 -> 281 bytes betterawstats/icons/external.png | Bin 0 -> 165 bytes betterawstats/icons/fulllist.png | Bin 0 -> 235 bytes betterawstats/icons/fulllist_btn.png | Bin 0 -> 546 bytes betterawstats/icons/help.png | Bin 0 -> 485 bytes betterawstats/icons/index.html | 0 betterawstats/icons/screen.png | Bin 0 -> 91 bytes betterawstats/icons/unknown.png | Bin 0 -> 233 bytes betterawstats/icons/unknown_btn.png | Bin 0 -> 520 bytes betterawstats/icons/versions.png | Bin 0 -> 237 bytes betterawstats/icons/versions_btn.png | Bin 0 -> 569 bytes betterawstats/icons/wmap.png | Bin 0 -> 23447 bytes betterawstats/includes/bawstats.admin.inc | 272 ++ betterawstats/includes/bawstats.config.inc | 114 + betterawstats/includes/bawstats.css | 143 + betterawstats/includes/bawstats.stats.inc | 464 ++ betterawstats/includes/index.html | 0 betterawstats/index.php | 141 + betterawstats/language/index.html | 0 betterawstats/language/lang_de.inc.php | 390 ++ betterawstats/language/lang_en.inc.php | 390 ++ betterawstats/language/lang_nl.inc.php | 392 ++ betterawstats/modules/index.html | 0 .../modules/render_htmlchart.inc.php | 247 ++ .../modules/render_htmlchart2.inc.php | 202 + betterawstats/modules/render_jpgraph.inc.php | 142 + betterawstats/modules/render_map.inc.php | 236 ++ betterawstats/modules/render_table.inc.php | 271 ++ betterawstats/scripts.js | 51 + betterawstats/style.css | 461 ++ betterawstats/vertical.css | 14 + favicon.ico | Bin 0 -> 8166 bytes httpd.conf | 17 + index.php | 95 + jawstats-config.php | 56 + jawstats/clsAWStats.php | 631 +++ jawstats/config.dist.php | 35 + jawstats/config.php | 1 + jawstats/index.php | 362 ++ jawstats/js/constants.js | 697 +++ jawstats/js/jawstats.js | 3759 +++++++++++++++++ jawstats/js/jquery.js | 19 + jawstats/js/jquery.tablesorter.js | 876 ++++ jawstats/js/packed.js | 44 + jawstats/js/swfobject.js | 233 + jawstats/languages/de-de.js | 455 ++ jawstats/languages/fr.js | 311 ++ jawstats/languages/jp.js | 415 ++ jawstats/languages/pl.js | 356 ++ jawstats/languages/sv.js | 494 +++ jawstats/languages/translations.php | 362 ++ jawstats/readme.txt | 2 + jawstats/swf/bar_graph.swf | Bin 0 -> 22280 bytes jawstats/swf/line_graph.swf | Bin 0 -> 22516 bytes jawstats/swf/pie.swf | Bin 0 -> 4265 bytes jawstats/themes/default/browsers/camino.gif | Bin 0 -> 366 bytes jawstats/themes/default/browsers/firefox.gif | Bin 0 -> 381 bytes jawstats/themes/default/browsers/icab.gif | Bin 0 -> 379 bytes .../themes/default/browsers/konqueror.gif | Bin 0 -> 397 bytes jawstats/themes/default/browsers/libwww.gif | Bin 0 -> 43 bytes .../themes/default/browsers/lotusnotes.gif | Bin 0 -> 399 bytes jawstats/themes/default/browsers/mozilla.gif | Bin 0 -> 371 bytes jawstats/themes/default/browsers/msie.gif | Bin 0 -> 390 bytes jawstats/themes/default/browsers/netscape.gif | Bin 0 -> 377 bytes jawstats/themes/default/browsers/omniweb.gif | Bin 0 -> 378 bytes jawstats/themes/default/browsers/opera.gif | Bin 0 -> 379 bytes .../themes/default/browsers/otherbrowsers.gif | Bin 0 -> 43 bytes jawstats/themes/default/browsers/safari.gif | Bin 0 -> 386 bytes jawstats/themes/default/browsers/unknown.gif | Bin 0 -> 43 bytes jawstats/themes/default/browsers/wget.gif | Bin 0 -> 43 bytes jawstats/themes/default/changemonth/first.gif | Bin 0 -> 117 bytes .../themes/default/changemonth/first_off.gif | Bin 0 -> 117 bytes .../themes/default/changemonth/first_on.gif | Bin 0 -> 117 bytes jawstats/themes/default/changemonth/last.gif | Bin 0 -> 118 bytes .../themes/default/changemonth/last_off.gif | Bin 0 -> 118 bytes .../themes/default/changemonth/last_on.gif | Bin 0 -> 118 bytes jawstats/themes/default/changemonth/next.gif | Bin 0 -> 114 bytes .../themes/default/changemonth/next_off.gif | Bin 0 -> 114 bytes .../themes/default/changemonth/next_on.gif | Bin 0 -> 114 bytes jawstats/themes/default/changemonth/prev.gif | Bin 0 -> 115 bytes .../themes/default/changemonth/prev_off.gif | Bin 0 -> 115 bytes .../themes/default/changemonth/prev_on.gif | Bin 0 -> 115 bytes jawstats/themes/default/flags/ad.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/ae.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/af.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/ag.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/ai.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/al.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/am.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/an.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/ao.gif | Bin 0 -> 244 bytes jawstats/themes/default/flags/ar.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/as.gif | Bin 0 -> 365 bytes jawstats/themes/default/flags/at.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/au.gif | Bin 0 -> 378 bytes jawstats/themes/default/flags/aw.gif | Bin 0 -> 365 bytes jawstats/themes/default/flags/ax.gif | Bin 0 -> 376 bytes jawstats/themes/default/flags/az.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/ba.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/bb.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/bd.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/be.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/bf.gif | Bin 0 -> 358 bytes jawstats/themes/default/flags/bg.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/bh.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/bi.gif | Bin 0 -> 374 bytes jawstats/themes/default/flags/bj.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/bm.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/bn.gif | Bin 0 -> 373 bytes jawstats/themes/default/flags/bo.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/br.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/bs.gif | Bin 0 -> 351 bytes jawstats/themes/default/flags/bt.gif | Bin 0 -> 377 bytes jawstats/themes/default/flags/bv.gif | Bin 0 -> 376 bytes jawstats/themes/default/flags/bw.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/by.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/bz.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/ca.gif | Bin 0 -> 376 bytes jawstats/themes/default/flags/catalonia.gif | Bin 0 -> 238 bytes jawstats/themes/default/flags/cc.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/cd.gif | Bin 0 -> 243 bytes jawstats/themes/default/flags/cf.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/cg.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/ch.gif | Bin 0 -> 332 bytes jawstats/themes/default/flags/ci.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/ck.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/cl.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/cm.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/cn.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/co.gif | Bin 0 -> 353 bytes jawstats/themes/default/flags/cr.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/cs.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/cu.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/cv.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/cx.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/cy.gif | Bin 0 -> 365 bytes jawstats/themes/default/flags/cz.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/de.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/dj.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/dk.gif | Bin 0 -> 374 bytes jawstats/themes/default/flags/dm.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/do.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/dz.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/ec.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/ee.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/eg.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/eh.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/england.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/er.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/es.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/et.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/eu.gif | Bin 0 -> 171 bytes jawstats/themes/default/flags/fam.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/fi.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/fj.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/fk.gif | Bin 0 -> 372 bytes jawstats/themes/default/flags/fm.gif | Bin 0 -> 377 bytes jawstats/themes/default/flags/fo.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/fr.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/ga.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/gb.gif | Bin 0 -> 260 bytes jawstats/themes/default/flags/gd.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/ge.gif | Bin 0 -> 379 bytes jawstats/themes/default/flags/gf.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/gh.gif | Bin 0 -> 358 bytes jawstats/themes/default/flags/gi.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/gl.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/gm.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/gn.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/gp.gif | Bin 0 -> 357 bytes jawstats/themes/default/flags/gq.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/gr.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/gs.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/gt.gif | Bin 0 -> 374 bytes jawstats/themes/default/flags/gu.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/gw.gif | Bin 0 -> 358 bytes jawstats/themes/default/flags/gy.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/hk.gif | Bin 0 -> 373 bytes jawstats/themes/default/flags/hm.gif | Bin 0 -> 378 bytes jawstats/themes/default/flags/hn.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/hr.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/ht.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/hu.gif | Bin 0 -> 357 bytes jawstats/themes/default/flags/id.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/ie.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/il.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/in.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/io.gif | Bin 0 -> 373 bytes jawstats/themes/default/flags/iq.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/ir.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/is.gif | Bin 0 -> 373 bytes jawstats/themes/default/flags/it.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/jm.gif | Bin 0 -> 365 bytes jawstats/themes/default/flags/jo.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/jp.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/ke.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/kg.gif | Bin 0 -> 373 bytes jawstats/themes/default/flags/kh.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/ki.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/km.gif | Bin 0 -> 358 bytes jawstats/themes/default/flags/kn.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/kp.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/kr.gif | Bin 0 -> 385 bytes jawstats/themes/default/flags/kw.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/ky.gif | Bin 0 -> 373 bytes jawstats/themes/default/flags/kz.gif | Bin 0 -> 374 bytes jawstats/themes/default/flags/la.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/lb.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/lc.gif | Bin 0 -> 259 bytes jawstats/themes/default/flags/li.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/lk.gif | Bin 0 -> 377 bytes jawstats/themes/default/flags/lr.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/ls.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/lt.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/lu.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/lv.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/ly.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/ma.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/mc.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/md.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/me.gif | Bin 0 -> 238 bytes jawstats/themes/default/flags/mg.gif | Bin 0 -> 372 bytes jawstats/themes/default/flags/mh.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/mk.gif | Bin 0 -> 382 bytes jawstats/themes/default/flags/ml.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/mm.gif | Bin 0 -> 365 bytes jawstats/themes/default/flags/mn.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/mo.gif | Bin 0 -> 378 bytes jawstats/themes/default/flags/mp.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/mq.gif | Bin 0 -> 379 bytes jawstats/themes/default/flags/mr.gif | Bin 0 -> 377 bytes jawstats/themes/default/flags/ms.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/mt.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/mu.gif | Bin 0 -> 358 bytes jawstats/themes/default/flags/mv.gif | Bin 0 -> 372 bytes jawstats/themes/default/flags/mw.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/mx.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/my.gif | Bin 0 -> 375 bytes jawstats/themes/default/flags/mz.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/na.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/nc.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/ne.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/nf.gif | Bin 0 -> 375 bytes jawstats/themes/default/flags/ng.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/ni.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/nl.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/no.gif | Bin 0 -> 376 bytes jawstats/themes/default/flags/np.gif | Bin 0 -> 302 bytes jawstats/themes/default/flags/nr.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/nu.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/nz.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/om.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/pa.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/pe.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/pf.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/pg.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/ph.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/pk.gif | Bin 0 -> 377 bytes jawstats/themes/default/flags/pl.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/pm.gif | Bin 0 -> 374 bytes jawstats/themes/default/flags/pn.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/pr.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/ps.gif | Bin 0 -> 358 bytes jawstats/themes/default/flags/pt.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/pw.gif | Bin 0 -> 374 bytes jawstats/themes/default/flags/py.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/qa.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/re.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/ro.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/rs.gif | Bin 0 -> 238 bytes jawstats/themes/default/flags/ru.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/rw.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/sa.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/sb.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/sc.gif | Bin 0 -> 357 bytes jawstats/themes/default/flags/scotland.gif | Bin 0 -> 378 bytes jawstats/themes/default/flags/sd.gif | Bin 0 -> 355 bytes jawstats/themes/default/flags/se.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/sg.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/sh.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/si.gif | Bin 0 -> 362 bytes jawstats/themes/default/flags/sj.gif | Bin 0 -> 376 bytes jawstats/themes/default/flags/sk.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/sl.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/sm.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/sn.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/so.gif | Bin 0 -> 376 bytes jawstats/themes/default/flags/sr.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/st.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/sv.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/sy.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/sz.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/tc.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/td.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/tf.gif | Bin 0 -> 365 bytes jawstats/themes/default/flags/tg.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/th.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/tj.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/tk.gif | Bin 0 -> 372 bytes jawstats/themes/default/flags/tl.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/tm.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/tn.gif | Bin 0 -> 375 bytes jawstats/themes/default/flags/to.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/tr.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/trans.gif | Bin 0 -> 43 bytes jawstats/themes/default/flags/tt.gif | Bin 0 -> 377 bytes jawstats/themes/default/flags/tv.gif | Bin 0 -> 361 bytes jawstats/themes/default/flags/tw.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/tz.gif | Bin 0 -> 366 bytes jawstats/themes/default/flags/ua.gif | Bin 0 -> 360 bytes jawstats/themes/default/flags/ug.gif | Bin 0 -> 359 bytes jawstats/themes/default/flags/uk.gif | Bin 0 -> 260 bytes jawstats/themes/default/flags/um.gif | Bin 0 -> 371 bytes jawstats/themes/default/flags/us.gif | Bin 0 -> 367 bytes jawstats/themes/default/flags/uy.gif | Bin 0 -> 373 bytes jawstats/themes/default/flags/uz.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/va.gif | Bin 0 -> 369 bytes jawstats/themes/default/flags/vc.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/ve.gif | Bin 0 -> 364 bytes jawstats/themes/default/flags/vg.gif | Bin 0 -> 368 bytes jawstats/themes/default/flags/vi.gif | Bin 0 -> 376 bytes jawstats/themes/default/flags/vn.gif | Bin 0 -> 370 bytes jawstats/themes/default/flags/vu.gif | Bin 0 -> 365 bytes jawstats/themes/default/flags/wales.gif | Bin 0 -> 372 bytes jawstats/themes/default/flags/wf.gif | Bin 0 -> 377 bytes jawstats/themes/default/flags/ws.gif | Bin 0 -> 365 bytes jawstats/themes/default/flags/ye.gif | Bin 0 -> 356 bytes jawstats/themes/default/flags/yt.gif | Bin 0 -> 382 bytes jawstats/themes/default/flags/za.gif | Bin 0 -> 363 bytes jawstats/themes/default/flags/zm.gif | Bin 0 -> 358 bytes jawstats/themes/default/flags/zw.gif | Bin 0 -> 365 bytes .../themes/default/images/change_language.gif | Bin 0 -> 288 bytes .../default/images/change_language_on.gif | Bin 0 -> 186 bytes .../themes/default/images/external_link.png | Bin 0 -> 281 bytes jawstats/themes/default/images/loading.gif | Bin 0 -> 847 bytes jawstats/themes/default/images/tab_left.gif | Bin 0 -> 130 bytes jawstats/themes/default/images/tab_right.gif | Bin 0 -> 424 bytes .../themes/default/images/tablesorter_asc.gif | Bin 0 -> 54 bytes .../themes/default/images/tablesorter_bg.gif | Bin 0 -> 64 bytes .../default/images/tablesorter_desc.gif | Bin 0 -> 54 bytes .../themes/default/images/taboff_left.gif | Bin 0 -> 131 bytes .../themes/default/images/taboff_right.gif | Bin 0 -> 459 bytes jawstats/themes/default/os/bsd.gif | Bin 0 -> 348 bytes jawstats/themes/default/os/linux.gif | Bin 0 -> 371 bytes jawstats/themes/default/os/mac.gif | Bin 0 -> 352 bytes jawstats/themes/default/os/otheros.gif | Bin 0 -> 43 bytes jawstats/themes/default/os/psp.gif | Bin 0 -> 377 bytes jawstats/themes/default/os/sun.gif | Bin 0 -> 380 bytes jawstats/themes/default/os/symbian.gif | Bin 0 -> 394 bytes jawstats/themes/default/os/unknown.gif | Bin 0 -> 43 bytes jawstats/themes/default/os/win.gif | Bin 0 -> 390 bytes jawstats/themes/default/paging/first.gif | Bin 0 -> 191 bytes jawstats/themes/default/paging/first_off.gif | Bin 0 -> 192 bytes jawstats/themes/default/paging/first_on.gif | Bin 0 -> 191 bytes jawstats/themes/default/paging/last.gif | Bin 0 -> 191 bytes jawstats/themes/default/paging/last_off.gif | Bin 0 -> 192 bytes jawstats/themes/default/paging/last_on.gif | Bin 0 -> 191 bytes jawstats/themes/default/paging/next.gif | Bin 0 -> 190 bytes jawstats/themes/default/paging/next_off.gif | Bin 0 -> 190 bytes jawstats/themes/default/paging/next_on.gif | Bin 0 -> 190 bytes jawstats/themes/default/paging/prev.gif | Bin 0 -> 188 bytes jawstats/themes/default/paging/prev_off.gif | Bin 0 -> 188 bytes jawstats/themes/default/paging/prev_on.gif | Bin 0 -> 188 bytes .../themes/default/searchengines/alexa.gif | Bin 0 -> 175 bytes .../themes/default/searchengines/alice.gif | Bin 0 -> 138 bytes .../default/searchengines/alltheweb.gif | Bin 0 -> 159 bytes .../default/searchengines/altavista.gif | Bin 0 -> 129 bytes jawstats/themes/default/searchengines/aol.gif | Bin 0 -> 588 bytes jawstats/themes/default/searchengines/ask.gif | Bin 0 -> 989 bytes .../default/searchengines/avantfind.gif | Bin 0 -> 1080 bytes .../themes/default/searchengines/blingo.gif | Bin 0 -> 130 bytes .../themes/default/searchengines/bluewin.gif | Bin 0 -> 567 bytes .../themes/default/searchengines/clusty.gif | Bin 0 -> 1033 bytes .../default/searchengines/delicious.gif | Bin 0 -> 89 bytes .../themes/default/searchengines/dogpile.gif | Bin 0 -> 370 bytes .../default/searchengines/earthlink.gif | Bin 0 -> 246 bytes .../themes/default/searchengines/eniro.gif | Bin 0 -> 130 bytes .../themes/default/searchengines/excite.gif | Bin 0 -> 239 bytes .../default/searchengines/goodsearch.gif | Bin 0 -> 343 bytes .../themes/default/searchengines/google.gif | Bin 0 -> 570 bytes .../default/searchengines/infospace.gif | Bin 0 -> 1045 bytes .../themes/default/searchengines/kvasir.gif | Bin 0 -> 174 bytes .../themes/default/searchengines/live.gif | Bin 0 -> 1024 bytes .../themes/default/searchengines/lycos.gif | Bin 0 -> 132 bytes .../themes/default/searchengines/mamma.gif | Bin 0 -> 383 bytes jawstats/themes/default/searchengines/msn.gif | Bin 0 -> 151 bytes .../default/searchengines/mywebsearch.gif | Bin 0 -> 290 bytes .../themes/default/searchengines/sapo.gif | Bin 0 -> 582 bytes .../themes/default/searchengines/search.gif | Bin 0 -> 161 bytes .../themes/default/searchengines/seznam.gif | Bin 0 -> 539 bytes .../default/searchengines/steadysearch.gif | Bin 0 -> 380 bytes .../default/searchengines/stumbleupon.gif | Bin 0 -> 1062 bytes .../themes/default/searchengines/tiscali.gif | Bin 0 -> 145 bytes .../themes/default/searchengines/vivisimo.gif | Bin 0 -> 331 bytes .../themes/default/searchengines/voila.gif | Bin 0 -> 333 bytes .../default/searchengines/webcrawler.gif | Bin 0 -> 305 bytes .../themes/default/searchengines/webde.gif | Bin 0 -> 138 bytes .../themes/default/searchengines/yahoo.gif | Bin 0 -> 88 bytes jawstats/themes/default/style.css | 160 + jawstats/themes/default/style.js | 3 + jawstats/xml_history.php | 115 + jawstats/xml_pages.php | 55 + jawstats/xml_stats.php | 74 + jawstats/xml_update.php | 62 + 434 files changed, 20718 insertions(+) create mode 100755 awstatstotals/awstats.php create mode 100755 awstatstotals/awstatstotals.php create mode 100644 betterawstats/bawstats.info create mode 100644 betterawstats/bawstats.install create mode 100644 betterawstats/bawstats.module create mode 100644 betterawstats/config.php create mode 100644 betterawstats/core/config.inc.php create mode 100644 betterawstats/core/config_default.inc.php create mode 100644 betterawstats/core/data.inc.php create mode 100644 betterawstats/core/display.inc.php create mode 100644 betterawstats/core/display_helpers.php create mode 100644 betterawstats/core/extras.inc.php create mode 100644 betterawstats/core/helpers.inc.php create mode 100644 betterawstats/core/index.html create mode 100644 betterawstats/core/language.inc.php create mode 100644 betterawstats/core/library.inc.php create mode 100644 betterawstats/docs/FAQ.txt create mode 100644 betterawstats/docs/LICENSE.TXT create mode 100644 betterawstats/docs/history.txt create mode 100644 betterawstats/docs/index.html create mode 100644 betterawstats/docs/install.drupal.txt create mode 100644 betterawstats/docs/install.txt create mode 100644 betterawstats/favicon.ico create mode 100644 betterawstats/horizontal.css create mode 100644 betterawstats/icons/bar.png create mode 100644 betterawstats/icons/btn_empty.gif create mode 100644 betterawstats/icons/circ-blue.png create mode 100644 betterawstats/icons/circ-green.png create mode 100644 betterawstats/icons/collapse.gif create mode 100644 betterawstats/icons/empty.png create mode 100644 betterawstats/icons/expand.gif create mode 100644 betterawstats/icons/external.png create mode 100644 betterawstats/icons/fulllist.png create mode 100644 betterawstats/icons/fulllist_btn.png create mode 100644 betterawstats/icons/help.png create mode 100644 betterawstats/icons/index.html create mode 100644 betterawstats/icons/screen.png create mode 100644 betterawstats/icons/unknown.png create mode 100644 betterawstats/icons/unknown_btn.png create mode 100644 betterawstats/icons/versions.png create mode 100644 betterawstats/icons/versions_btn.png create mode 100644 betterawstats/icons/wmap.png create mode 100644 betterawstats/includes/bawstats.admin.inc create mode 100644 betterawstats/includes/bawstats.config.inc create mode 100644 betterawstats/includes/bawstats.css create mode 100644 betterawstats/includes/bawstats.stats.inc create mode 100644 betterawstats/includes/index.html create mode 100644 betterawstats/index.php create mode 100644 betterawstats/language/index.html create mode 100644 betterawstats/language/lang_de.inc.php create mode 100644 betterawstats/language/lang_en.inc.php create mode 100644 betterawstats/language/lang_nl.inc.php create mode 100644 betterawstats/modules/index.html create mode 100644 betterawstats/modules/render_htmlchart.inc.php create mode 100644 betterawstats/modules/render_htmlchart2.inc.php create mode 100644 betterawstats/modules/render_jpgraph.inc.php create mode 100644 betterawstats/modules/render_map.inc.php create mode 100644 betterawstats/modules/render_table.inc.php create mode 100644 betterawstats/scripts.js create mode 100644 betterawstats/style.css create mode 100644 betterawstats/vertical.css create mode 100644 favicon.ico create mode 100644 httpd.conf create mode 100644 index.php create mode 100755 jawstats-config.php create mode 100755 jawstats/clsAWStats.php create mode 100755 jawstats/config.dist.php create mode 120000 jawstats/config.php create mode 100755 jawstats/index.php create mode 100755 jawstats/js/constants.js create mode 100755 jawstats/js/jawstats.js create mode 100755 jawstats/js/jquery.js create mode 100755 jawstats/js/jquery.tablesorter.js create mode 100755 jawstats/js/packed.js create mode 100755 jawstats/js/swfobject.js create mode 100755 jawstats/languages/de-de.js create mode 100755 jawstats/languages/fr.js create mode 100755 jawstats/languages/jp.js create mode 100755 jawstats/languages/pl.js create mode 100755 jawstats/languages/sv.js create mode 100755 jawstats/languages/translations.php create mode 100755 jawstats/readme.txt create mode 100755 jawstats/swf/bar_graph.swf create mode 100755 jawstats/swf/line_graph.swf create mode 100755 jawstats/swf/pie.swf create mode 100755 jawstats/themes/default/browsers/camino.gif create mode 100755 jawstats/themes/default/browsers/firefox.gif create mode 100755 jawstats/themes/default/browsers/icab.gif create mode 100755 jawstats/themes/default/browsers/konqueror.gif create mode 100755 jawstats/themes/default/browsers/libwww.gif create mode 100755 jawstats/themes/default/browsers/lotusnotes.gif create mode 100755 jawstats/themes/default/browsers/mozilla.gif create mode 100755 jawstats/themes/default/browsers/msie.gif create mode 100755 jawstats/themes/default/browsers/netscape.gif create mode 100755 jawstats/themes/default/browsers/omniweb.gif create mode 100755 jawstats/themes/default/browsers/opera.gif create mode 100755 jawstats/themes/default/browsers/otherbrowsers.gif create mode 100755 jawstats/themes/default/browsers/safari.gif create mode 100755 jawstats/themes/default/browsers/unknown.gif create mode 100755 jawstats/themes/default/browsers/wget.gif create mode 100755 jawstats/themes/default/changemonth/first.gif create mode 100755 jawstats/themes/default/changemonth/first_off.gif create mode 100755 jawstats/themes/default/changemonth/first_on.gif create mode 100755 jawstats/themes/default/changemonth/last.gif create mode 100755 jawstats/themes/default/changemonth/last_off.gif create mode 100755 jawstats/themes/default/changemonth/last_on.gif create mode 100755 jawstats/themes/default/changemonth/next.gif create mode 100755 jawstats/themes/default/changemonth/next_off.gif create mode 100755 jawstats/themes/default/changemonth/next_on.gif create mode 100755 jawstats/themes/default/changemonth/prev.gif create mode 100755 jawstats/themes/default/changemonth/prev_off.gif create mode 100755 jawstats/themes/default/changemonth/prev_on.gif create mode 100755 jawstats/themes/default/flags/ad.gif create mode 100755 jawstats/themes/default/flags/ae.gif create mode 100755 jawstats/themes/default/flags/af.gif create mode 100755 jawstats/themes/default/flags/ag.gif create mode 100755 jawstats/themes/default/flags/ai.gif create mode 100755 jawstats/themes/default/flags/al.gif create mode 100755 jawstats/themes/default/flags/am.gif create mode 100755 jawstats/themes/default/flags/an.gif create mode 100755 jawstats/themes/default/flags/ao.gif create mode 100755 jawstats/themes/default/flags/ar.gif create mode 100755 jawstats/themes/default/flags/as.gif create mode 100755 jawstats/themes/default/flags/at.gif create mode 100755 jawstats/themes/default/flags/au.gif create mode 100755 jawstats/themes/default/flags/aw.gif create mode 100755 jawstats/themes/default/flags/ax.gif create mode 100755 jawstats/themes/default/flags/az.gif create mode 100755 jawstats/themes/default/flags/ba.gif create mode 100755 jawstats/themes/default/flags/bb.gif create mode 100755 jawstats/themes/default/flags/bd.gif create mode 100755 jawstats/themes/default/flags/be.gif create mode 100755 jawstats/themes/default/flags/bf.gif create mode 100755 jawstats/themes/default/flags/bg.gif create mode 100755 jawstats/themes/default/flags/bh.gif create mode 100755 jawstats/themes/default/flags/bi.gif create mode 100755 jawstats/themes/default/flags/bj.gif create mode 100755 jawstats/themes/default/flags/bm.gif create mode 100755 jawstats/themes/default/flags/bn.gif create mode 100755 jawstats/themes/default/flags/bo.gif create mode 100755 jawstats/themes/default/flags/br.gif create mode 100755 jawstats/themes/default/flags/bs.gif create mode 100755 jawstats/themes/default/flags/bt.gif create mode 100755 jawstats/themes/default/flags/bv.gif create mode 100755 jawstats/themes/default/flags/bw.gif create mode 100755 jawstats/themes/default/flags/by.gif create mode 100755 jawstats/themes/default/flags/bz.gif create mode 100755 jawstats/themes/default/flags/ca.gif create mode 100755 jawstats/themes/default/flags/catalonia.gif create mode 100755 jawstats/themes/default/flags/cc.gif create mode 100755 jawstats/themes/default/flags/cd.gif create mode 100755 jawstats/themes/default/flags/cf.gif create mode 100755 jawstats/themes/default/flags/cg.gif create mode 100755 jawstats/themes/default/flags/ch.gif create mode 100755 jawstats/themes/default/flags/ci.gif create mode 100755 jawstats/themes/default/flags/ck.gif create mode 100755 jawstats/themes/default/flags/cl.gif create mode 100755 jawstats/themes/default/flags/cm.gif create mode 100755 jawstats/themes/default/flags/cn.gif create mode 100755 jawstats/themes/default/flags/co.gif create mode 100755 jawstats/themes/default/flags/cr.gif create mode 100755 jawstats/themes/default/flags/cs.gif create mode 100755 jawstats/themes/default/flags/cu.gif create mode 100755 jawstats/themes/default/flags/cv.gif create mode 100755 jawstats/themes/default/flags/cx.gif create mode 100755 jawstats/themes/default/flags/cy.gif create mode 100755 jawstats/themes/default/flags/cz.gif create mode 100755 jawstats/themes/default/flags/de.gif create mode 100755 jawstats/themes/default/flags/dj.gif create mode 100755 jawstats/themes/default/flags/dk.gif create mode 100755 jawstats/themes/default/flags/dm.gif create mode 100755 jawstats/themes/default/flags/do.gif create mode 100755 jawstats/themes/default/flags/dz.gif create mode 100755 jawstats/themes/default/flags/ec.gif create mode 100755 jawstats/themes/default/flags/ee.gif create mode 100755 jawstats/themes/default/flags/eg.gif create mode 100755 jawstats/themes/default/flags/eh.gif create mode 100755 jawstats/themes/default/flags/england.gif create mode 100755 jawstats/themes/default/flags/er.gif create mode 100755 jawstats/themes/default/flags/es.gif create mode 100755 jawstats/themes/default/flags/et.gif create mode 100755 jawstats/themes/default/flags/eu.gif create mode 100755 jawstats/themes/default/flags/fam.gif create mode 100755 jawstats/themes/default/flags/fi.gif create mode 100755 jawstats/themes/default/flags/fj.gif create mode 100755 jawstats/themes/default/flags/fk.gif create mode 100755 jawstats/themes/default/flags/fm.gif create mode 100755 jawstats/themes/default/flags/fo.gif create mode 100755 jawstats/themes/default/flags/fr.gif create mode 100755 jawstats/themes/default/flags/ga.gif create mode 100755 jawstats/themes/default/flags/gb.gif create mode 100755 jawstats/themes/default/flags/gd.gif create mode 100755 jawstats/themes/default/flags/ge.gif create mode 100755 jawstats/themes/default/flags/gf.gif create mode 100755 jawstats/themes/default/flags/gh.gif create mode 100755 jawstats/themes/default/flags/gi.gif create mode 100755 jawstats/themes/default/flags/gl.gif create mode 100755 jawstats/themes/default/flags/gm.gif create mode 100755 jawstats/themes/default/flags/gn.gif create mode 100755 jawstats/themes/default/flags/gp.gif create mode 100755 jawstats/themes/default/flags/gq.gif create mode 100755 jawstats/themes/default/flags/gr.gif create mode 100755 jawstats/themes/default/flags/gs.gif create mode 100755 jawstats/themes/default/flags/gt.gif create mode 100755 jawstats/themes/default/flags/gu.gif create mode 100755 jawstats/themes/default/flags/gw.gif create mode 100755 jawstats/themes/default/flags/gy.gif create mode 100755 jawstats/themes/default/flags/hk.gif create mode 100755 jawstats/themes/default/flags/hm.gif create mode 100755 jawstats/themes/default/flags/hn.gif create mode 100755 jawstats/themes/default/flags/hr.gif create mode 100755 jawstats/themes/default/flags/ht.gif create mode 100755 jawstats/themes/default/flags/hu.gif create mode 100755 jawstats/themes/default/flags/id.gif create mode 100755 jawstats/themes/default/flags/ie.gif create mode 100755 jawstats/themes/default/flags/il.gif create mode 100755 jawstats/themes/default/flags/in.gif create mode 100755 jawstats/themes/default/flags/io.gif create mode 100755 jawstats/themes/default/flags/iq.gif create mode 100755 jawstats/themes/default/flags/ir.gif create mode 100755 jawstats/themes/default/flags/is.gif create mode 100755 jawstats/themes/default/flags/it.gif create mode 100755 jawstats/themes/default/flags/jm.gif create mode 100755 jawstats/themes/default/flags/jo.gif create mode 100755 jawstats/themes/default/flags/jp.gif create mode 100755 jawstats/themes/default/flags/ke.gif create mode 100755 jawstats/themes/default/flags/kg.gif create mode 100755 jawstats/themes/default/flags/kh.gif create mode 100755 jawstats/themes/default/flags/ki.gif create mode 100755 jawstats/themes/default/flags/km.gif create mode 100755 jawstats/themes/default/flags/kn.gif create mode 100755 jawstats/themes/default/flags/kp.gif create mode 100755 jawstats/themes/default/flags/kr.gif create mode 100755 jawstats/themes/default/flags/kw.gif create mode 100755 jawstats/themes/default/flags/ky.gif create mode 100755 jawstats/themes/default/flags/kz.gif create mode 100755 jawstats/themes/default/flags/la.gif create mode 100755 jawstats/themes/default/flags/lb.gif create mode 100755 jawstats/themes/default/flags/lc.gif create mode 100755 jawstats/themes/default/flags/li.gif create mode 100755 jawstats/themes/default/flags/lk.gif create mode 100755 jawstats/themes/default/flags/lr.gif create mode 100755 jawstats/themes/default/flags/ls.gif create mode 100755 jawstats/themes/default/flags/lt.gif create mode 100755 jawstats/themes/default/flags/lu.gif create mode 100755 jawstats/themes/default/flags/lv.gif create mode 100755 jawstats/themes/default/flags/ly.gif create mode 100755 jawstats/themes/default/flags/ma.gif create mode 100755 jawstats/themes/default/flags/mc.gif create mode 100755 jawstats/themes/default/flags/md.gif create mode 100755 jawstats/themes/default/flags/me.gif create mode 100755 jawstats/themes/default/flags/mg.gif create mode 100755 jawstats/themes/default/flags/mh.gif create mode 100755 jawstats/themes/default/flags/mk.gif create mode 100755 jawstats/themes/default/flags/ml.gif create mode 100755 jawstats/themes/default/flags/mm.gif create mode 100755 jawstats/themes/default/flags/mn.gif create mode 100755 jawstats/themes/default/flags/mo.gif create mode 100755 jawstats/themes/default/flags/mp.gif create mode 100755 jawstats/themes/default/flags/mq.gif create mode 100755 jawstats/themes/default/flags/mr.gif create mode 100755 jawstats/themes/default/flags/ms.gif create mode 100755 jawstats/themes/default/flags/mt.gif create mode 100755 jawstats/themes/default/flags/mu.gif create mode 100755 jawstats/themes/default/flags/mv.gif create mode 100755 jawstats/themes/default/flags/mw.gif create mode 100755 jawstats/themes/default/flags/mx.gif create mode 100755 jawstats/themes/default/flags/my.gif create mode 100755 jawstats/themes/default/flags/mz.gif create mode 100755 jawstats/themes/default/flags/na.gif create mode 100755 jawstats/themes/default/flags/nc.gif create mode 100755 jawstats/themes/default/flags/ne.gif create mode 100755 jawstats/themes/default/flags/nf.gif create mode 100755 jawstats/themes/default/flags/ng.gif create mode 100755 jawstats/themes/default/flags/ni.gif create mode 100755 jawstats/themes/default/flags/nl.gif create mode 100755 jawstats/themes/default/flags/no.gif create mode 100755 jawstats/themes/default/flags/np.gif create mode 100755 jawstats/themes/default/flags/nr.gif create mode 100755 jawstats/themes/default/flags/nu.gif create mode 100755 jawstats/themes/default/flags/nz.gif create mode 100755 jawstats/themes/default/flags/om.gif create mode 100755 jawstats/themes/default/flags/pa.gif create mode 100755 jawstats/themes/default/flags/pe.gif create mode 100755 jawstats/themes/default/flags/pf.gif create mode 100755 jawstats/themes/default/flags/pg.gif create mode 100755 jawstats/themes/default/flags/ph.gif create mode 100755 jawstats/themes/default/flags/pk.gif create mode 100755 jawstats/themes/default/flags/pl.gif create mode 100755 jawstats/themes/default/flags/pm.gif create mode 100755 jawstats/themes/default/flags/pn.gif create mode 100755 jawstats/themes/default/flags/pr.gif create mode 100755 jawstats/themes/default/flags/ps.gif create mode 100755 jawstats/themes/default/flags/pt.gif create mode 100755 jawstats/themes/default/flags/pw.gif create mode 100755 jawstats/themes/default/flags/py.gif create mode 100755 jawstats/themes/default/flags/qa.gif create mode 100755 jawstats/themes/default/flags/re.gif create mode 100755 jawstats/themes/default/flags/ro.gif create mode 100755 jawstats/themes/default/flags/rs.gif create mode 100755 jawstats/themes/default/flags/ru.gif create mode 100755 jawstats/themes/default/flags/rw.gif create mode 100755 jawstats/themes/default/flags/sa.gif create mode 100755 jawstats/themes/default/flags/sb.gif create mode 100755 jawstats/themes/default/flags/sc.gif create mode 100755 jawstats/themes/default/flags/scotland.gif create mode 100755 jawstats/themes/default/flags/sd.gif create mode 100755 jawstats/themes/default/flags/se.gif create mode 100755 jawstats/themes/default/flags/sg.gif create mode 100755 jawstats/themes/default/flags/sh.gif create mode 100755 jawstats/themes/default/flags/si.gif create mode 100755 jawstats/themes/default/flags/sj.gif create mode 100755 jawstats/themes/default/flags/sk.gif create mode 100755 jawstats/themes/default/flags/sl.gif create mode 100755 jawstats/themes/default/flags/sm.gif create mode 100755 jawstats/themes/default/flags/sn.gif create mode 100755 jawstats/themes/default/flags/so.gif create mode 100755 jawstats/themes/default/flags/sr.gif create mode 100755 jawstats/themes/default/flags/st.gif create mode 100755 jawstats/themes/default/flags/sv.gif create mode 100755 jawstats/themes/default/flags/sy.gif create mode 100755 jawstats/themes/default/flags/sz.gif create mode 100755 jawstats/themes/default/flags/tc.gif create mode 100755 jawstats/themes/default/flags/td.gif create mode 100755 jawstats/themes/default/flags/tf.gif create mode 100755 jawstats/themes/default/flags/tg.gif create mode 100755 jawstats/themes/default/flags/th.gif create mode 100755 jawstats/themes/default/flags/tj.gif create mode 100755 jawstats/themes/default/flags/tk.gif create mode 100755 jawstats/themes/default/flags/tl.gif create mode 100755 jawstats/themes/default/flags/tm.gif create mode 100755 jawstats/themes/default/flags/tn.gif create mode 100755 jawstats/themes/default/flags/to.gif create mode 100755 jawstats/themes/default/flags/tr.gif create mode 100755 jawstats/themes/default/flags/trans.gif create mode 100755 jawstats/themes/default/flags/tt.gif create mode 100755 jawstats/themes/default/flags/tv.gif create mode 100755 jawstats/themes/default/flags/tw.gif create mode 100755 jawstats/themes/default/flags/tz.gif create mode 100755 jawstats/themes/default/flags/ua.gif create mode 100755 jawstats/themes/default/flags/ug.gif create mode 100755 jawstats/themes/default/flags/uk.gif create mode 100755 jawstats/themes/default/flags/um.gif create mode 100755 jawstats/themes/default/flags/us.gif create mode 100755 jawstats/themes/default/flags/uy.gif create mode 100755 jawstats/themes/default/flags/uz.gif create mode 100755 jawstats/themes/default/flags/va.gif create mode 100755 jawstats/themes/default/flags/vc.gif create mode 100755 jawstats/themes/default/flags/ve.gif create mode 100755 jawstats/themes/default/flags/vg.gif create mode 100755 jawstats/themes/default/flags/vi.gif create mode 100755 jawstats/themes/default/flags/vn.gif create mode 100755 jawstats/themes/default/flags/vu.gif create mode 100755 jawstats/themes/default/flags/wales.gif create mode 100755 jawstats/themes/default/flags/wf.gif create mode 100755 jawstats/themes/default/flags/ws.gif create mode 100755 jawstats/themes/default/flags/ye.gif create mode 100755 jawstats/themes/default/flags/yt.gif create mode 100755 jawstats/themes/default/flags/za.gif create mode 100755 jawstats/themes/default/flags/zm.gif create mode 100755 jawstats/themes/default/flags/zw.gif create mode 100755 jawstats/themes/default/images/change_language.gif create mode 100755 jawstats/themes/default/images/change_language_on.gif create mode 100755 jawstats/themes/default/images/external_link.png create mode 100755 jawstats/themes/default/images/loading.gif create mode 100755 jawstats/themes/default/images/tab_left.gif create mode 100755 jawstats/themes/default/images/tab_right.gif create mode 100755 jawstats/themes/default/images/tablesorter_asc.gif create mode 100755 jawstats/themes/default/images/tablesorter_bg.gif create mode 100755 jawstats/themes/default/images/tablesorter_desc.gif create mode 100755 jawstats/themes/default/images/taboff_left.gif create mode 100755 jawstats/themes/default/images/taboff_right.gif create mode 100755 jawstats/themes/default/os/bsd.gif create mode 100755 jawstats/themes/default/os/linux.gif create mode 100755 jawstats/themes/default/os/mac.gif create mode 100755 jawstats/themes/default/os/otheros.gif create mode 100755 jawstats/themes/default/os/psp.gif create mode 100755 jawstats/themes/default/os/sun.gif create mode 100755 jawstats/themes/default/os/symbian.gif create mode 100755 jawstats/themes/default/os/unknown.gif create mode 100755 jawstats/themes/default/os/win.gif create mode 100755 jawstats/themes/default/paging/first.gif create mode 100755 jawstats/themes/default/paging/first_off.gif create mode 100755 jawstats/themes/default/paging/first_on.gif create mode 100755 jawstats/themes/default/paging/last.gif create mode 100755 jawstats/themes/default/paging/last_off.gif create mode 100755 jawstats/themes/default/paging/last_on.gif create mode 100755 jawstats/themes/default/paging/next.gif create mode 100755 jawstats/themes/default/paging/next_off.gif create mode 100755 jawstats/themes/default/paging/next_on.gif create mode 100755 jawstats/themes/default/paging/prev.gif create mode 100755 jawstats/themes/default/paging/prev_off.gif create mode 100755 jawstats/themes/default/paging/prev_on.gif create mode 100755 jawstats/themes/default/searchengines/alexa.gif create mode 100755 jawstats/themes/default/searchengines/alice.gif create mode 100755 jawstats/themes/default/searchengines/alltheweb.gif create mode 100755 jawstats/themes/default/searchengines/altavista.gif create mode 100755 jawstats/themes/default/searchengines/aol.gif create mode 100755 jawstats/themes/default/searchengines/ask.gif create mode 100755 jawstats/themes/default/searchengines/avantfind.gif create mode 100755 jawstats/themes/default/searchengines/blingo.gif create mode 100755 jawstats/themes/default/searchengines/bluewin.gif create mode 100755 jawstats/themes/default/searchengines/clusty.gif create mode 100755 jawstats/themes/default/searchengines/delicious.gif create mode 100755 jawstats/themes/default/searchengines/dogpile.gif create mode 100755 jawstats/themes/default/searchengines/earthlink.gif create mode 100755 jawstats/themes/default/searchengines/eniro.gif create mode 100755 jawstats/themes/default/searchengines/excite.gif create mode 100755 jawstats/themes/default/searchengines/goodsearch.gif create mode 100755 jawstats/themes/default/searchengines/google.gif create mode 100755 jawstats/themes/default/searchengines/infospace.gif create mode 100755 jawstats/themes/default/searchengines/kvasir.gif create mode 100755 jawstats/themes/default/searchengines/live.gif create mode 100755 jawstats/themes/default/searchengines/lycos.gif create mode 100755 jawstats/themes/default/searchengines/mamma.gif create mode 100755 jawstats/themes/default/searchengines/msn.gif create mode 100755 jawstats/themes/default/searchengines/mywebsearch.gif create mode 100755 jawstats/themes/default/searchengines/sapo.gif create mode 100755 jawstats/themes/default/searchengines/search.gif create mode 100755 jawstats/themes/default/searchengines/seznam.gif create mode 100755 jawstats/themes/default/searchengines/steadysearch.gif create mode 100755 jawstats/themes/default/searchengines/stumbleupon.gif create mode 100755 jawstats/themes/default/searchengines/tiscali.gif create mode 100755 jawstats/themes/default/searchengines/vivisimo.gif create mode 100755 jawstats/themes/default/searchengines/voila.gif create mode 100755 jawstats/themes/default/searchengines/webcrawler.gif create mode 100755 jawstats/themes/default/searchengines/webde.gif create mode 100755 jawstats/themes/default/searchengines/yahoo.gif create mode 100755 jawstats/themes/default/style.css create mode 100755 jawstats/themes/default/style.js create mode 100755 jawstats/xml_history.php create mode 100755 jawstats/xml_pages.php create mode 100755 jawstats/xml_stats.php create mode 100755 jawstats/xml_update.php diff --git a/awstatstotals/awstats.php b/awstatstotals/awstats.php new file mode 100755 index 0000000..f9dd72a --- /dev/null +++ b/awstatstotals/awstats.php @@ -0,0 +1,71 @@ + + * @copyright 2004-2007 Telartis BV + * @version 1.1 + * + * @link http://www.telartis.nl/xcms/awstats + * + * Changelog: + * 1.0 initial version + * 1.1 changed month param pattern + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * The location of the AWStats script. + */ +$AWStatsFile = '/usr/lib/cgi-bin/awstats.pl'; + + +function addparam($name, $pattern, $allways = false) { + $result = $allways ? ' -'.$name : ''; + if (isset($_GET[$name])) { + if (preg_match($pattern, $_GET[$name])) { + $result .= ($allways ? '' : ' -'.$name).'='.$_GET[$name]; + } + } + return $result; +} + + +$param = addparam('config', '/^[-\.a-z0-9]+$/i'); +if (!$param) die("config parameter not set!"); + +$param .= addparam('output', '/^[a-z0-9]+$/', true); +$param .= addparam('year', '/^\d{4}$/'); +$param .= addparam('month', '/(\d{1,2}|all)/'); +$param .= addparam('lang', '/^[a-z]{2}$/'); + +$pattern = '/^[^;:,`| ]+$/'; +$param .= addparam('hostfilter', $pattern); +$param .= addparam('hostfilterex', $pattern); +$param .= addparam('urlfilter', $pattern); +$param .= addparam('urlfilterex', $pattern); +$param .= addparam('refererpagesfilter', $pattern); +$param .= addparam('refererpagesfilterex', $pattern); +$param .= addparam('filterrawlog', $pattern); + + +passthru('perl '.$AWStatsFile.$param); + +?> diff --git a/awstatstotals/awstatstotals.php b/awstatstotals/awstatstotals.php new file mode 100755 index 0000000..78c1ffa --- /dev/null +++ b/awstatstotals/awstatstotals.php @@ -0,0 +1,442 @@ + + * @copyright 2004-2009 Telartis BV + * @version 1.17 + * + * @link http://www.telartis.nl/xcms/awstats + * + * Changelog: + * 1.0 initial version + * 1.1 use awstats language files to set your language + * 1.2 register_globals setting can be off + * 1.3 display yearly totals and last entry (Marco Gruber) + * 1.4 use english messages when no language files found + * 1.5 error_reporting setting can be E_ALL + * 1.6 fixed incorrect unique visitors in year view (ConteZero) + * 1.7 changed number and byte format + * 1.8 added not viewed traffic, changed layout, improved reading of AWStats database + * 1.9 define all variables (Michael Dorn) + * 1.10 added browser language detection (based on work by Andreas Diem) + * 1.11 fixed notice errors when no data file present (Marco Gruber) + * 1.12 recursive reading of awstats data directory + * 1.13 fixed trailing slashes problem with directories + * 1.14 fixed errors when some dirs or files were not found (Reported by Sam Evans) + * 1.15 added security checks for input parameters (Elliot Kendall) + * 1.16 fixed month parameter 'all' to show stats in awstats + * 1.17 fixed small problem with open_basedir (Fred Peeterman) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +/******************************************************* + * SETUP SECTION + *******************************************************/ + +/** + * Set this value to the directory where AWStats + * saves its database and working files into. + */ +$DirData = '/var/lib/awstats'; + +/** + * The URL of the AWStats script. + */ +$AWStatsURL = '/cgi-bin/awstats.pl'; +#$AWStatsURL = 'awstats.php'; + +/** + * Set your language. + * Possible value: + * Albanian=al, Bosnian=ba, Bulgarian=bg, Catalan=ca, + * Chinese (Taiwan)=tw, Chinese (Simpliefied)=cn, Czech=cz, Danish=dk, + * Dutch=nl, English=en, Estonian=et, Euskara=eu, Finnish=fi, + * French=fr, Galician=gl, German=de, Greek=gr, Hebrew=he, Hungarian=hu, + * Icelandic=is, Indonesian=id, Italian=it, Japanese=jp, Korean=kr, + * Latvian=lv, Norwegian (Nynorsk)=nn, Norwegian (Bokmal)=nb, Polish=pl, + * Portuguese=pt, Portuguese (Brazilian)=br, Romanian=ro, Russian=ru, + * Serbian=sr, Slovak=sk, Spanish=es, Swedish=se, Turkish=tr, Ukrainian=ua, + * Welsh=wlk. + * First available language accepted by browser=auto + */ +$Lang = 'auto'; + +/** + * Set the location of language files. + */ +$DirLang = '/usr/share/awstats/lang'; + +/** + * How to display not viewed traffic + * Possible value: ignore, columns, sum + */ +$NotViewed = 'sum'; + +/** + * How to sort. + * Possible value: + * config, unique, visits, pages, hits, bandwidth, + * not_viewed_pages, not_viewed_hits, not_viewed_bandwidth + */ +$sort_default = 'bandwidth'; + +/** + * Set number format. + */ +$dec_point = '.'; +$thousands_sep = ' '; + +/** + * Config names to filter. Shows all if empty array. + */ +$FilterConfigs = array(); + +/* +To read website configs from database, do something like: +$sql = 'SELECT config FROM users WHERE (user=...)'; +$rs = mysql_query($sql); +if ($rs) while ($row = mysql_fetch_array($rs)) + $FilterConfigs[] = $row['config']; +*/ + +/******************************************************* + * PROGRAM SECTION + *******************************************************/ + +if (isset($_GET['sort'])) $sort = preg_replace('/[^_a-z]/', '', $_GET['sort']); else $sort = $sort_default; +if (isset($_GET['year'])) $year = (int)$_GET['year']; else $year = date('Y'); +if (isset($_GET['month'])) $month = (int)$_GET['month']; else $month = date('n'); +if (!$month) $month = 'all'; + +function get_config($file) { + $r = ''; + if (preg_match('/awstats\d{6}\.(.+)\.txt/', $file, $match)) $r = $match[1]; + return $r; +} + +function read_history($file) { + $config = get_config($file); + + $s = ''; + $f = fopen($file, 'r'); + while (!feof($f)) { + $line = fgets($f, 4096); + $s .= $line; + if (trim($line) == 'END_TIME') break; + } + fclose($f); + + $visits_total = 0; $unique_total = 0; $pages_total = 0; $hits_total = 0; $bandwidth_total = 0; + $not_viewed_pages_total = 0; $not_viewed_hits_total = 0; $not_viewed_bandwidth_total = 0; + + if (preg_match('/TotalVisits (\d+)/', $s, $match)) $visits_total = (int)$match[1]; + if (preg_match('/TotalUnique (\d+)/', $s, $match)) $unique_total = (int)$match[1]; + + if (preg_match('/\nBEGIN_TIME \d+\n(.*)\nEND_TIME\n/s', $s, $match)) { + foreach (explode("\n", $match[1]) as $row) { + list($hour, $pages, $hits, $bandwidth, + $not_viewed_pages, $not_viewed_hits, $not_viewed_bandwidth) = explode(' ', $row); + $pages_total += $pages; $hits_total += $hits; $bandwidth_total += $bandwidth; + $not_viewed_pages_total += $not_viewed_pages; + $not_viewed_hits_total += $not_viewed_hits; + $not_viewed_bandwidth_total += $not_viewed_bandwidth; + } + } + + return array('config'=>$config, 'visits'=>$visits_total, 'unique'=>$unique_total, + 'pages'=>$pages_total, 'hits'=>$hits_total, 'bandwidth'=>$bandwidth_total, + 'not_viewed_pages'=>$not_viewed_pages_total, + 'not_viewed_hits'=>$not_viewed_hits_total, + 'not_viewed_bandwidth'=>$not_viewed_bandwidth_total); +} + +function parse_dir($dir) { + // add a trailing slash if it doesn't exist: + if (substr($dir, -1) != '/') $dir .= '/'; + $files = array(); + if ($dh = @opendir($dir)) { + while (($file = readdir($dh)) !== false) { + if (!preg_match('/^\./s', $file)) { + if (is_dir($dir.$file)) { + $newdir = $dir.$file.'/'; + chdir($newdir); + $files = array_merge($files, parse_dir($newdir)); + } else { + $files[] = $dir.$file; + } + } + } + chdir($dir); + } + return $files; +} + +if (!is_dir($DirData)) die("Could not open directory $DirData"); + +$dirfiles = parse_dir($DirData); + +$files = array(); +$config = array(); +if ($month == 'all') $pat = '\d{2}'; else $pat = substr('0'.$month, -2); +$pat = '/awstats'.$pat.$year.'\.(.+)\.txt$/'; +foreach ($dirfiles as $file) if (preg_match($pat, $file, $match)) { + $config = $match[1]; + if (!$FilterConfigs || in_array($config, $FilterConfigs)) { + $configs[] = $config; + $files[] = $file; + } +} + +$visits_total = 0; $unique_total = 0; $pages_total = 0; $hits_total = 0; $bandwidth_total = 0; +$not_viewed_pages_total = 0; $not_viewed_hits_total = 0; $not_viewed_bandwidth_total = 0; + +$rows = array(); +if ($files) { + array_multisort($configs, $files); + $row_prev = array(); + for ($i = 0, $cnt = count($files); $i <= $cnt; $i++) { + $row = array(); + if ($i < $cnt) { + $row = read_history($files[$i]); + + if ($NotViewed == 'sum') { + $row['pages'] += $row['not_viewed_pages']; + $row['hits'] += $row['not_viewed_hits']; + $row['bandwidth'] += $row['not_viewed_bandwidth']; + } + + $visits_total += $row['visits']; + $unique_total += $row['unique']; + $pages_total += $row['pages']; + $hits_total += $row['hits']; + $bandwidth_total += $row['bandwidth']; + + if ($NotViewed == 'columns') { + $not_viewed_pages_total += $row['not_viewed_pages']; + $not_viewed_hits_total += $row['not_viewed_hits']; + $not_viewed_bandwidth_total += $row['not_viewed_bandwidth']; + } + } + if ( isset($row['config']) && isset($row_prev['config']) && + ($row['config'] == $row_prev['config']) ) { + + $row['visits'] += $row_prev['visits']; + $row['unique'] += $row_prev['unique']; + $row['pages'] += $row_prev['pages']; + $row['hits'] += $row_prev['hits']; + $row['bandwidth'] += $row_prev['bandwidth']; + + if ($NotViewed == 'columns') { + $row['not_viewed_pages'] += $row_prev['not_viewed_pages']; + $row['not_viewed_hits'] += $row_prev['not_viewed_hits']; + $row['not_viewed_bandwidth'] += $row_prev['not_viewed_bandwidth']; + } + + } elseif ($i > 0) $rows[] = $row_prev; + $row_prev = $row; + } +} + +function multisort(&$array, $key) { + $cmp = create_function('$a, $b', + 'if ($a["'.$key.'"] == $b["'.$key.'"]) return 0;'. + 'return ($a["'.$key.'"] > $b["'.$key.'"]) ? -1 : 1;'); + usort($array, $cmp); +} + +if ($sort == 'config') sort($rows); else multisort($rows, $sort); + +function detect_language($DirLang) { + $Lang = ''; + foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $Lang) { + $Lang = strtolower(trim(substr($Lang, 0, 2))); + if (is_dir("$DirLang/awstats-$Lang.txt")) break; else $Lang = ''; + } + if (!$Lang) $Lang = 'en'; + return $Lang; +} + +function read_language_data($file) { + $r = array(); + if (file_exists($file)) $lines = file($file); + if ($lines) foreach ($lines as $line) + if (preg_match('/^message(\d+)=(.*)$/', $line, $match)) + $r[$match[1]] = $match[2]; + return $r; +} + +// remove trailing slash if there is one: +if (substr($DirLang, -1) == '/') $DirLang = substr($DirLang, 0, strlen($DirLang) - 1); + +if ($Lang == 'auto') $Lang = detect_language($DirLang); + +$message = read_language_data("$DirLang/awstats-$Lang.txt"); + +if (!$message) { + $message[7] = 'Statistics for'; + $message[10] = 'Number of visits'; + $message[11] = 'Unique visitors'; + $message[56] = 'Pages'; + $message[57] = 'Hits'; + $message[60] = 'Jan'; + $message[61] = 'Feb'; + $message[62] = 'Mar'; + $message[63] = 'Apr'; + $message[64] = 'May'; + $message[65] = 'Jun'; + $message[66] = 'Jul'; + $message[67] = 'Aug'; + $message[68] = 'Sep'; + $message[69] = 'Oct'; + $message[70] = 'Nov'; + $message[71] = 'Dec'; + $message[75] = 'Bandwidth'; + $message[102] = 'Total'; + $message[115] = 'OK'; + $message[133] = 'Reported period'; + $message[160] = 'Viewed traffic'; + $message[161] = 'Not viewed traffic'; +} + +function byte_format($number, $decimals = 2) { + global $dec_point, $thousands_sep; + // kilo, mega, giga, tera, peta, exa, zetta, yotta + $prefix_arr = array('','k','M','G','T','P','E','Z','Y'); + $i = 0; + if ($number == 0) $result = 0; else { + $value = round($number, $decimals); + while ($value > 1024) { $value /= 1024; $i++; } + $result = number_format($value, $decimals, $dec_point, $thousands_sep); + } + $result .= ' '.$prefix_arr[$i].'B'; if (!$i) $result .= 'ytes'; + return $result; +} + +function num_format($number, $decimals = 0) { + global $dec_point, $thousands_sep; + return number_format($number, $decimals, $dec_point, $thousands_sep); +} + + +/******************************************************* + * HTML SECTION + *******************************************************/ + +?> + + + +AWStats Totals + + + + +
+ + +
+ + + + +
: +'."\n"; +for ($i = 1; $i <= 12; $i++) { + echo '
+
+
+ + + + + + +
  + + +
  + + + + + + + + + +'.$row['config'].''.num_format($row['unique']). + ''.num_format($row['visits']).''.num_format($row['pages']). + ''.num_format($row['hits']).''.byte_format($row['bandwidth']); + if ($NotViewed == 'columns') echo ''.num_format($row['not_viewed_pages']). + ''.num_format($row['not_viewed_hits']). + ''.byte_format($row['not_viewed_bandwidth']); + echo "\n"; +} +echo '
 Total'.num_format($unique_total). + ''.num_format($visits_total).''.num_format($pages_total). + ''.num_format($hits_total).''.byte_format($bandwidth_total); +if ($NotViewed == 'columns') echo ''.num_format($not_viewed_pages_total). + ''.num_format($not_viewed_hits_total). + ''.byte_format($not_viewed_bandwidth_total); +echo "\n"; +?> +
+ +

AWStats Totals 1.17 - © 2004-2009 Telartis BV


+ + + diff --git a/betterawstats/bawstats.info b/betterawstats/bawstats.info new file mode 100644 index 0000000..1dba338 --- /dev/null +++ b/betterawstats/bawstats.info @@ -0,0 +1,5 @@ +; $Id $ +name = BAWstats +description = Based on betterAWstats and the AWstats web statistics tools. +version = "6.x-1.1-beta" +core = 6.x diff --git a/betterawstats/bawstats.install b/betterawstats/bawstats.install new file mode 100644 index 0000000..9239733 --- /dev/null +++ b/betterawstats/bawstats.install @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/betterawstats/bawstats.module b/betterawstats/bawstats.module new file mode 100644 index 0000000..5ccb24a --- /dev/null +++ b/betterawstats/bawstats.module @@ -0,0 +1,167 @@ +'. t('BAWstats is a drupal interface to "BetterAWstats" by Oliver Spiesshofer. If you run AWstats or have AWstats data, BAWstats can provide a drupal view of the statistics data. The data itself does not need to be in web accessible space, although it must be readable by php (i.e. within the openbasedir setting).') .'

'; + $output .= '

'. t('By default this module only shows statistics for a single site. Which site this is, is not configurable within the module. This is done to prevent administrative users on one site viewing another sites data (the AWstats data directory can hold multiple site data). BAWstats tries to guess the AWstats site name from the drupal site name, but if the guess is wrong it can be set within the settings.php file using the $conf[\'bawstats_defsite\'] variable. For example, $conf[\'bawstats_defsite\'] = \'equivocation.org\'; will generate site statistics from the AWStats data files for the site equivocation.org.') .'

'; + $output .= '

'. t('It is possible to view all the site statistics found in the AWstats data directory. By setting $conf[\'bawstats_admin_access\'] = 1; in the settings.php file, access to the statistics for all the sites available is given.') .'

'; + $output .= '

'. t('As this module only provides a drupal interface into the non-drupal "Better AWstats" code, limited configuration is available through drupal. Fine configuration of the statistics views may be achieved by editing the Better AWstats config.php file.') .'

'; + break; + case 'admin/settings/bawstats': + $output .= '

'. t('BAWstats is based on "BetterAWstats" by Oliver Spiesshofer. This module displays AWstats data within drupal. The location of the AWstats data and the location of auxiliary AWstats libraries can be configured below.') .'

'; + $output .= '

'. t('Note, it may be considered important that the AWstats data and library locations reside outside of web file space. This would remove direct access to the data with the only access through AWstats itself (if it is running as a CGI) and/or through this drupal module.') .'

'; + $output .= '

'. t('Once the AWstats locations are correctly configured, site statistics can be viewed under the admin reports') . ' (/admin/reports/bawstats).

'; + + } + return $output; +} + +/** + * Implementation of hook_perm(). + */ +function bawstats_perm() { + return array('view site statistics','statistics admin'); +} + +/** + * Implementation of hook_init() + * This hook is run at the beginning of the page request. When this hook + * is called, all modules are already loaded in memory. Here used to + * setup CSS + */ + +function bawstats_init() { + drupal_add_css(drupal_get_path('module', 'bawstats') .'/includes/bawstats.css'); +} + +/** + * Implementation of hook_menu(). + */ + +function bawstats_menu() { + $items = array(); + $includes_path = drupal_get_path('module', 'bawstats') . '/includes'; + + $items['admin/settings/bawstats'] = array( + 'title' => 'BAW Statistics', + 'description' => 'Configure site statistics.', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('bawstats_admin_settings'), + 'file' => 'bawstats.admin.inc', + 'file path' => $includes_path, + 'access arguments' => array('statistics admin'), + ); + + $items['admin/reports/bawstats'] = array( + 'title' => 'View Site Statistics', + 'description' => t('View AWStats web statistics.'), + 'page callback' => 'bawstats_view_theform', + 'page arguments' => array(), + 'file' => 'bawstats.stats.inc', + 'file path' => $includes_path, + 'weight' => 1, + 'access arguments' => array('view site statistics'), + ); + + $items['admin/reports/bawstats/all/%/%'] = array( + 'title' => 'View Site Statistics', + 'type' => MENU_CALLBACK, + 'page callback' => 'bawstats_view_theform', + 'page arguments' => array(4,5), + 'file' => 'bawstats.stats.inc', + 'file path' => $includes_path, + 'weight' => 1, + 'access arguments' => array('view site statistics'), + ); + + // create the sub group menues if requested + if (variable_get('bawstats_page_view',0)>0) { + $statgroups = variable_get('bawstats_groups',array()); + if (count($statgroups)>0) { + $pri = 1; + foreach ($statgroups as $group => $group_details) { + if ($pri==1) { + $items['admin/reports/bawstats/'.$group.'/%/%'] = array( + 'title' => 'View Site Statistics', + 'type' => MENU_CALLBACK, + 'page callback' => 'bawstats_view_theform', + 'page arguments' => array(4,5,$group), + 'file' => 'bawstats.stats.inc', + 'file path' => $includes_path, + 'weight' => $pri, + 'access arguments' => array('view site statistics') + ); + } else { + $items['admin/reports/bawstats/'.$group] = array( + 'title' => $group_details, + 'type' => MENU_NORMAL_ITEM, + 'page callback' => 'bawstats_set_section', + 'page arguments' => array($group), + 'file' => 'bawstats.stats.inc', + 'file path' => $includes_path, + 'weight' => $pri, + 'access arguments' => array('view site statistics') + ); + $items['admin/reports/bawstats/'.$group.'/%/%'] = array( + 'title' => $group_details, + 'type' => MENU_CALLBACK, + 'page callback' => 'bawstats_view_theform', + 'page arguments' => array(4,5,$group), + 'file' => 'bawstats.stats.inc', + 'file path' => $includes_path, + 'weight' => $pri, + 'access arguments' => array('view site statistics') + ); + } + $pri += 1; + } + } + } + + // the "other" more specific things we don't have menus for! + $items['admin/reports/bawstats/details/%/%/%'] = array( + 'title' => $group_details, + 'type' => MENU_CALLBACK, + 'page callback' => 'bawstats_view_theform', + 'page arguments' => array(5,6,4), + 'file' => 'bawstats.stats.inc', + 'file path' => $includes_path, + 'weight' => $pri, + 'access arguments' => array('view site statistics') + ); + + return $items; +} diff --git a/betterawstats/config.php b/betterawstats/config.php new file mode 100644 index 0000000..e0a1cda --- /dev/null +++ b/betterawstats/config.php @@ -0,0 +1,798 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// this file can't be used on its own - do not change these 3 lines +if (strpos ($_SERVER['PHP_SELF'], 'config.php') !== false) { + die ('This file can not be used on its own!'); +} +// ATTENTION: BetterAWstats has an online config editor that you can use +// instead of editing this file here. The link is on the bottom of the menu! +// To use it, set $BAW_CONF['online_config']= true; and make sure that the +// file is writable by the server, AND protectthe BetterAWStats installation +// by a .htaccess file! + +//*********************************************************/ +//* SITE SETTINGS +//*********************************************************/ +ini_set("memory_limit","1G"); +set_time_limit(60*3); +$BAW_MES['e'] = 'iso-8859-1'; +// NAME: Script URL +// INFO: The url of BetterAWstats' directory, No trailing slash +// DEFAULT: 'http://awstats.local' +$BAW_CONF['site_url'] = 'http://'.$_SERVER['HTTP_HOST'].'/betterawstats'; + +// NAME: Script path +// INFO: The path of BetterAWstats, No trailing slash +// DEFAULT: '/path/to/betterawstats/' +$BAW_CONF['site_path'] = $_SERVER['DOCUMENT_ROOT'].'/betterawstats'; + +// NAME: Path to AWStats Data +// INFO: Set this value to the directory where AWStats saves its database +// files into. ATTENTION: If you read those files on windows but have +// them created on linux or the other way round, make sure you transfer +// them 'BINARY'. Otherwise they cannot be read properly. No trailing +// slash +// DEFAULT: '/path/to/betterawstats/awstats/data' +$BAW_CONF['path_data'] = '/var/lib/awstats'; + +// NAME: Path to AWStats Libraries +// INFO: Set this value to the directory where AWStats saves its library +// files into. No trailing slash +// DEFAULT: '/path/to/betterawstats/awstats/lib' +$BAW_CONF['path_lib'] = '/usr/share/awstats/lib'; + +// NAME: Path to AWStats Language files +// INFO: Set this value to the directory where AWStats saves its language +// files into. No trailing slash +// DEFAULT: '/path/to/betterawstats/awstats/lang' +$BAW_CONF['path_lang'] = '/usr/share/awstats/lang'; + +// NAME: URL to AWStats Icons +// INFO: The url to the awstats icons, should include the whole http://..., +// no trailing slash. +// DEFAULT: 'http://awstats.local/awstats/icon' +#$BAW_CONF['icons_url'] = $BAW_CONF['site_url'].'/icons'; +$BAW_CONF['icons_url'] = 'http://'.$_SERVER['HTTP_HOST'].'/icon'; + +// NAME: Web Configuration +// INFO: Enable the online configuration editor? WARNING: Your config.php has +// to be writable in order to enable this. This is a BAD idea to use +// unless the folder is password-protected with a .htaccess file or +// similar. +// DEFAULT: true +// POSSIBLE VALUES: true, false +$BAW_CONF['online_config'] = false; + +// NAME: Change configuration password? +// INFO: This password is needed to access the online configuration. It has +// to be longer than 5 letters. +// DEFAULT: '' +$BAW_CONF['online_config_password'] = ''; + +// NAME: Limit to server? +// INFO: Set this to a simgle server that you want to limit or "false" to +// show all. The server name should be the one used for awstats. +// DEFAULT: 'show_all' +// POSSIBLE VALUES: 'sitename.org', 'show_all' +$BAW_CONF['limit_server'] = 'show_all'; + + + +//*********************************************************/ +//* LAYOUT SETTINGS +//*********************************************************/ + +// NAME: Layout Type +// INFO: Display page in vertical or horizontal layout? +// DEFAULT: 'vertical' +// POSSIBLE VALUES: 'vertical', 'horizontal' +$BAW_CONF['layout_type'] = 'vertical'; + +// NAME: Language +// INFO: Set your language. Set to "auto" to autodetect from browser +// DEFAULT: 'auto' +// POSSIBLE VALUES: 'auto', 'al', 'ba', 'bg', 'ca', 'tw', 'cn', 'cz', 'dk', 'nl', +// 'en', 'et', 'eu', 'fi', 'fr', 'gl', 'de', 'gr', 'he', 'hu', +// 'is', 'id', 'it', 'jp', 'kr', 'lv', 'nn', 'nb', 'pl', 'pt', +// 'br', 'ro', 'ru', 'sr', 'sk', 'es', 'se', 'tr', 'ua', 'wlk' +$BAW_CONF['lang_setting'] = 'auto'; + +// NAME: Decimal Point +// INFO: Decimal Point Character (99.9) +// DEFAULT: '.' +$BAW_CONF['dec_point'] = '.'; + +// NAME: Thousands separator +// INFO: Thousand Digit separator (1'000) +// DEFAULT: "'" +$BAW_CONF['tho_point'] = "'"; + +// NAME: Date format (2007-31-12) +// INFO: How should a date look like? For formatting, please consult +// http://php.net/manual/en/function.date.php +// DEFAULT: 'Y-M-d' +$BAW_CONF['date_format'] = 'Y-M-d'; + +// NAME: Date & Time format (2007-31-12 23:59) +// INFO: How should a date & time look like? For formatting,please consult +// http://php.net/manual/en/function.date.php +// DEFAULT: 'Y-M-d H:i' +$BAW_CONF['date_time_format'] = 'Y-M-d - H:i'; + +// NAME: Percentage decimals +// INFO: How many decimals for percentage value? (99.9%) +// DEFAULT: '1' +$BAW_CONF['percent_decimals'] = '1'; + +// NAME: Hide Empty data +// INFO: Completely hide graphs with zero entries? (The menu will also be +// hidden) +// DEFAULT: true +// POSSIBLE VALUES: true, false +$BAW_CONF['hideempty'] = true; + +// NAME: Submit dropdowns on change +// INFO: If enabled, the site/date dropdowns do not have an "OK"-button. The +// page is refreshed as soon as you choose a new value. Not recommended +// for large sites. +// DEFAULT: true +// POSSIBLE VALUES: true, false +$BAW_CONF['auto_submit_form'] = true; + + + +//*********************************************************/ +//* TABLE SETTINGS +//*********************************************************/ + +// NAME: First day of the week +// INFO: Should Sunday be the first day of the week or monday? +// DEFAULT: '1' +// POSSIBLE VALUES: '1', '2' +$BAW_CONF['firstdayofweek'] = '1'; + +// NAME: Field Length +// INFO: What is the max. text length of table fields? (Applies only to +// links) +// DEFAULT: '65' +$BAW_CONF['field_length'] = '50'; + +// NAME: Max. Table Lines +// INFO: What is the max. no. of lines a table can have? Set to "false" to +// disable. If a table reaches this number of lines, The rest is +// summarized into one line. This also applies to the "full list" view +// of a table +// DEFAULT: '10000' +$BAW_CONF['maxlines'] = '10000'; + + + +//*********************************************************/ +//* CHART SETTINGS +//*********************************************************/ + +// NAME: Max scale for Visitors +// INFO: The maximum value of the chosen option will define the maximum +// height of the Visitors bars in the chart +// DEFAULT: 'layout_visits' +// POSSIBLE VALUES: 'layout_visitos', 'layout_visits', 'layout_pages', +// 'layout_hits', 'layout_bytes' +$BAW_CONF['max_visitors'] = 'layout_visits'; + +// NAME: Max scale for Visits +// INFO: The maximum value of the chosen option will define the maximum +// height of the Visits bars in the chart +// DEFAULT: 'layout_visits' +// POSSIBLE VALUES: 'layout_visits', 'layout_pages', 'layout_hits', 'layout_bytes' +$BAW_CONF['max_visits'] = 'layout_visits'; + +// NAME: Max scale for Pages +// INFO: The maximum value of the chosen option will define the maximum +// height of the Pages bars in the chart +// DEFAULT: 'layout_pages' +// POSSIBLE VALUES: 'layout_pages', 'layout_hits', 'layout_bytes' +$BAW_CONF['max_pages'] = 'layout_pages'; + +// NAME: Max scale for Hits +// INFO: The maximum value of the chosen option will define the maximum +// height of the Hits bars in the chart +// DEFAULT: 'layout_hits' +// POSSIBLE VALUES: 'layout_hits', 'layout_bytes' +$BAW_CONF['max_hits'] = 'layout_hits'; + +// NAME: Max no of chart rows +// INFO: When displaying the charts with the full lists, How many items can +// there be displayed? The rest will sum up into "Others". This is done +// to prevent too wide charts +// DEFAULT: '50' +$BAW_CONF['max_chart_items'] = '30'; + +// NAME: Chart Titles? +// INFO: If enabled, it will show a title on top of each chart. +// DEFAULT: true +// POSSIBLE VALUES: true, false +$BAW_CONF['chart_titles'] = false; + + + +//*********************************************************/ +//* JPGRAPH SETTINGS +//*********************************************************/ + +// NAME: Enable JPgraph? +// INFO: To use JPGraph, you have to download it from +// http://www.aditus.nu/jpgraph/jpdownload.php. +// DEFAULT: true +// POSSIBLE VALUES: true, false +$BAW_CONF['use_jpgraph'] = false; + +// NAME: Path to JPGraph +// INFO: Where is your JPGraph installation? (The folder where jpgraph.php is +// in. No trailing slash) +// DEFAULT: '/path/to/betterawstats/jpgraph/src' +$BAW_CONF['jpgraph_path'] = '/home/www/izideal/share/jpgraph/src'; + + + +//*********************************************************/ +//* ADVANCED SETTINGS +//*********************************************************/ + +// NAME: XHTML/ HTML +// INFO: Do you want output in HTML or XHTML? +// DEFAULT: true +// POSSIBLE VALUES: true, false +$BAW_CONF['xhtml'] = false; + +// NAME: Debug +// INFO: Do you want to show debug-output (VERY detailed)? +// DEFAULT: true +// POSSIBLE VALUES: true, false +$BAW_CONF['debug'] = false; + +// NAME: Parser Stats +// INFO: Do you want to show log file parsing data below the stats summary? +// DEFAULT: true +// POSSIBLE VALUES: true, false +$BAW_CONF['show_parser_stats'] = true; + +// NAME: Module settings +// INFO: Are you using BetterAWstats as a module for another software? +// (Currently only Drupal is supported) +// DEFAULT: 'none' +// POSSIBLE VALUES: 'none', 'drupal' +$BAW_CONF['module'] = 'none'; + + + +//*********************************************************/ +//* DISPLAY +//*********************************************************/ + +// NAME: Summary +// INFO: General Overview of key figures and dates +$BAW_CONF_DIS['overview'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '1', // Item Sequence +); + +// NAME: Monthly history +// INFO: Monthly data +$BAW_CONF_DIS['months'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '2', // Item Sequence + 'top_x' => '24', // Show how many entries? + 'avg' => true, // Show averages? + 'total' => true, // Show total Sum? + 'chart' => true, // Show HTML chart? + 'table' => true, // Show data table? +); + +// NAME: Days of month +// INFO: Daily data +$BAW_CONF_DIS['days'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '3', // Item Sequence + 'avg' => true, // Show averages? + 'total' => true, // Show total Sum? + 'chart' => true, // Show HTML chart? + 'table' => true, // Show data table? +); + +// NAME: Days of week (Averages) +// INFO: Weekdays +$BAW_CONF_DIS['weekdays'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '4', // Item Sequence + 'avg' => true, // Show averages? + 'total' => false, // Show total Sum? + 'chart' => true, // Show HTML chart? + 'table' => true, // Show data table? +); + +// NAME: Hours (Averages) +// INFO: Hours of the day +$BAW_CONF_DIS['hours'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '5', // Item Sequence + 'avg' => true, // Show averages? + 'total' => false, // Show total Sum? + 'chart' => true, // Show HTML chart? + 'table' => true, // Show data table? + 'sort' => '1', // Sort for which column? Possible values are: + // '1'=Hours, '2'=Pages, '3'=Hits, '4'=Bandwidth + 'sort_dir' => SORT_ASC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Visitors domains/countries +// INFO: Domains of visitors +$BAW_CONF_DIS['domains'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '6', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'chart' => true, // Show HTML chart? + 'table' => true, // Show data table? + 'map' => true, // Show Map Image? + 'top_x' => '10', // Show how many entries? + 'sort' => '0', // Sort for which column? Possible values are: + // 'key'=Visitors domains/countries, '0'=Pages, '1'=Hits, '2'=Bandwidth + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Hosts +// INFO: IP addresses of visitors +$BAW_CONF_DIS['visitors'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '7', // Item Sequence + 'avg' => true, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Hosts, '1'=Pages, '2'=Hits, '3'=Bandwidth, '4'=Ratio(Hits/Pages), + // '5'=Last visit + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending + 'assumebot' => '1', // Hits/pages minimum ratio to assume normal user? +); + +// NAME: Authenticated users +// INFO: Logins for username/password protected pages +$BAW_CONF_DIS['logins'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '8', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '5', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // 'key'=Authenticated users, '0'=Pages, '1'=Hits, '2'=Bandwidth, '3'=Last + // visit + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Robots/Spiders visitors +// INFO: Spiders, Robots of Search engines etc. +$BAW_CONF_DIS['robots'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '9', // Item Sequence + 'avg' => true, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Robots/Spiders visitors, '1'=Hits, '2'=Hits (robots.txt), + // '3'=Bandwidth, '4'=Last visit + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Worms +// INFO: Worms searching for security holes +$BAW_CONF_DIS['worms'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '10', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '2', // Sort for which column? Possible values are: + // '0'=Worms, '1'=Sensitive targets, '2'=Hits, '3'=Bandwidth, '4'=Last visit + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Visits duration +// INFO: How long have people been on the site? +$BAW_CONF_DIS['sessions'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '11', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? +); + +// NAME: File type +// INFO: What filetypes are on the site +$BAW_CONF_DIS['filetype'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '12', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'chart' => true, // Show HTML chart? + 'sort' => '0', // Sort for which column? Possible values are: + // 'key'=File type, '0'=Hits, '1'=Bandwidth, '2'=Compression on, + // '3'=Compression result + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Pages-URL +// INFO: Pages on the site +$BAW_CONF_DIS['urls'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '13', // Item Sequence + 'avg' => true, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Pages-URL, '1'=Viewed, '2'=Average size, '3'=Entry, '4'=Exit + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Files/paths +// INFO: Files/paths on the site +$BAW_CONF_DIS['paths'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '14', // Item Sequence + 'avg' => true, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Files/paths, '1'=Viewed + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Operating Systems +// INFO: Operating system of users +$BAW_CONF_DIS['os'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '15', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? + 'chart' => true, // Show HTML chart? + 'top_x' => '10', // Show how many entries? + 'sort' => '2', // Sort for which column? Possible values are: + // '1'=Operating Systems, '2'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Unknown OS (useragent field) +// INFO: Unknown Operating system +$BAW_CONF_DIS['unknownos'] = array( + 'show' => false, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '17', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '1'=User Agent, '2'=Last visit + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Operating Systems (+Versions) +// INFO: Operating system of users including versions +$BAW_CONF_DIS['osversions'] = array( + 'show' => false, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '16', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? + 'chart' => true, // Show HTML chart? + 'top_x' => '10', // Show how many entries? + 'sort' => '2', // Sort for which column? Possible values are: + // '1'=Operating Systems, '2'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Browsers +// INFO: User Browser Type +$BAW_CONF_DIS['browsers'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '18', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'chart' => true, // Show HTML chart? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '3', // Sort for which column? Possible values are: + // '1'=Browsers, '2'=Grabber, '3'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Browsers (+Versions) +// INFO: User Browser Type (+Versions) +$BAW_CONF_DIS['browserversions'] = array( + 'show' => false, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '19', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? + 'chart' => false, // Show HTML chart? + 'top_x' => '10', // Show how many entries? + 'sort' => '4', // Sort for which column? Possible values are: + // '2'=Browsers, '3'=Grabber, '4'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Unknown browsers (useragent field) +// INFO: Unknown Browsers +$BAW_CONF_DIS['unknownbrowser'] = array( + 'show' => false, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '20', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '1'=User Agent, '2'=Last visit + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Screen sizes +// INFO: Screensizes of users +$BAW_CONF_DIS['screensizes'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '21', // Item Sequence + 'avg' => false, // Show averages? + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? + 'chart' => true, // Show HTML chart? + 'top_x' => '5', // Show how many entries? + 'sort' => '2', // Sort for which column? Possible values are: + // '1'=Screen sizes, '2'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Referring search engines +// INFO: Referrals from search engines +$BAW_CONF_DIS['se_referers'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '22', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Referring search engines, '1'=Pages, '2'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending + 'favicon' => true, // Retrieve favicons for external URLs? +); + +// NAME: Referring sites +// INFO: Referrals from other sites +$BAW_CONF_DIS['referers'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '23', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Referring sites, '1'=Pages, '2'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending + 'favicon' => false, // Retrieve favicons for external URLs? +); + +// NAME: Referring sites by Domains +// INFO: Referrals from other sites, grouped by 2-nd level domains +$BAW_CONF_DIS['referer_domains'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '24', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Referring sites, '1'=Pages, '2'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending + 'favicon' => false, // Retrieve favicons for external URLs? + 'domain_lvls' => '3', // Shorten URL to how many domain levels? (-1 to disable) +); + +// NAME: Hotlinks +// INFO: Pages linking to images/data on your site +$BAW_CONF_DIS['hotlinks'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '25', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Referring sites, '1'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending + 'favicon' => false, // Retrieve favicons for external URLs? +); + +// NAME: Hotlinks by Domains +// INFO: Domains linking to images/data on your site +$BAW_CONF_DIS['hotlink_domains'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '26', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Referring sites, '1'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending + 'favicon' => false, // Retrieve favicons for external URLs? + 'domain_lvls' => '3', // Shorten URL to how many domain levels? (-1 to disable) +); + +// NAME: Search Keyphrases +// INFO: Search phrases +$BAW_CONF_DIS['searchphrases'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '27', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=different keyphrases, '1'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Search Keywords +// INFO: Search words +$BAW_CONF_DIS['searchwords'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '28', // Item Sequence + 'avg' => false, // Show averages? + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=different keywords, '1'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Miscellaneous +// INFO: User system features +$BAW_CONF_DIS['misc'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '29', // Item Sequence + 'table' => true, // Show data table? +); + +// NAME: HTTP Status codes +// INFO: Acesses to pages that returned errors +$BAW_CONF_DIS['errors'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '30', // Item Sequence + 'total' => true, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '2', // Sort for which column? Possible values are: + // '0'=HTTP Status codes, '2'=Hits, '3'=Average size + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Error Hits +// INFO: Required but not found URLs (HTTP code 404) +$BAW_CONF_DIS['errors404'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '31', // Item Sequence + 'table' => true, // Show data table? + 'total' => true, // Show total Sum? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Error Hits, '1'=Hits, '2'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + +// NAME: Color depth +// INFO: Screen colors of users +$BAW_CONF_DIS['extra_1'] = array( + 'show' => true, // Show this Data? + 'collapse' => false, // Collapsed? + 'order' => '32', // Item Sequence + 'total' => false, // Show total Sum? + 'table' => true, // Show data table? + 'top_x' => '10', // Show how many entries? + 'sort' => '1', // Sort for which column? Possible values are: + // '0'=Color depth in bits, '1'=Hits + 'sort_dir' => SORT_DESC, // Sort direction? Possible values are: + // SORT_ASC=Ascending, SORT_DESC=Descending +); + + +?> diff --git a/betterawstats/core/config.inc.php b/betterawstats/core/config.inc.php new file mode 100644 index 0000000..9ebd521 --- /dev/null +++ b/betterawstats/core/config.inc.php @@ -0,0 +1,441 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +/** + * File contents: + * + * This file contains only function related to the online config manager. It handles + * editing & saving the config as well as logging the admin in and out. + */ + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'config_default.php') !== false) { + die ('This file can not be used on its own!'); +} +/* +* Saves the config settings to file +* +*/ +function baw_action_save_config() { + global $BAW_CONF, $BAW_CONF_DEF, $BAW_CONF_DIS_DEF, $BAW_CONF_DIS; + global $BAW_MES, $BAW_CONF_DIS_TYP, $BAW_FILE_HEADER; + @session_start(); + if (!baw_check_user()) { + return baw_site_header() . baw_config_login_form(); + }; + + if (isset($_POST['exit']) && ($_POST['exit'] == $BAW_MES['cfg_exit'])) { + return baw_display_index(); + } + if (isset($_POST['logout']) && ($_POST['logout'] == $BAW_MES['cfg_logout'])) { + baw_logout(); + return baw_display_index(); + } + if (!$BAW_CONF['online_config']) { + return baw_raise_error('configdisabled'); + } + $filename = $BAW_CONF['site_path'].'/config.php'; + if (is_writable($filename)) { + // prepare config for writing + $str = " $sectdata) { + $sect = strtoupper($sect); + $str .= "\r\n\r\n//*********************************************************/\r\n" + . "//* $sect\r\n" + . "//*********************************************************/\r\n\r\n"; + foreach ($sectdata as $setting => $misc) { + if ($misc['type'] !== 'fixed') { + // set standard first + $allowed_values = ''; + $val = $_POST[$setting]; + $default = $misc['default']; + $val_str = "'$val'"; + $default_str = "'$default'"; + // now set the execptions + if ($val == 'true' or $val == 'false') { + $val_str = "$val"; + if ($default == true) { + $default_str = 'true'; + } else { + $default_str = 'false'; + } + $allowed_values = "// POSSIBLE VALUES: true, false\r\n"; + } else if ($val == "'"){ + $val_str = '"\'"'; + } else { + $val_str = "'$val'"; + } + if ($default == "'"){ + $default_str = '"\'"'; + } + + if ($setting == 'limit_server') { // dont print domain names into the config file + $allowed_values = "// POSSIBLE VALUES: 'sitename.org', 'show_all'\r\n";// + } else if ($misc['type'] == 'dropdown' && ($val !== 'true' && $val !== 'false')) { + $allowed_values = implode("', '", array_keys($misc['values'])); + $allowed_values = wordwrap($allowed_values, 60, "\r\n// "); + $allowed_values = "// POSSIBLE VALUES: '$allowed_values'\r\n"; + } else if ($misc['type'] == 'password') { + $val = $_POST[$setting]; + if ($val[0] !== $val[1]) { + echo baw_raise_error('password_match'); + exit; + } else if ($val[0] == '') { // password will not change if empty + $val_str = "'{$BAW_CONF['online_config_password']}'"; + } else if (strlen($val[0]) < 5) { // password too short + echo baw_raise_error('password_short'); + exit; + } else { + $val_str = "'{$val[0]}'"; + } + } + $out_help = wordwrap( + strip_tags(html_entity_decode($misc['help'])), + 68 + , "\r\n// " + ); + $name = html_entity_decode($misc['name']); + $str .= "// {$BAW_MES['cfg_name']} $name\r\n" + . "// {$BAW_MES['cfg_info']} {$out_help}\r\n" + . "// {$BAW_MES['cfg_def']} $default_str\r\n" + . $allowed_values + . "\$BAW_CONF['$setting'] = $val_str;\r\n\r\n"; + } + } + } + $str .= "\r\n\r\n//*********************************************************/\r\n" + . "//* {$BAW_MES['cfg_display']}\r\n" + . "//*********************************************************/\r\n\r\n"; + + foreach ($BAW_CONF_DIS_DEF as $setting => $misc) { + $val_arr = $_POST[$setting]; + $name = html_entity_decode($misc['name']); + $help = html_entity_decode($misc['help']); + $str .= "// {$BAW_MES['cfg_name']} {$name}\r\n" + . "// {$BAW_MES['cfg_info']} {$help}\r\n"; + $this_conf = $BAW_CONF_DIS[$setting]; + $substr =''; + foreach ($this_conf as $name => $oldval) { + $type = $BAW_CONF_DIS_TYP[$name][1]; + $desc = $BAW_CONF_DIS_TYP[$name][0]; + $val = $val_arr[$name]; + if ($type == 'string') { + $val = "'$val'"; + } else if ($type == 'sorting1') { + $desc2 = $BAW_MES['cfg_possible_values'] ."\r\n // "; + foreach ($misc['sorting'] as $key => $value) { + $desc2 .= "'$key'=$value, "; + } + $desc2 = substr($desc2, 0, -2); + $desc2 = wordwrap($desc2, 75, "\r\n // "); + $desc .= $desc2; + $val = "'$val'"; + } else if ($type == 'sorting2') { + $desc .= $BAW_MES['cfg_possible_values'] . "\r\n" + . " // " . $BAW_MES['cfg_type_sort_dir_opts']; + } else { + $val = "$val"; + } + $desc = strip_tags(html_entity_decode($desc)); + $substr .= " '$name' => $val, // $desc\r\n"; + } + $str .= "\$BAW_CONF_DIS['$setting'] = array(\r\n$substr);\r\n\r\n"; + } + $str .= "\r\n?>"; + if (!$handle = fopen($filename, 'w+')) { + return baw_raise_error('configread'); + } + if (fwrite($handle, $str) === FALSE) { + return baw_raise_error('configwrite'); + } + + $out = $BAW_MES['cfg_saved']; + $out = baw_site_header() . "

BetterAWstats

$out
"; + fclose($handle); + } else { + $out = baw_site_header() . baw_raise_error('configwrite'); + } + return $out; +} + +/* +* Shows the login form +* +*/ +function baw_config_login_form(){ + global $BAW_MES, $BAW_CONF; + $out = "
\n" + ."

" + . $BAW_MES['require_password'] . "". "" + . " " + . " " + . "\n" + . "\n" + ."

" + . "
"; + return $out; +} + +/* +* Checks the password and logs the user in if OK +* +*/ +function baw_action_do_login() { + global $BAW_CONF, $BAW_MES; + if (isset($_POST['exit']) && ($_POST['exit'] == $BAW_MES['cfg_exit'])) { + return baw_display_index(); + } + if (isset($_POST['password'])) { + if ($_POST['password'] == $BAW_CONF['online_config_password']) { + session_start(); + $_SESSION['loggedin'] = true; + $_SESSION['password'] = MD5($_POST['password']); + $out = baw_action_config_editor(); + } else { + $out = baw_site_header() + . baw_raise_error('password_incorrect') + . baw_config_login_form(); + } + } else { + $out = baw_site_header() + . baw_config_login_form(); + } + echo $out; +} + +/* +* Check if the user is logged in and if the password has changed +* +*/ +function baw_check_user() { + global $BAW_CONF; + if (isset($_SESSION['loggedin']) && + $_SESSION['loggedin'] == true && + isset ($_SESSION['password']) && + strlen($BAW_CONF['online_config_password']) > 5 && + $_SESSION['password'] == MD5($BAW_CONF['online_config_password'])) { + return true; + } + if (strlen($BAW_CONF['online_config_password']) <= 5) { + echo "The password has to be longer than 5 letters!"; + } + return false; +} + +/* +* This logs the user out and displays the index. +* +*/ +function baw_action_do_logout() { + baw_logout(); + echo baw_display_index(); +} + +/* +* This logs the user out physically. +* +*/ +function baw_logout() { + @session_start(); + $_SESSION = array(); + if (isset($_COOKIE[session_name()])) { + setcookie(session_name(), '', time()-42000, '/'); + } + @session_destroy(); +} + +/* +* Displays the config editor. +* +*/ +function baw_action_config_editor() { + global $BAW_CONF, $BAW_CONF_DEF, $BAW_CONF_DIS_DEF, $BAW_CONF_DIS; + global $BAW_MES, $BAW_CONF_DIS_TYP, $BAW_DFILES; + if (!$BAW_CONF['online_config']) { + return baw_raise_error('configdisabled'); + } + @session_start(); + if(!baw_check_user()) { + return baw_site_header() . baw_config_login_form(); + }; + $top = baw_site_header(); + $top .= "\n
\n" + . "
\n" + . " \n"; + $submit = "
\n \n" + . " \n" + . " \n" + . " \n" + . "
\n"; + $i = 0; + $out = ''; + $section_count = count($BAW_CONF_DEF) + 1; + foreach ($BAW_CONF_DEF as $section => $set_arr) { + $out .= "\n\n"; + if ($i >0) { + $top .= "
$section
\n"; + $out .= "
\n"; + } else { + $top .= "
$section
\n"; + $out .= "
\n"; + } + foreach ($set_arr as $cfgname => $cfgdata) { + $default = $cfgdata['default']; + if (isset($BAW_CONF[$cfgname])) { + $val = $BAW_CONF[$cfgname]; + } else { + $val = $BAW_CONF_DEF[$section][$cfgname]['default']; + } + if ($cfgdata['type'] == 'fixed') { + $input = $val; + } else if ($cfgdata['type'] == 'string') { + $input = ""; + } else if ($cfgdata['type'] == 'password') { + $input = "" + . $BAW_MES['confirm_password'] + . ""; + } else if ($cfgdata['type'] == 'dropdown') { + $input = baw_generic_dropdown($cfgname, $cfgdata['values'],$val); + $default = $cfgdata['values'][$cfgdata['default']]; + } else if ($cfgdata['type'] == 'server_select') { + $input = baw_generic_dropdown($cfgname, $servers_arr, $BAW_DFILES['cfg_server_drop']); + } + $out .= "

{$cfgdata['name']}

\n" + . $cfgdata['help'] . "
" + . "$cfgname = $input" + . "
(Default: \"$default\")\n" + . "
\n"; + } + $out .= "
\n"; + $i++; + + } + $top .= "
{$BAW_MES['cfg_display2']}
\n"; + $out .= "\n\n"; + $out .= "
\n"; + $BAW_CONF_DIS = baw_array_sorting($BAW_CONF_DIS, 'order', SORT_ASC); + foreach ($BAW_CONF_DIS as $cfgname => $cfgdata) { + $input = ''; + $default = ''; + $name = $BAW_CONF_DIS_DEF[$cfgname]['name']; + $help = $BAW_CONF_DIS_DEF[$cfgname]['help']; + + foreach ($BAW_CONF_DIS_TYP as $setname => $setdata) { + if (isset($cfgdata[$setname])) { + $val = $BAW_CONF_DIS[$cfgname][$setname]; + if ($setdata[1] == 'bool') { + if ($val == true) { + $selyes = ' checked="checked"'; + $selno = ""; + } else { + $selno = ' checked="checked"'; + $selyes = ""; + } + $input .= "
{$setdata[0]}\n" + ."{$BAW_MES[112]} " + . "{$BAW_MES[113]} " + . "
\n"; + } else if ($setdata[1] == 'string') { + $input .= "
{$setdata[0]}\n" + ."" + . "
\n"; + } else if ($setdata[1] == 'sorting1') { + $sort_arr = $BAW_CONF_DIS_DEF[$cfgname]['sorting']; + $input .= "
{$setdata[0]}\n" + . baw_generic_dropdown($cfgname."[".$setname."]", $sort_arr,$val) + . "
\n"; + } else if ($setdata[1] == 'sorting2') { + if ($val == 4) { + $selyes = ' checked="checked"'; + $selno = ''; + } else { + $selno = ' checked="checked"'; + $selyes = ''; + } + $input .= "
{$setdata[0]}\n" + ."{$BAW_MES['cfg_asc']} " + . "{$BAW_MES['cfg_desc']} " + . "
\n"; + } + } + } + $out .= "

$name

\n" + . $help . "
" + . "
$input
" + . $default + . "
\n"; + } + + $out .= "
\n" + . "" + . baw_site_footer(); + return $top . "$submit
\n". $out; +} + +$BAW_FILE_HEADER = "/** + * betterawstats - an alternative display for awstats data + * + * @author Oliver Spiesshofer, support at betterawstats dot com + * @copyright 2008 Oliver Spiesshofer + * @version 1.0 + * @link http://betterawstats.com + * + * Based on the GPL AWStats Totals script by: + * Jeroen de Jong + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// this file can't be used on its own - do not change these 3 lines +if (strpos (\$_SERVER['PHP_SELF'], 'config.php') !== false) { + die ('This file can not be used on its own!'); +} +"; + + +?> \ No newline at end of file diff --git a/betterawstats/core/config_default.inc.php b/betterawstats/core/config_default.inc.php new file mode 100644 index 0000000..9ef9359 --- /dev/null +++ b/betterawstats/core/config_default.inc.php @@ -0,0 +1,639 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'config_default.php') !== false) { + die ('This file can not be used on its own!'); +} + +$BAW_CONF_DEF = array( + $BAW_MES['cfg_site_settings'] => array ( + 'site_url' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_script_url'], + 'default' => 'http://awstats.local', + 'help' => $BAW_MES['cfg_script_url_hlp'], + ), + 'site_path' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_script_path'], + 'default' => '/path/to/betterawstats/', + 'help' => $BAW_MES['cfg_script_path_hlp'], + ), + 'path_data' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_path_to_aws_data'], + 'default' => '/path/to/betterawstats/awstats/data', + 'help' => $BAW_MES['cfg_path_to_aws_data_hlp'] + ), + 'path_lib' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_path_to_aws_lib'], + 'default' => '/path/to/betterawstats/awstats/lib', + 'help' => $BAW_MES['cfg_path_to_aws_lib_hlp'] + ), + 'path_lang' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_path_to_aws_lang'], + 'default' => '/path/to/betterawstats/awstats/lang', + 'help' => $BAW_MES['cfg_path_to_aws_lang_hlp'], + ), + 'icons_url' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_aws_icons_url'], + 'default' => "http://awstats.local/awstats/icon", + 'help' => $BAW_MES['cfg_aws_icons_url_hlp'], + ), + 'online_config' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_web_config'], + 'default' => 'false', + 'help' => $BAW_MES['cfg_web_config_hlp'], + 'values' => array( + 'true' => $BAW_MES['cfg_enable'], + 'false' => $BAW_MES['cfg_disable'] + ) + ), + 'online_config_password'=> array ( + 'type' => 'password', + 'name' => $BAW_MES['cfg_web_config_pw'], + 'default' => '', + 'help' => $BAW_MES['cfg_web_config_pw_hlp'], + ), + 'limit_server' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_limit_server'], + 'default' => 'show_all', + 'help' => $BAW_MES['cfg_limit_server_hlp'], + 'values' => $BAW_SERVERS, + ), + ), + $BAW_MES['cfg_layout_settings'] => array ( + 'layout_type'=> array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_layout_type'], + 'default' => 'vertical', + 'help' => $BAW_MES['cfg_layout_type_hlp'], + 'values' => array( + 'vertical' => $BAW_MES['cfg_vertical'], + 'horizontal' => $BAW_MES['cfg_horizontal'] + ) + ), + 'lang_setting' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_language'], + 'default' => "auto", + 'help' => $BAW_MES['cfg_language_hlp'], + 'values' => array( + 'auto'=>'Automatic', + 'al'=>'Albanian','ba'=>'Bosnian','bg'=>'Bulgarian','ca'=>'Catalan', + 'tw'=>'Chinese (Taiwan)','cn'=>'Chinese (Simplified)','cz'=>'Czech', + 'dk'=>'Danish','nl'=>'Dutch','en'=>'English','et'=>'Estonian', + 'eu'=>'Euskara','fi'=>'Finnish','fr'=>'Francais','gl'=>'Galician', + 'de'=>'Deutsch','gr'=>'Greek','he'=>'Hebrew','hu'=>'Hungarian', + 'is'=>'Icelandic','id'=>'Indonesian','it'=>'Italiano','jp'=>'Japanese', + 'kr'=>'Korean','lv'=>'Latvian','nn'=>'Norwegian (Nynorsk)', + 'nb'=>'Norwegian (Bokmal)','pl'=>'Polish','pt'=>'Portuguese', + 'br'=>'Portuguese (Brazilian)','ro'=>'Romanian','ru'=>'Russian', + 'sr'=>'Serbian','sk'=>'Slovak','es'=>'Spanish','se'=>'Swedish', + 'tr'=>'Turkish','ua'=>'Ukrainian','wlk'=>'Welsh' + ) + ), + 'dec_point' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_decimalpoint'], + 'default' => ".", + 'help' => $BAW_MES['cfg_decimalpoint_hlp'] + ), + 'tho_point' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_thous_sep'], + 'default' => "'", + 'help' => $BAW_MES['cfg_thous_sep_hlp'] + ), + 'date_format' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_date_form'], + 'default' => "Y-M-d", + 'help' => $BAW_MES['cfg_date_form_hlp'], + ), + 'date_time_format' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_date_time_form'], + 'default' => "Y-M-d H:i", + 'help' => $BAW_MES['cfg_date_time_form_hlp'] + ), + 'percent_decimals' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_percent_dec'], + 'default' => 1, + 'help' => $BAW_MES['cfg_percent_dec_hlp'], + ), + 'hideempty' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_hide_empty'], + 'default' => 'true', + 'help' => $BAW_MES['cfg_hide_empty_hlp'], + 'values' => array( + 'true' => $BAW_MES['cfg_hide'], + 'false' => $BAW_MES['cfg_show'] + ) + ), + 'auto_submit_form' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_auto_submit_form'], + 'default' => 'true', + 'help' => $BAW_MES['cfg_auto_submit_form_hlp'], + 'values' => array( + 'true' => $BAW_MES['cfg_enable'], + 'false' => $BAW_MES['cfg_disable'] + ) + ), + ), + $BAW_MES['cfg_table_settings'] => array( + 'firstdayofweek' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_firstweekday'], + 'default' => 1, + 'help' => $BAW_MES['cfg_firstweekday_hlp'], + 'values' => array( + 1 => $BAW_MES['monday'], + 2 => $BAW_MES['sunday'] + ) + ), + 'field_length' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_field_length'], + 'default' => 65, + 'help' => $BAW_MES['cfg_field_length_hlp'], + ), + 'maxlines' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_max_lines'], + 'default' => 10000, + 'help' => $BAW_MES['cfg_max_lines_hlp'], + ), + ), + $BAW_MES['cfg_chart_settings'] => array( + 'max_visitors' => array( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_max_scale_visitors'], + 'default' => "layout_visits", + 'help' => $BAW_MES['cfg_max_scale_visitors_hlp'], + 'values' => array( + 'layout_visitos' => $BAW_MES[18], + 'layout_visits' => $BAW_MES['visits'], + 'layout_pages' => $BAW_MES[56], + 'layout_hits' => $BAW_MES[57], + 'layout_bytes' => $BAW_MES[75], + ) + ), + 'max_visits' => array( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_max_scale_visits'], + 'default' => "layout_visits", + 'help' => $BAW_MES['cfg_max_scale_visits_hlp'], + 'values' => array( + 'layout_visits' => $BAW_MES['visits'], + 'layout_pages' => $BAW_MES[56], + 'layout_hits' => $BAW_MES[57], + 'layout_bytes' => $BAW_MES[75], + ) + ), + 'max_pages' => array( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_max_scale_pages'], + 'default' => "layout_pages", + 'help' => $BAW_MES['cfg_max_scale_pages_hlp'], + 'values' => array( + 'layout_pages' => $BAW_MES[56], + 'layout_hits' => $BAW_MES[57], + 'layout_bytes' => $BAW_MES[75], + ) + ), + 'max_hits' => array( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_max_scale_hits'], + 'default' => "layout_hits", + 'help' => $BAW_MES['cfg_max_scale_hits_hlp'], + 'values' => array( + 'layout_hits' => $BAW_MES[57], + 'layout_bytes' => $BAW_MES[75], + ) + ), + 'max_chart_items' => array( + 'type' => 'string', + 'name' => $BAW_MES['cfg_max_chart_items'], + 'default' => "50", + 'help' => $BAW_MES['cfg_max_chart_items_hlp'], + ), + 'chart_titles' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_chart_titles'], + 'default' => 'false', + 'help' => $BAW_MES['cfg_chart_titles_hlp'], + 'values' => array( + 'true' => $BAW_MES['cfg_enable'], + 'false' => $BAW_MES['cfg_disable'] + ), + ), + ), + $BAW_MES['cfg_jpgraph_settings'] => array( + 'use_jpgraph' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_jpgraph_enable'], + 'default' => 'false', + 'help' => $BAW_MES['cfg_jpgraph_enable_hlp'], + 'values' => array( + 'true' => $BAW_MES['cfg_enable'], + 'false' => $BAW_MES['cfg_disable'] + ) + ), + 'jpgraph_path' => array ( + 'type' => 'string', + 'name' => $BAW_MES['cfg_jpgraph_path'], + 'default' => '/path/to/betterawstats/jpgraph/src', + 'help' => $BAW_MES['cfg_jpgraph_path_hlp'], + ), + ), + $BAW_MES['cfg_advanced_settings'] => array ( + 'version' => array ( + 'type' => 'fixed', + 'name' => $BAW_MES['cfg_version'], + 'default' => "1.0", + 'help' => $BAW_MES['cfg_version_hlp'], + ), + 'xhtml' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_xhtml'], + 'default' => 'false', + 'help' => $BAW_MES['cfg_xhtml_hlp'], + 'values' => array( + 'false' => 'HTML', + 'true' => 'XHTML' + ) + ), + 'debug' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_debug'], + 'default' => 'false', + 'help' => $BAW_MES['cfg_debug_hlp'], + 'values' => array( + 'true' => $BAW_MES['cfg_show'], + 'false' => $BAW_MES['cfg_hide'] + ) + ), + 'show_parser_stats' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_parser'], + 'default' => 'false', + 'help' => $BAW_MES['cfg_parser_hlp'], + 'values' => array( + 'true' => $BAW_MES['cfg_show'], + 'false' => $BAW_MES['cfg_hide'] + ) + ), + 'module' => array ( + 'type' => 'dropdown', + 'name' => $BAW_MES['cfg_module'], + 'default' => 'none', + 'help' => $BAW_MES['cfg_module_hlp'], + 'values' => array('none'=>$BAW_MES['cfg_disable'], 'drupal'=>'Drupal') + ) + ) +); + +$BAW_CONF_DIS_TYP = array( + 'order' => array($BAW_MES['cfg_type_order'], 'string'), + 'show' => array($BAW_MES['cfg_type_show'], 'bool'), + 'collapse' => array($BAW_MES['cfg_type_collapse'], 'bool'), + 'table' => array($BAW_MES['cfg_type_table'], 'bool'), + 'sort' => array($BAW_MES['cfg_type_sort'], 'sorting1'), + 'sort_dir' => array($BAW_MES['cfg_type_sort_dir'], 'sorting2'), + 'chart' => array($BAW_MES['cfg_type_chart'], 'bool'), + 'map' => array($BAW_MES['cfg_type_map'], 'bool'), + 'avg' => array($BAW_MES['cfg_type_avg'], 'bool'), + 'total' => array($BAW_MES['cfg_type_total'], 'bool'), + 'top_x' => array($BAW_MES['cfg_type_top_x'], 'string'), + 'assumebot' => array($BAW_MES['cfg_type_assumebot'], 'string'), + 'favicon' => array($BAW_MES['cfg_type_favicon'], 'bool'), + 'domain_lvls' => array($BAW_MES['cfg_type_domain_lvls'], 'string') +); + +$BAW_CONF_DIS_DEF = array ( + 'overview' => array ( + 'help' => $BAW_MES['cfg_dis_overview'], + 'name' => $BAW_MES[128], + ), + 'months' => array ( + 'help' => $BAW_MES['cfg_dis_months'], + 'name' => $BAW_MES[162], + /* 'sorting' => array( + 0 => $BAW_MES[5], + 1 => $BAW_MES[11], + 2 => $BAW_MES[10], + 3 => $BAW_MES[56], + 4 => $BAW_MES[57], + 5 => $BAW_MES[75] + )*/ + ), + 'days' => array ( + 'help' => $BAW_MES['cfg_dis_days'], + 'name' => $BAW_MES[138], + /* 'sorting' => array( + 0 => $BAW_MES[4], + 1 => $BAW_MES[10], + 2 => $BAW_MES[56], + 3 => $BAW_MES[57], + 4 => $BAW_MES[75] + )*/ + ), + 'weekdays' => array ( + 'help' => $BAW_MES['cfg_dis_weekdays'], + 'name' => $BAW_MES['weekday_averages'], + /* 'sorting' => array( + 0 => $BAW_MES[4], + 1 => $BAW_MES[10], + 2 => $BAW_MES[56], + 3 => $BAW_MES[57], + 4 => $BAW_MES[75] + )*/ + ), + 'hours' => array ( + 'help' => $BAW_MES['cfg_dis_hours'], + 'name' => $BAW_MES['hours_averages'], + 'sorting' => array( + 1 => $BAW_MES[20], + 2 => $BAW_MES[56], + 3 => $BAW_MES[57], + 4 => $BAW_MES[75] + ) + ), + 'domains' => array ( + 'help' => $BAW_MES['cfg_dis_domains'], + 'name' => $BAW_MES[25], + 'sorting' => array( + 'key' => $BAW_MES[25], + 0 => $BAW_MES[56], + 1 => $BAW_MES[57], + 2 => $BAW_MES[75] + ) + ), + 'visitors' => array ( + 'help' => $BAW_MES['cfg_dis_visitors'], + 'name' => $BAW_MES[81], + 'sorting' => array( + 0 => $BAW_MES[81], + // 1 => $BAW_MES[114], + 1 => $BAW_MES[56], + 2 => $BAW_MES[57], + 3 => $BAW_MES[75], + 4 => $BAW_MES['ratio_pages_hits'], + 5 => $BAW_MES[9] + ), + 'assumebot' => '1.0' + ), + 'logins' => array ( + 'help' => $BAW_MES['cfg_dis_logins'], + 'name' => $BAW_MES[94], + 'sorting' => array( + 'key' => $BAW_MES[94], + 0 => $BAW_MES[56], + 1 => $BAW_MES[57], + 2 => $BAW_MES[75], + 3 => $BAW_MES[9] + ) + ), + 'robots' => array ( + 'help' => $BAW_MES['cfg_dis_robots'], + 'name' => $BAW_MES[53], + 'sorting' => array( + 0 => $BAW_MES[53], + 1 => $BAW_MES[57], + 2 => $BAW_MES[57]. " (robots.txt)", + 3 => $BAW_MES[75], + 4 => $BAW_MES[9] + ) + ), + 'worms' => array ( + 'help' => $BAW_MES['cfg_dis_worms'], + 'name' => $BAW_MES[163], + 'sorting' => array( + 0 => $BAW_MES[163], + 1 => $BAW_MES[167], + 2 => $BAW_MES[57], + 3 => $BAW_MES[75], + 4 => $BAW_MES[9] + ) + ), + 'sessions' => array ( + 'help' => $BAW_MES['cfg_dis_sessions'], + 'name' => $BAW_MES[117], + ), + 'filetype' => array ( + 'help' => $BAW_MES['cfg_dis_filetype'], + 'name' => $BAW_MES[73], + 'sorting' => array( + 'key' => $BAW_MES[73], + 0 => $BAW_MES[57], + 1 => $BAW_MES[75], + 2 => $BAW_MES[100], + 3 => $BAW_MES[101] + ) + ), + 'urls' => array ( + 'help' => $BAW_MES['cfg_dis_urls'], + 'name' => $BAW_MES[19], + 'sorting' => array( + 0 => $BAW_MES[19], + 1 => $BAW_MES[29], + 2 => $BAW_MES[106], + 3 => $BAW_MES[104], + 4 => $BAW_MES[116] + ) + ), + 'paths' => array ( + 'help' => $BAW_MES['cfg_dis_paths_hlp'], + 'name' => $BAW_MES['cfg_dis_paths'], + 'sorting' => array( + 0 => $BAW_MES['files_paths'], + 1 => $BAW_MES[29] + ) + ), + 'os' => array ( + 'help' => $BAW_MES['cfg_dis_os'], + 'name' => $BAW_MES[59], + 'sorting' => array( + 1 => $BAW_MES[59], + 2 => $BAW_MES[57] + ), + 'hasversions' => 'osversions', + 'hasunknown' => 'unknownos' + ), + 'unknownos' => array ( + 'help' => $BAW_MES['cfg_dis_unknownos'], + 'name' => $BAW_MES[46], + 'sorting' => array( + 1 => $BAW_MES['user_agent'], + 2 => $BAW_MES[9] + ) + ), + 'osversions' => array ( + 'help' => $BAW_MES['cfg_dis_osversions'], + 'name' => $BAW_MES['os_versions'], + 'sorting' => array( + 1 => $BAW_MES[59], + 2 => $BAW_MES[57] + ) + ), + 'browsers' => array ( + 'help' => $BAW_MES['cfg_dis_browsers'], + 'name' => $BAW_MES[21], + 'sorting' => array( + 1 => $BAW_MES[21], + 2 => $BAW_MES[111], + 3 => $BAW_MES[57] + ), + 'hasversions' => 'browserversions', + 'hasunknown' => 'unknownbrowser' + ), + 'browserversions' => array ( + 'help' => $BAW_MES['cfg_dis_browserversions'], + 'name' => $BAW_MES['browser_versions'], + 'sorting' => array( + 2 => $BAW_MES[21], + 3 => $BAW_MES[111], + 4 => $BAW_MES[57] + ), + ), + 'unknownbrowser' => array ( + 'help' => $BAW_MES['cfg_dis_unknownbrowser'], + 'name' => $BAW_MES[50], + 'sorting' => array( + 1 => $BAW_MES['cfg_dis_unknownbrowser_agent'], + 2 => $BAW_MES[9] + ) + ), + 'screensizes' => array ( + 'help' => $BAW_MES['cfg_dis_screensizes'], + 'name' => $BAW_MES[135], + 'sorting' => array( + 1 => $BAW_MES[135], + 2 => $BAW_MES[57], + ) + ), + 'se_referers' => array ( + 'help' => $BAW_MES['cfg_dis_se_referers'], + 'name' => $BAW_MES[126], + 'sorting' => array( + 0 => $BAW_MES[126], + 1 => $BAW_MES[56], + 2 => $BAW_MES[57] + ), + ), + 'referers' => array ( + 'help' => $BAW_MES['cfg_dis_referers'], + 'name' => $BAW_MES[127], + 'sorting' => array( + 0 => $BAW_MES[127], + 1 => $BAW_MES[56], + 2 => $BAW_MES[57] + ), + 'hasdetail' => 'referer_domains' + ), + 'referer_domains' => array ( + 'help' => $BAW_MES['cfg_dis_referer_domains'], + 'name' => sprintf($BAW_MES['by_domains'], $BAW_MES[127]), + 'sorting' => array( + 0 => $BAW_MES[127], + 1 => $BAW_MES[56], + 2 => $BAW_MES[57] + ), + 'hascompact' => 'referers' + ), + 'hotlinks' => array ( + 'help' => $BAW_MES['cfg_dis_hotlinks'], + 'name' => $BAW_MES['referer_hotlinks'], + 'sorting' => array( + 0 => $BAW_MES[127], + // 1 => $BAW_MES[56], + 1 => $BAW_MES[57] + ), + 'hasdetail' => 'hotlink_domains' + ), + 'hotlink_domains' => array ( + 'help' => $BAW_MES['cfg_dis_hotlink_domains'], + 'name' => $BAW_MES['hl_by_domains '], + 'sorting' => array( + 0 => $BAW_MES[127], + // 1 => $BAW_MES[56], + 1 => $BAW_MES[57] + ), + 'hascompact' => 'hotlinks' + ), + 'searchphrases' => array ( + 'help' => $BAW_MES['cfg_dis_searchphrases'], + 'name' => $BAW_MES[120], + 'sorting' => array( + 0 => $BAW_MES[103], + 1 => $BAW_MES[57] + ) + ), + 'searchwords' => array ( + 'help' => $BAW_MES['cfg_dis_searchwords'], + 'name' => $BAW_MES[121], + 'sorting' => array( + 0 => $BAW_MES[13], + 1 => $BAW_MES[57] + ) + ), + 'misc' => array ( + 'help' => $BAW_MES['cfg_dis_misc'], + 'name' => $BAW_MES[139], + ), + 'errors' => array ( + 'help' => $BAW_MES['cfg_dis_errors'], + 'name' => $BAW_MES[32], + 'sorting' => array( + 0 => $BAW_MES[32], + 2 => $BAW_MES[57], + 3 => $BAW_MES[106] + ) + ), + 'errors404' => array ( + 'help' => $BAW_MES[47], + 'name' => $BAW_MES[49], + 'sorting' => array( + 0 => $BAW_MES[49], + 1 => $BAW_MES[57], + 2 => $BAW_MES[57] + ) + ), +); +?> \ No newline at end of file diff --git a/betterawstats/core/data.inc.php b/betterawstats/core/data.inc.php new file mode 100644 index 0000000..4dda2d8 --- /dev/null +++ b/betterawstats/core/data.inc.php @@ -0,0 +1,403 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place','Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * File contents: + * + * This file contains functions that read data from files process it and store it + * in an array. This concerns library-data as well as stats-data. Language files + * are NOT processed here. + */ + + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'data.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +/** +* Data function: read the data directories this function is called by +* baw_match_files() and itself recursively +* +* @param str $dir directory +* @return arr ALL files found in that directory +* +*/ +function baw_parse_dir($dir = false) { + global $BAW_CONF; + if ($dir == false) { + $dir = $BAW_CONF['path_data']; + } + if (!file_exists($dir)) { + echo baw_raise_error('datafilesdir', array($dir)); + return array(); + } + // add trailing slash if not exists + if (substr($dir, -1) != '/') { + $dir .= '/'; + } + baw_debug('dbg_start_parse_dir', $dir); + $files = array(); + if ($dh = @opendir($dir)) { + while (($file = readdir($dh)) !== false) { + if (!preg_match('/^\./s', $file)) { + if (is_dir($dir.$file)) { + $newdir = $dir.$file.'/'; + $files = array_merge($files, baw_parse_dir($newdir)); + baw_debug('dbg_found_dir', $dir); + } else { + $files[] = $dir.$file; + baw_debug('dbg_found_file', $file); + } + } + } + closedir($dh); + } + baw_debug('dbg_finished_parse_dir', $dir); + return $files; +} + +/* +* Data function: find all files that contain the data for the current month and +* 12 month before now to write a rolling month data chart. This function is called +* by index.php +* +* fills the gl. arrays: $BAW_CURR['years'], $BAW_CURR['months'], $BAW_DFILES +* +*/ +function baw_match_files() { + global $BAW_CURR, $BAW_CONF, $BAW_CONF_DIS, $BAW_MES, $BAW_DFILES, $BAW_SERVERS; + // read all the files in the directory + $dirfiles = baw_parse_dir(); + $pat_others = '/awstats(\d{6})\.((.+))\.txt$/'; + // go through all files and find matching ones + $year_array = array(); + $month_array = array(); + foreach ($dirfiles as $file) { + $filename = explode("/", $file); + $filename = $filename[count($filename)-1]; + if (preg_match($pat_others, $file, $match)) { + $month = substr($filename, 7, 2); + $year = substr($filename, 9, 4); + $year_array[$year] = $year; + $month_array[$month] = $BAW_MES[$month + 59]; + // future feature where the admin can tell which sites to read/ exclude + // if (!$BAW_CONF['filter_configs'] || in_array($site, $BAW_CONF['filter_configs'])) { + $site = $match[2]; + $BAW_DFILES[$site][$year.$month] = array( + 'file' => $file, + 'map' => null + ); + // add the sites to another array since we need that for the config editor + $BAW_SERVERS[$site] = $site; + baw_debug("site found for month $month and year $year: $file, SITE: {$site}"); + } + } + if (count($year_array)>0) { + $year_array = array_unique($year_array); + ksort($year_array); + } + if (count($month_array)>0) { + ksort($month_array); + $month_array = array_unique($month_array); + } + $BAW_CURR['years'] = $year_array; + $BAW_CURR['months'] = $month_array; + // since we added sites with each file, remove duplicates + ksort($BAW_DFILES); + ksort($BAW_SERVERS); + $BAW_SERVERS = array('show_all' => $BAW_MES['cfg_show_all']) + $BAW_SERVERS; + if (!isset($BAW_CURR['site_name'])) { + $BAW_CURR['site_name'] = key($BAW_DFILES); // we dont have a selected, take first in line + reset($BAW_DFILES); + } +} + +/* +* Data function: calculate the month-data by summing up days and retrieving +* single-value data. This function is called by different display-functions +* +* @param arr $t TIME data array of the current file +* @param arr $g GENERAL data array of the current file +* @return arr summed dataset for processing +* +*/ +function baw_calc_monthdata($t, $g) { + baw_debug("Calculating Month-data"); + $pages = 0; + $hits = 0; + $bandwidth = 0; + $not_viewed_pages = 0; + $not_viewed_hits = 0; + $not_viewed_bandwidth = 0; + $num_t = count($t); + for ($i=0; $i<$num_t; $i++) { + $pages += $t[$i][0]; + $hits += $t[$i][1]; + $bandwidth += $t[$i][2]; + $not_viewed_pages += $t[$i][3]; + $not_viewed_hits += $t[$i][4]; + $not_viewed_bandwidth += $t[$i][5]; + } + $result = array( + $g['TotalUnique'][0], + $g['TotalVisits'][0], + $pages, + $hits, + $bandwidth, + $not_viewed_pages, + $not_viewed_hits, + $not_viewed_bandwidth + ); + return $result; +} + +/* +* Data Function: read data from awstats library files (perl format) +* Opens a file, reads the contents and does corrections and makes PHP out of PERL +* This function is called by the file library.inc.php +* +* @param str $file path to the library file +* @param str $data the name of the array in the file +* @return arr summed dataset for processing +* +*/ +function baw_get_library($file, $data) { + global $BAW_CONF, $BAW_LOGTYPE; + $file = $BAW_CONF['path_lib'] . $file; + baw_debug("Trying to read library data ($data) from file: $file"); + if (!file_exists($file)) { + echo baw_raise_error('libraryfiles', array($file)); + exit; + } + // read the whole file in one go + $file_text = file_get_contents($file); + // these are to attempt to convert the perl data file to PHP + + $search = array( + "\$LogType eq 'S'", + "= ", // remove spaces between = and ( + "@", + "%", + "'=>'", + "=(", + "=\n(", + "=\r(", + "=\r\n(", + ",,", + ' target="_blank"', + ' [new window]', + ' $line_item) { + if (is_numeric($line_item)) { + // this could cause trouble in case this was a date, percentage etc. + $filedata[$first_element][$no] += $line_item; + } + } + } + } + fclose($f); + baw_debug("data read, file closed"); + return $filedata; +} + +/* +* Data Function: read the filemap at the begginning of a data file. This function +* is called only by baw_data if the data was not read before. +* +* @param obj &$f file-handler to read +* @param str $site the concerned site +* @param str $date YYYYMM, date of datafile +* adds the data to gl. array $BAW_DFILES +* +*/ +function baw_read_filemap(&$f, $site, $date) { + global $BAW_DFILES; + // $f = fopen($file, 'r'); + $str =''; + $check = 1; + // read this file until we hit the offsets + while ($check !== 0) { + $str = fgets($f, 20000); + // check for XML Data + if (strstr($str, ' 1) { + baw_debug("data type $type, starts at offset $offset"); + $BAW_DFILES[$site][$date]['map'][$type] = $offset; + } else { + echo baw_raise_error('datafileindex', $err_data); + exit; + } + } + baw_debug("map read"); +} +?> \ No newline at end of file diff --git a/betterawstats/core/display.inc.php b/betterawstats/core/display.inc.php new file mode 100644 index 0000000..3412cd6 --- /dev/null +++ b/betterawstats/core/display.inc.php @@ -0,0 +1,1669 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * File contents: + * + * This file contains one function for each displayed section. The functions + * call the data from the datafile, process & sort it and output the charts/tables + * according to the settings in config.php + */ + + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'display.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +function baw_display_overview($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF; + $m = $BAW_MES; + $m_name = $m[59+$BAW_CURR['month']]; + + if ($g = baw_data($BAW_CURR['site_name'], 'GENERAL', $BAW_CURR['yearmonth'])) { + // we assumethat time exists when general exist + $t = baw_data($BAW_CURR['site_name'], 'TIME', $BAW_CURR['yearmonth']); + + $o = baw_calc_monthdata($t,$g); + $l = $g['LastUpdate']; + $time = baw_time_format($l[0]); + $BAW_CURR['thismonth']['hits'] = $o[1]; + $out = "\n" + . " \n \n \n" + . " \n \n \n" + . " \n \n \n" + . " \n \n" + ." \n" + ." \n" + ." \n" + ." \n" + ." \n \n" + + . " \n \n" + ." \n" + ." \n" + ." \n" + ." \n" + ." \n \n" + . " \n \n" + ." \n" + ." \n" + ." \n" + ." \n" + . " \n \n \n"; + if ($BAW_CONF['show_parser_stats']) { + $out .= " \n \n \n" + . " \n" + ." \n" + ." \n" + ." \n" + ." \n" + ." \n" + ." \n \n"; + } + $out .= "
{$m[133]}$m_name {$BAW_CURR['year']}
{$m[8]}".baw_time_format($g['FirstTime'][0])."
{$m[9]}".baw_time_format($g['LastTime'][0])."
 {$m[11]}{$m[10]}{$m[56]}{$m[57]}{$m[75]}
{$m[160]} *".baw_num_format($o[0])."".BR." ".baw_num_format($o[1])."".BR."(".@baw_num_format($o[1] / $o[0],2)." {$m[52]})".baw_num_format($o[2])."".BR."(".@baw_num_format($o[2] / $o[1],2)." {$m[27]}/{$m[12]})".baw_num_format($o[3])."".BR."(".@baw_num_format($o[3] / $o[1],2)." {$m[57]}/{$m[12]})".baw_byte_format($o[4])."".BR."(".@baw_byte_format($o[4] / $o[1],2)."/{$m[12]})
{$m[161]} * ".baw_num_format($o[5])."".baw_num_format($o[6])."".baw_byte_format($o[7])."
* {$m[159]}
{$m['data_file_stats']}
{$m[35]}:".BR."$time{$m['parsed_records']}".BR . baw_num_format($l[1]) . "{$m['old_records']}".BR . baw_num_format($l[2]) . "{$m['new_records']}".BR . baw_num_format($l[3]) . "{$m['corrupted']}".BR . baw_num_format($l[4]) . "{$m['dropped']}".BR . baw_num_format($l[5]) . "
\n\n"; + } else { + $out = "$m_name-{$BAW_CURR['year']} has no data"; + } + return $out; +} + +function baw_display_months($set) { + global $BAW_MES, $BAW_CONF, $BAW_CURR, $BAW_DFILES; + $format = array( + 0 => array ('format' => 'layout_text', 'title'=> $BAW_MES[5], 'colspan'=>'2'), // first cell in first line + 1 => array ('format' => 'layout_text'), // first cell in first line + 2 => array ('format' => 'layout_visitors', 'title'=> $BAW_MES[11]), + 3 => array ('format' => 'layout_visits', 'title'=> $BAW_MES[10]), + 4 => array ('format' => 'layout_pages', 'title'=> $BAW_MES[56]), + 5 => array ('format' => 'layout_hits', 'title'=> $BAW_MES[57]), + 6 => array ('format' => 'layout_bytes', 'title'=> $BAW_MES[75]) + ); + $allsites = false; + if ($BAW_CURR['site_name'] !== 'all_months') { + $sites = array($BAW_CURR['site_name']); + } else { + $sites = array_keys($BAW_DFILES); + $allsites = true; + } + + $out = ''; + // for each month, get the four data sets + $frm_arr = array('layout_visitors', 'layout_visits', 'layout_pages', 'layout_hits', 'layout_bytes'); + foreach ($sites as $site) { + $data_format = array(); + $x = 0; + $val = array(); + $monthback = $set['top_x'] - 1; + $chart = array(); + $val_chart = array(); + $lastyear = 0; + for ($i=$monthback; $i>=0; $i--){ + // get the month & Year x month ago + $tyear = date("Y", mktime(0, 0, 0, $BAW_CURR['month']-$i, 1, $BAW_CURR['year'])); + $tmonth = date("m", mktime(0, 0, 0, $BAW_CURR['month']-$i, 1, $BAW_CURR['year'])); + // get the data for that month + if (isset($BAW_DFILES[$site][$tyear .$tmonth])) { + $g = baw_data($site, 'GENERAL', $tyear . $tmonth); + $t = baw_data($site, 'TIME', $tyear . $tmonth); + $data = baw_calc_monthdata($t, $g); + $x++; + $month_text = $tmonth + 59; + $class = ''; + $date = date("Ym", mktime(0,0,0,$tmonth,1,$tyear)); + $today = date("Ym"); + if ($date == $today) { + $class = "currentday"; + } + for ($j=0; $j<5; $j++) { + $chart["{$BAW_MES[$month_text]}|$tyear"][] = array('data' => "$data[$j]", 'class' => "$class", 'format' => $frm_arr[$j]); + } + $class .= baw_even($tyear, ' evenyear', ' oddyear'); + + $val[$tmonth.$tyear] = array( + $tyear, + $BAW_MES[$month_text], + $data[0], + $data[1], + $data[2], + $data[3], + $data[4], + ); + if ($class !== '') { + $data_format[$tmonth.$tyear] = $class; + } + } + } + if ($set['chart']) { + if ($allsites) { + // make a link to the actual statistics from the overview + $full_url = "{$BAW_CONF['site_url']}/index.php?site=$site&month={$BAW_CURR['month']}&year={$BAW_CURR['year']}"; + $out .= "

$site

"; + } + $out .= baw_render_htmlchart($val, $format, $set['avg'], -$set['top_x'], $data_format); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $val, $format, $set['avg'], $set['total'], false, $data_format); + } + } + return $out; +} + +function baw_display_days($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_DFILES; + $sum = array(0,0,0,0,0); // summ all overall data + // this 3 lines is only for collecting data for weekdays + $wdsum_arr = array(); // summ all weekday data + $wdcount_arr = array(0,0,0,0,0,0,0); // count the number of sat, sun etc + $wdavg_arr = array(); // values of avg + $daysoflastmonth = 30; + + // assemble date + $daysofmonth = date("t", strtotime("{$BAW_CURR['year']}{$BAW_CURR['month']}01000000")); + //$thisyear = date("Y", strtotime("-1 month")); + //$lastyear = date("Y", strtotime("-1 month -1 year")); + $current_month = date('m'); + $current_day = date('d'); + $daydiff = 0; + $data_format = array(); + // find how may days we have to go back + if ($BAW_CURR['month'] == $current_month) { // if we have the current month, get some data from the last month + $daydiff = abs($current_day - $daysofmonth); // calculate how many days are missing + } + + $format = array( + 0 => array ('format'=> 'layout_text', 'title' => $BAW_MES[4], 'colspan'=>3), + 1 => array ('format'=> 'layout_text'), + 2 => array ('format'=> 'layout_text'), + 3 => array ('format'=> 'layout_visits', 'title' => $BAW_MES[10]), + 4 => array ('format'=> 'layout_pages', 'title' => $BAW_MES[56]), + 5 => array ('format'=> 'layout_hits', 'title' => $BAW_MES[57]), + 6 => array ('format'=> 'layout_bytes', 'title' => $BAW_MES[75]) + ); + // check if we do all sites or just one + $allsites = false; + if ($BAW_CURR['site_name'] !== 'all_days') { + $sites = array($BAW_CURR['site_name']); + } else { + $sites = array_keys($BAW_DFILES); + $allsites = true; + } + $out = ''; + // iterate all sites, normally only one + foreach ($sites as $site) { + // we have to add the days of the previous month + // this has to be inside the loop so we get the variables again for next site + if ($daydiff > 0) { + if ($BAW_CURR['month'] !== '01') { + $prevyear = $BAW_CURR['year']; + $prevmonth = sprintf('%02d', $BAW_CURR['month']-1); // date('m', strtotime("-1 month")); + $daysoflastmonth = date("t", strtotime("{$BAW_CURR['year']}{$prevmonth}01000000")); + } else { + $prevyear = $BAW_CURR['year'] - 1; + $prevmonth = '12'; + } + } + $val = array(); + // get the data for this site if available + if ($val = baw_data($site, 'DAY', $BAW_CURR['yearmonth'])) { + // in case we need last months data, get it too + if ($daydiff > 0) { + if ($prevdate_data = baw_data($site, 'DAY', $prevyear . $prevmonth)) { + $date_cut = $prevyear . $prevmonth . $prevmonth = sprintf('%02d', $daysoflastmonth - $daydiff); + $val_prev = baw_cut_date_array($prevdate_data, $date_cut); + $val = $val_prev + $val; + } + } + $newval = array(); + $lastmonth = 0; + for ($j=0; $j<$daysofmonth; $j++) { + $class = ''; + // foreach ($val as $date => $data) { + $date = date("Ymd", mktime(0,0,0,$BAW_CURR['month'],1+ $j - $daydiff,$BAW_CURR['year'])); + $month = date("m", mktime(0,0,0,$BAW_CURR['month'],1+ $j - $daydiff,$BAW_CURR['year'])); + $today = date("Ymd"); + if ($date == $today) { + $class = "currentday"; + } + if (!isset($val[$date])) { + $val[$date] = array(0,0,0,0,0); + } + $data = $val[$date]; + $xdate = $date . "000000"; + $tstamp = strtotime($xdate); + $wday = date("w", $tstamp); + + if ($wday == 0 or $wday == 6) { + $class = "$class weekend"; + $class = trim($class); + } + // these lines is only for collecting data for weekdays + $wdcount_arr[$wday]++; // count no of one weekday for avg division + for ($i=0; $i<=3; $i++) { // iterate data types + if (!isset($wdsum_arr[$wday][$i])) { + $wdsum_arr[$wday][$i] = 0; + } + $wdsum_arr[$wday][$i] += $data[$i]; + } + + if (!isset($from)) { + $from = $xdate; + } + $BAW_CURR['wdays']['count'] = $wdcount_arr; + $BAW_CURR['wdays']['avg'] = $wdsum_arr; + $BAW_CURR['wdays']['from'] = $from; + $BAW_CURR['wdays']['to'] = $xdate; + if (($j !== $daysofmonth)) { + $newval[$xdate] = array( + date("Y", strtotime($xdate)), + date("M", strtotime($xdate)), + date("d", strtotime($xdate)), + $data[3], + $data[0], + $data[1], + $data[2] + ); + } + + $class .= baw_even($month, ' evenmonth', ' oddmonth'); + if ($class !== '') { + $data_format[$xdate] = $class; + } + } + if ($set['chart']) { + if ($allsites) { + // make a link to the actual statistics from the overview + $full_url = "{$BAW_CONF['site_url']}/index.php?site=$site&month={$BAW_CURR['month']}&year={$BAW_CURR['year']}"; + $out .= "

$site

"; + // $html .= baw_display_updatestats($site); + } + $out .= baw_render_htmlchart($newval, $format, $set['avg'], false, $data_format); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], false, $data_format); + } + } + } + return $out; +} + +// get all the averages of one weekday each +function baw_display_weekdays($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF; + + if (isset($BAW_CURR['wdays']['count'])) { + $format = array( + 0 => array ('title' => $BAW_MES[4], 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title' => $BAW_MES[10], 'format' => 'layout_visits'), + 2 => array ('title' => $BAW_MES[56], 'format' => 'layout_pages'), + 3 => array ('title' => $BAW_MES[57], 'format' => 'layout_hits'), + 4 => array ('title' => $BAW_MES[75], 'format' => 'layout_bytes') + ); + $newval = array(); + $data_format = array(); + $wdcount_arr = $BAW_CURR['wdays']['count']; + $wdsum_arr = $BAW_CURR['wdays']['avg']; + for ($w=0; $w<7; $w++) { + // switch for Mo or Su start + $x = $w; + if ($BAW_CONF['firstdayofweek'] == 1) { + $x = $w + 1; + if ($x == 7) { + $x = 0; + } + } + $class = ''; + if ($x == 0 or $x == 6) { + $class = "weekend"; + } + if ($wdcount_arr[$x] == 0) { + $wdcount_arr[$x] = 1; + } + for ($i=0; $i<=3; $i++) { + $wavg[$x][$i] = '1'; + if (!isset($wdsum_arr[$x][$i])) { + $wdsum_arr[$x][$i] = 0; + } + $wavg[$x][$i] = $wdsum_arr[$x][$i] / $wdcount_arr[$x]; + } + $newval[84+$x] = array( + $BAW_MES[84+$x], + $wavg[$x][3], + $wavg[$x][0], + $wavg[$x][1], + $wavg[$x][2] + ); + if ($class !== '') { + $data_format[84+$x] = $class; + } + } + $out = ''; + if ($set['chart']) { + $out .= baw_render_htmlchart($newval, $format, $set['avg'], false, $data_format); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], false, $data_format); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + return $out; +} + +function baw_display_hours($set) { + // we have to calculate the average of each hour depending on how many days have + // data at all in this month + // half days will create slightly inaccuarate data. + global $BAW_MES, $BAW_CURR, $BAW_CONF; + $chart = array(); + $format = array( + 0 => array ('title'=> $BAW_MES[20], 'format' => 'layout_text', 'colspan'=> 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 3 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 4 => array ('title'=> $BAW_MES[75], 'format' => 'layout_bytes') + ); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], "TIME", $BAW_CURR['yearmonth'])) { + $days = baw_data($BAW_CURR['site_name'], "DAY", $BAW_CURR['yearmonth']); + $count_days = count($days); + if (!$count_days) return; # NB + foreach ($val as $hour => $data) { + $ihour = $hour + 1; + if ($ihour >= 13) { + $ihour = ($hour - 11); + } + $avgdata = array(); + $icon = baw_create_image($BAW_CONF['icons_url'] . "/clock/hr$ihour.png" , array("alt"=>$hour, "title"=>$hour)); + $avgdata[0] = $data[0] / $count_days; + $avgdata[1] = $data[1] / $count_days; + $avgdata[2] = $data[2] / $count_days; + $lhour = sprintf('%02d',$hour); + $newval_table[$hour] = array( + $icon, + "$lhour:00 - $lhour:59", + $avgdata[0], + $avgdata[1], + $avgdata[2], + ); + $newval_chart[$hour] = array( + $icon, + $hour, + $avgdata[0], + $avgdata[1], + $avgdata[2], + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + + $out = ''; + if ($set['chart']) { + $newval_chart = baw_array_sorting($newval_chart, $set['sort'], $set['sort_dir']); + $out .= baw_render_htmlchart($newval_chart, $format, $set['avg'], false); + } + if ($set['table']) { + $newval_table = baw_array_sorting($newval_table, $set['sort'], $set['sort_dir']); + $out .= baw_render_table($set['name'], $newval_table, $format, $set['avg'], $set['total']); + } + return $out; +} + +function baw_display_domains($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $chart = array(); + $format_table = array( + 0 => array ('title'=> $BAW_MES[25] , 'format' => 'layout_text','colspan' => 3), + 1 => array ('format' => 'layout_text'), + 2 => array ('format' => 'layout_text'), + 3 => array ('percent' => true, 'title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 4 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 5 => array ('title'=> $BAW_MES[75], 'format' => 'layout_bytes') + ); + $format_chart = array( + 0 => array ('title'=> $BAW_MES[25] , 'format' => 'layout_text','colspan' => 3), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 3 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 4 => array ('title'=> $BAW_MES[75], 'format' => 'layout_bytes') + ); + // $format_jp = array($BAW_MES[56], $BAW_MES[57], $BAW_MES[75]); + $newval = array(); + // $jpval = array(); + if ($val = baw_data($BAW_CURR['site_name'], "DOMAIN", $BAW_CURR['yearmonth'])) { + $val = baw_array_sorting($val, $set['sort'], $set['sort_dir']); + foreach ($val as $domain => $data) { + if (isset($BAW_LIB['domains'][$domain])) { + $file = $domain; + $desc = $BAW_LIB['domains'][$domain]; + } else { + $file = 'unknown'; + $desc = $file; + } + $icon = baw_create_image($BAW_CONF['icons_url'] . "/flags/$file.png" , array("alt" => $domain, "title" => $domain)); + $newval_table[$domain] = array( + $icon, + $desc, + $domain, + $data[0], + $data[1], + $data[2] + ); + $newval_chart[$domain] = array( + $icon, + $domain, + $data[0], + $data[1], + $data[2] + ); + $out = ''; + + if ($set['chart']) { + $out .= baw_render_htmlchart($newval_chart, $format_chart, $set['avg'], $set['top_x']); + } + if ($set['map']) { + $out .= baw_render_map($newval_table, $set['top_x']); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval_table, $format_table, $set['avg'], $set['total'], $set['top_x']); + } + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + return $out; +} + +function baw_display_visitors($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_CONF_DIS; + $format = array( // first line + 0 => array ('title'=> $BAW_MES[81], 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 2 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 3 => array ('title'=> $BAW_MES[75], 'format' => 'layout_bytes'), + 4 => array ('title'=> $BAW_MES['ratio_pages_hits'], 'format' => 'layout_ratio', 'ratio' => '2/1'), + 5 => array ('title'=> $BAW_MES[9], 'format' => 'layout_date'), + ); + $h_data = array(0,0,0,'latest_date'=> 0); + $s_data = array(0,0,0,'latest_date'=> 0); + $i = 0; + $hashotlinks = false; + $hasbots = false; + if ($val = baw_data($BAW_CURR['site_name'], "VISITOR", $BAW_CURR['yearmonth'])) { + baw_debug("data loaded"); + foreach ($val as $dns => $data) { + // $infolink = baw_create_link("?", "javascript:neww('$dns','{$dns}XXX')"); + // $line[] = array ('data'=> $infolink, 'class' => "aligncenter", 'format' => 'layout_index'); + //if (!$set['hidebots'] or $data[1] !== $data[2]) { + $ratio = 0; + if ($data[0] > 0) { + $ratio = $data[1] / $data[0]; + } + // hotlinks & Bots + if ($data[3] =='') { + $data[3] = 0; + } + // $data[3] = settype($data[3], 'int'); + if ($data[0] == 0 && $data[1] !== 0) { + $h_data['latest_date'] = max($data[3], $h_data['latest_date']); + $h_data[0] += $data[0]; + $h_data[1] += $data[1]; + $h_data[2] += $data[2]; + $hashotlinks = true; + } else if ($ratio <= $BAW_CONF_DIS['visitors']['assumebot']) { + $s_data['latest_date'] = max($data[3], $s_data['latest_date']); + $s_data[0] += $data[0]; + $s_data[1] += $data[1]; + $s_data[2] += $data[2]; + $hasbots = true; + } else { + $val[$i] = array( + $dns, + $data[0], + $data[1], + $data[2], + baw_num_format($ratio, 2), + $data[3] + ); + } + // try extra to regain the memory here since this is the largest function + $val[$dns] = NULL; + unset($val[$dns]); + $i++; + } + if ($hasbots) { + $val['script'] = array( + $BAW_MES['assumedscript'], + $s_data[0], + $s_data[1], + $s_data[2], + $s_data[1] / $s_data[0], + $s_data['latest_date'] + ); + } + if ($hashotlinks) { + $val['hotlinks'] = array( + $BAW_MES['hotlinks_proxies'], + $h_data[0], + $h_data[1], + $h_data[2], + 0, + $h_data['latest_date'] + ); + } + + $val = baw_array_sorting($val, $set['sort'], $set['sort_dir']); + baw_debug("data sorted"); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $val, $format, $set['avg'], $set['total'], $set['top_x']); + } + return $out; +} + +function baw_display_logins($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF; + $format = array( + 0 => array ('title'=> $BAW_MES[94], 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 2 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 3 => array ('title'=> $BAW_MES[75], 'format' => 'layout_bytes'), + 4 => array ('title'=> $BAW_MES[9], 'format' => 'layout_date'), + ); + + $val = array(); + if ($val = baw_data($BAW_CURR['site_name'], "LOGIN", $BAW_CURR['yearmonth'])) { + $val = baw_array_sorting($val, $set['sort'], $set['sort_dir']); + foreach ($val as $id => $data) { + $val[$id] = array( + $id, + $data[0], + $data[1], + $data[2], + $data[3] + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $val, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_robots($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[53], 'format' => 'layout_text'), + 1 => array ('percent' => false, 'title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 2 => array ('title'=> $BAW_MES[57] . " (robots.txt)", 'format' => 'layout_hits'), + 3 => array ('title'=> $BAW_MES[75], 'format' => 'layout_bytes'), + 4 => array ('title'=> $BAW_MES[9], 'format' => 'layout_date'), + ); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], "ROBOT", $BAW_CURR['yearmonth'])) { + foreach ($val as $robot => $data) { + if (isset($BAW_LIB['robots'][$robot])) { + $robot_txt = $BAW_LIB['robots'][$robot]; + } else { + $robot_txt = $robot; + } + $val[$robot] = array( + $robot_txt, + $data[0]-$data[3], + $data[3], + $data[1], + $data[2], + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $val = baw_array_sorting($val, $set['sort'], $set['sort_dir']); + $out .= baw_render_table($set['name'], $val, $format, $set['avg'], $set['total'], $set['top_x']); + } + return $out; +} + +function baw_display_worms($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[163], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[167], 'format' => 'layout_text'), + 2 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 3 => array ('title'=> $BAW_MES[75], 'format' => 'layout_bytes'), + 4 => array ('title'=> $BAW_MES[9], 'format' => 'layout_date'), + ); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], "WORMS", $BAW_CURR['yearmonth'])) { + foreach ($val as $worm => $data) { + $val[$worm] = array( + $BAW_LIB['worms']['names'][$worm], + $BAW_LIB['worms']['targets'][$worm], + $data[0], + $data[1], + $data[2] + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $val = baw_array_sorting($val, $set['sort'], $set['sort_dir']); + $out .= baw_render_table($set['name'], $val, $format, $set['avg'], $set['total'], $set['top_x']); + } + return $out; +} + +function baw_display_sessions($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[117], 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title'=> $BAW_MES[10], 'format' => 'layout_visits') + ); + + $newval = array(); + $sum = 0; // sum for "unknown" + if ($val = baw_data($BAW_CURR['site_name'], "SESSION", $BAW_CURR['yearmonth'])) { + foreach ($BAW_LIB['sessions'] as $timespan) { + $newval[$timespan] = array($timespan, 0); + if (isset($val[$timespan][0])) { + $newval[$timespan][1] = $val[$timespan][0]; + $sum += $val[$timespan][0]; + } + } + $unknown = $BAW_CURR['thismonth']['hits'] - $sum; + $newval['Unknown'] = array('Unknown', $unknown); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + // $newval = baw_array_sorting($newval, 1, SORT_DESC); + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], false); + } + return $out; +} + +function baw_display_filetype($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format_table = array( + 0 => array ('title'=> $BAW_MES[73], 'format' => 'layout_text', 'colspan' => 3), + 1 => array ('format' => 'layout_text'), + 2 => array ('format' => 'layout_text'), + 3 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 4 => array ('percent' => true, 'title'=> $BAW_MES[75], 'format' => 'layout_bytes'), + 5 => array ('title'=> $BAW_MES[100], 'format' => 'layout_bytes'), + 6 => array ('title'=> $BAW_MES[101], 'format' => 'layout_bytes'), + 7 => array ('title'=> $BAW_MES[99], 'format' => 'layout_bytes'), + ); + $format_chart = array( + 0 => array ('title'=> $BAW_MES[73], 'format' => 'layout_text', 'colspan' => 3), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 3 => array ('percent' => true, 'title'=> $BAW_MES[75], 'format' => 'layout_bytes'), + ); + + $newval_table = array(); + $newval_chart = array(); + if ($val = baw_data($BAW_CURR['site_name'], "FILETYPES", $BAW_CURR['yearmonth'])) { + // Files type - Hits - Bandwidth - Bandwidth without compression - Bandwidth after compression + $val = baw_array_sorting($val, $set['sort'], $set['sort_dir']); + foreach ($val as $type => $data) { + $icon = ''; + if (isset($BAW_LIB['files']['icons'][$type])) { + $iconname = $BAW_LIB['files']['icons'][$type]; + $icon = baw_create_image($BAW_CONF['icons_url'] . "/mime/$iconname.png" , array("alt" => $iconname, "title" => $iconname)); + } + if ($type == 'Unknown') { + $type_text = "?"; + $desc = $type; + } else { + $type_text = $type; + $desc = @$BAW_LIB['files']['types'][$BAW_LIB['files']['family'][$type]]; + } + $newval_table[$type] = array( + $icon, + $type_text, + $desc, + $data[0], + $data[1], + $data[2], + $data[3], + $data[2] - $data[3] + ); + $newval_chart[$type] = array( + $icon, + $type_text, + $data[0], + $data[1], + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + + // $chart = baw_array_sorting($chart, $set['sort'], $set['sort_dir']); + // $pieval = baw_array_sorting($pieval, 1, $set['sort_dir']); + $out = ''; + if ($set['chart']) { + $out .= baw_render_htmlchart($newval_chart, $format_chart, $set['avg'], $set['top_x']); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval_table, $format_table, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_urls($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF; + $format = array( + 0 => array ('title'=> $BAW_MES[19], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[29], 'format' => 'layout_pages'), + 2 => array ('title'=> $BAW_MES[106], 'format' => 'layout_bytes'), + 3 => array ('title'=> $BAW_MES[104], 'format' => 'layout_hits'), + 4 => array ('title'=> $BAW_MES[116], 'format' => 'layout_hits') + ); + $val = array(); + if ($val = baw_data($BAW_CURR['site_name'], "SIDER", $BAW_CURR['yearmonth'])) { + foreach ($val as $url => $data) { + $link = baw_create_link($url, "http://{$BAW_CURR['site_name']}$url", array(), true); + // URL - Pages - Bandwidth - Entry - Exit + $val[$url] = array( + $link, + $data[0], + $data[1]/$data[0], // average size per page instead of sum + $data[2], + $data[3] + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $val = baw_array_sorting($val, $set['sort'], $set['sort_dir']); + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $val, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_paths($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF; + $format = array( + 0 => array ('title'=> $BAW_MES['files_paths'], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[29], 'format' => 'layout_pages'), + ); + $val = array(); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], "SIDER", $BAW_CURR['yearmonth'])) { + foreach ($val as $url => $data) { + $full_url = "http://{$BAW_CURR['site_name']}$url"; + $url_array = parse_url($full_url); + $link_url = "http://{$BAW_CURR['site_name']}" . $url_array['path']; + $link = baw_create_link($url_array['path'], $link_url, array(), true); + if (!isset($newval[$url_array['path']])) { + $newval[$url_array['path']] = array( + 0 => $link, + 1 => $data[0] + ); + } else { + $newval[$url_array['path']][1] += $data[0]; + } + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_os($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format_table = array( + 0 => array ('title'=> $BAW_MES[59], 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $format_chart = array( + 0 => array ('title'=> $BAW_MES[59], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $newval_table = array(); + $newval_chart = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'OS', $BAW_CURR['yearmonth'])) { + $newval_table = $BAW_LIB['os']['families']; // create an array where the main are already + if ($BAW_CONF['module'] == 'drupal') { + $url = "/{$BAW_CONF['drupal_base']}/details/unknownos/{$BAW_CURR['month']}/{$BAW_CURR['year']}"; + } else { + $url = "{$BAW_CONF['site_url']}/index.php?site={$BAW_CURR['site_name']}&month={$BAW_CURR['month']}&year={$BAW_CURR['year']}&action=get_fulltable&what=unknownos"; + } + // iterate all the data + foreach ($val as $os => $data) { + $isnew = true; // this os has not been added to newval yet (not families) + // iterate all the std. OS types and add the date to the curret one if matches + foreach ($BAW_LIB['os']['codes'] as $code) { + if (stristr($os, $code) !== false) { + $newval_table[$code][2] += $data[0]; // found it, add stats + $iconid = $code; + $isnew = false; // we have the stats now + } + } + if ($isnew) { // this is an additional, non-family os + $iconid = $os; + $os_link = $BAW_LIB['os']['list'][$os]; + $newval_table[$os] = array('', $os_link, $data[0]); + } + if ($os == 'Unknown') { + $newval_table[$os][1] = baw_create_link($BAW_MES[0], $url); + } + $icon = baw_create_image( + $BAW_CONF['icons_url'] . "/os/" . str_replace('/', '', + strtolower($iconid)) . '.png', + array('title' => strip_tags($newval_table[$iconid][1])) + ); + $newval_table[$iconid][0] = $icon; + } + $newval_table = baw_array_sorting($newval_table, $set['sort'], $set['sort_dir']); + // clean out data with 0 hits + foreach ($newval_table as $id => $data) { + if ($data[2] == 0) { + unset ($newval_table[$id]); + } else { // copy valid points into chart array + $newval_chart[$id] = array( + $data[0], + $data[2] + ); + } + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + + $out = ''; + if ($set['chart']) { + $out .= baw_render_htmlchart($newval_chart, $format_chart, $set['avg'], $set['top_x']); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval_table, $format_table, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_osversions($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format_table = array( + 0 => array ('title'=> $BAW_MES[59], 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $format_chart = array( + 0 => array ('title'=> $BAW_MES[59], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + if ($val = baw_data($BAW_CURR['site_name'], 'OS', $BAW_CURR['yearmonth'])) { + if ($BAW_CONF['module'] == 'drupal') { + $url = "/{$BAW_CONF['drupal_base']}/details/unknownos/{$BAW_CURR['month']}/{$BAW_CURR['year']}"; + } else { + $url = "{$BAW_CONF['site_url']}/index.php?site={$BAW_CURR['site_name']}&month={$BAW_CURR['month']}&year={$BAW_CURR['year']}&action=get_fulltable&what=unknownos"; + } + $newval_table = array(); + foreach ($val as $os => $data) { + $iconid = $os; + $os_link = $BAW_LIB['os']['list'][$os]; + $icon = baw_create_image( + $BAW_CONF['icons_url'] . "/os/" . str_replace('/', '', + strtolower($iconid)) . '.png', + array('title' => strip_tags($os_link)) + ); + $newval_table[$os] = array($icon, $os_link, $data[0]); + if ($os == 'Unknown') { + $newval_table[$os][1] = baw_create_link($BAW_MES[0], $url); + } + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $newval_table = baw_array_sorting($newval_table, 2, $set['sort_dir']); + $out = ''; + if ($set['chart']) { + $newval_chart = array(); + foreach ($newval_table as $os => $data) { + $newval_chart[$os] = array($data[0], $data[2]); + } + $out .= baw_render_htmlchart($newval_chart, $format_chart, $set['avg'], $set['top_x']); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval_table, $format_table, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_unknownos($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[46], 'format' => 'layout_text'), + 1 => array ('percent' => false, 'title'=> $BAW_MES[9], 'format' => 'layout_date') + ); + $val = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'UNKNOWNREFERER', $BAW_CURR['yearmonth'])) { + $newval = array(); + foreach ($val as $os_ver => $data) { + $os_ver = strip_tags($os_ver); + $newval[] = array($os_ver, $data[0]); + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_browsers($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format_table = array( + 0 => array ('title'=> $BAW_MES[21], 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('title'=> $BAW_MES[111], 'format' => 'layout_text'), + 3 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $format_chart = array( + 0 => array ('title'=> $BAW_MES[21], 'format' => 'layout_text',), + 1 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $search = array( + '\\s', + '\\-' + ); + $replace = array( + "_", + "-" + ); + $newval_table = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'BROWSER', $BAW_CURR['yearmonth'])) { + $lib = $BAW_LIB['browser']['names']; + if ($BAW_CONF['module'] == 'drupal') { + $url = "/{$BAW_CONF['drupal_base']}/details/unknownbrowser/{$BAW_CURR['month']}/{$BAW_CURR['year']}"; + } else { + $url = "{$BAW_CONF['site_url']}/index.php?site={$BAW_CURR['site_name']}&month={$BAW_CURR['month']}&year={$BAW_CURR['year']}&action=get_fulltable&what=unknownbrowser"; + } + // iterate all browsers in the library + foreach ($lib as $browser => $description) { + // get the icon + $icon = ''; + if (isset($BAW_LIB['browser']['icons'][$browser])) { + $icon = $BAW_LIB['browser']['icons'][$browser]; + $icon = str_replace($search, $replace, $icon); + $icon = baw_create_image( + $BAW_CONF['icons_url'] . "/browser/$icon.png", + array('title' => strip_tags($description)) + ); + } else { + // we have to create an icon since the chart is indexed by the icon + // html. they have to be different each. + $icon = baw_create_image( + $BAW_CONF['site_url'] . "/icons/empty.png", + array('title' => strip_tags($description)) + ); + } + // grabber ? + $grabber = $BAW_MES[113]; + if (isset($BAW_LIB['browser']['grabbers'][$browser])) { + $grabber = $BAW_MES[112]; + } + // create table line for this browser since we dont need versions + $newval_table[$browser] = array($icon, $description, $grabber, 0); + if ($browser == 'Unknown') { + $newval_table[$browser][1] = baw_create_link($BAW_MES[0], $url); + $newval_table[$browser][2] = '?'; + } + // summ all occurences of this browser + foreach ($val as $browser_ver => $hits) { + // only add if hits and if the browser matches + if (($hits > 0) and stristr($browser_ver, $browser) !== false) { + @$newval_table[$browser][3] += $hits[0]; + } + } + // kill zero-value browsers + if ($newval_table[$browser][3] == 0) { + unset($newval_table[$browser]); + } + } + $newval_table = baw_array_sorting($newval_table, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + + $out = ''; + if ($set['chart']) { + foreach ($newval_table as $browser => $data) { + $newval_chart[$browser] = array($data[0], $data[3]); + } + $out .= baw_render_htmlchart($newval_chart, $format_chart, $set['avg'], $set['top_x']); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval_table, $format_table, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_browserversions($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format_table = array( + 0 => array ('title'=> $BAW_MES['browser_versions'], 'format' => 'layout_text', 'colspan' => 3), + 1 => array ('format' => 'layout_text'), + 2 => array ('format' => 'layout_text'), + 3 => array ('title'=> $BAW_MES[111], 'format' => 'layout_text'), + 4 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $format_chart = array( + 0 => array ('title'=> $BAW_MES['browser_versions'], 'format' => 'layout_text'), + 1 => array ('format' => 'layout_text'), + 2 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $search = array( + '\\s', + '\\-' + ); + $replace = array( + "_", + "-" + ); + $newval_table = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'BROWSER', $BAW_CURR['yearmonth'])) { + if ($BAW_CONF['module'] == 'drupal') { + $url = "/{$BAW_CONF['drupal_base']}/details/unknownbrowser/{$BAW_CURR['month']}/{$BAW_CURR['year']}"; + } else { + $url = "{$BAW_CONF['site_url']}/index.php?site={$BAW_CURR['site_name']}&month={$BAW_CURR['month']}&year={$BAW_CURR['year']}&action=get_fulltable&what=unknownbrowser"; + } + $lib = $BAW_LIB['browser']['names']; + // iterate all browsers in the library + foreach ($val as $browser_ver => $hits) { + // separate text from numbers/points + preg_match('/([a-zA-Z\W]+)((.?([0-9]))*)/', $browser_ver, $matches); + $browser = $matches[1]; + $version = $matches[2]; + + $icon = ''; + $grabber = $BAW_MES[113]; + if (isset($BAW_LIB['browser']['names'][$browser])) { + $description = $lib[$browser]; + if (isset($BAW_LIB['browser']['icons'][$browser])) { + $icon = $BAW_LIB['browser']['icons'][$browser]; + $icon = str_replace($search, $replace, $icon); + $icon = baw_create_image( + $BAW_CONF['icons_url'] . "/browser/$icon.png", + array('title' => strip_tags($description) . " " . $version) + ); + } else { + $icon = baw_create_image( + $BAW_CONF['site_url'] . "/icons/empty.png", + array('title' => strip_tags($description) . " " . $version) + ); + } + } else { + $description = $browser_ver; + $grabber = '?'; + } + // grabber ? + if (isset($BAW_LIB['browser']['grabbers'][$browser])) { + $grabber = $BAW_MES[112]; + } + @$newval_table[$browser_ver] = array($icon, $description , $version, $grabber, $hits[0]); + if ($browser == 'Unknown') { + $newval_table[$browser][1] = baw_create_link($BAW_MES[0], $url); + $newval_table[$browser][2] = '?'; + } + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $newval_table = baw_array_sorting($newval_table, $set['sort'], $set['sort_dir']); + $out = ''; + if ($set['chart']) { + $newval_chart = array(); + foreach ($newval_table as $browser => $data) { + $newval_chart[$browser] = array($data[0], $data[2], $data[4]); + } + $out .= baw_render_htmlchart($newval_chart, $format_chart, $set['avg'], $set['top_x']); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval_table, $format_table, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_unknownbrowser($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[50], 'format' => 'layout_text'), + 1 => array ('percent' => false, 'title'=> $BAW_MES[9], 'format' => 'layout_date') + ); + $val = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'UNKNOWNREFERERBROWSER', $BAW_CURR['yearmonth'])) { + $newval = array(); + foreach ($val as $browser_ver => $data) { + $browser_ver = strip_tags($browser_ver); + $newval[] = array($browser_ver, $data[0]); + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_screensizes($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[135], 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $format_chart = array( + 0 => array ('title'=> $BAW_MES[135], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $val = array(); + $newval = array(); + $url = $BAW_CONF['site_url'] . "/icons/screen.png"; + if ($val = baw_data($BAW_CURR['site_name'], 'SCREENSIZE', $BAW_CURR['yearmonth'])) { + foreach ($val as $size => $data) { + $size_arr = explode("x", $size); + $sizex = $size_arr[0] / 80; + $sizey = $size_arr[1] / 80; + $img_arr = array( + 'height'=> $sizey, + 'width' => $sizex, + 'title' => $size, + 'class' => 'screensize' + ); + $newval[$size] = array( + baw_create_image($url, $img_arr), + $size, + $data[0], + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + $out = ''; + if ($set['chart']) { + $newval_chart = array(); + foreach ($newval as $size => $data) { + $newval_chart[$size] = array($data[0], $data[2]); + } + $out .= baw_render_htmlchart($newval_chart, $format_chart, $set['avg'], $set['top_x']); + } + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_se_referers($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + if ($set['favicon']) { + $format = array( + 0 => array ('title'=> $BAW_MES[126], 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 3 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $set['sort']++; + } else { + $format = array( + 0 => array ('title'=> $BAW_MES[126], 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + } + $val = array(); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'SEREFERRALS', $BAW_CURR['yearmonth'])) { + foreach ($val as $id => $data) { + $sename = @$BAW_LIB['searchengines']['names'][$id]; + if ($set['favicon']) { + $image = baw_get_favicon($sename); + $newval[$id] = array( + $image, + $sename, + $data[0], + $data[1] + ); + } else { + $newval[$id] = array( + $sename, + $data[0], + $data[1] + ); + } + + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_referers($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + if ($set['favicon']) { + $format = array( + 0 => array ('title'=> $BAW_MES[127], 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 3 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $set['sort']++; + } else { + $format = array( + 0 => array ('title'=> $BAW_MES[127], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + } + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'PAGEREFS', $BAW_CURR['yearmonth'])) { + foreach ($val as $id => $data) { + if ($data[0] > 0) { + $link = baw_create_link($id, $id, array(), true, true); + if ($set['favicon']) { + $image = baw_get_favicon($id); + $newval[$id] = array($image,$link,$data[0],$data[1]); + + } else { + $newval[$id] = array($link,$data[0],$data[1]); + } + } + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_referer_domains($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB, $BAW_CONF_DIS; + if ($set['favicon']) { + $format = array( + 0 => array ('title'=> sprintf($BAW_MES['by_domains'], $BAW_MES[127]) , 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 3 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $set['sort']++; + } else { + $format = array( + 0 => array ('title'=> sprintf($BAW_MES['by_domains'], $BAW_MES[127]) , 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[56], 'format' => 'layout_pages'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + } + $newval = array(); + $length = $BAW_CONF_DIS['referer_domains']['domain_lvls']; + if ($val = baw_data($BAW_CURR['site_name'], 'PAGEREFS', $BAW_CURR['yearmonth'])) { + foreach ($val as $id => $data) { + if ($data[0] > 0) { + $tld = @parse_url($id); + // we create & flip the array + if ($length !== -1) { + $domain_array = explode(".", $tld['host']); + // we add the x number of elements to the new array + if (!is_numeric(implode("",$domain_array))) { + + $domain_array = array_slice($domain_array, -$length); + } + $domain = implode(".", $domain_array); + } else { + $domain = $tld['host']; + } + $tld = $tld['scheme'] ."://". $domain; + // $tld = str_replace("http://www.", "http://", $tld); + if ($set['favicon']) { + if (!isset($newval[$tld])) { + $image = baw_get_favicon($tld); + $link = baw_create_link($tld, $tld); + $newval[$tld] = array($image, $link, $data[0],$data[1]); + } else { + $newval[$tld][2] += $data[0]; + $newval[$tld][3] += $data[1]; + } + } else { + if (!isset($newval[$tld])) { + $link = baw_create_link($tld, $tld); + $newval[$tld] = array($link, $data[0],$data[1]); + } else { + $newval[$tld][1] += $data[0]; + $newval[$tld][2] += $data[1]; + } + } + } + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + + +function baw_display_hotlinks($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + if ($set['favicon']) { + $format = array( + 0 => array ('title'=> $BAW_MES['referer_hotlinks'], 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $set['sort']++; + } else { + $format = array( + 0 => array ('title'=> $BAW_MES['referer_hotlinks'], 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + } + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'PAGEREFS', $BAW_CURR['yearmonth'])) { + foreach ($val as $id => $data) { + if ($data[0] == 0) { + $link = baw_create_link($id, $id, array(), true); + if ($set['favicon']) { + $image = baw_get_favicon($id); + $newval[$id] = array($image, $link, $data[1]); + } else { + $newval[$id] = array($link, $data[1]); + } + } + } + if ($BAW_CONF['hideempty'] && count($newval) == 0 ) { + return ''; + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_hotlink_domains($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB, $BAW_CONF_DIS; + if ($set['favicon']) { + $format = array( + 0 => array ('title'=> sprintf($BAW_MES['hl_by_domains '], $BAW_MES[127]), 'format' => 'layout_text', 'colspan' => 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $set['sort']++; + } else { + $format = array( + 0 => array ('title'=> sprintf($BAW_MES['hl_by_domains '], $BAW_MES[127]), 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + } + $length = $BAW_CONF_DIS['hotlink_domains']['domain_lvls']; + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'PAGEREFS', $BAW_CURR['yearmonth'])) { + foreach ($val as $id => $data) { + if ($data[0] == 0) { + $tld = @parse_url($id); + if ($length !== -1) { + $domain_array = explode(".", $tld['host']); + // we add the x number of elements to the new array + if (!is_numeric(implode("",$domain_array))) { + + $domain_array = array_slice($domain_array, -$length); + } + $domain = implode(".", $domain_array); + } else { + $domain = $tld['host']; + } + $tld = $tld['scheme'] ."://". $domain; + if ($set['favicon']) { + if (!isset($newval[$tld])) { + $link = baw_create_link($tld, $tld); + $image = baw_get_favicon($tld); + $newval[$tld] = array($image, $link, $data[1]); + } else { + // $newval[$tld][1] += $data[1]; + $newval[$tld][2] += $data[1]; + } + } else { + if (!isset($newval[$tld])) { + $link = baw_create_link($tld, $tld); + $newval[$tld] = array($link, $data[1]); + } else { + // $newval[$tld][1] += $data[1]; + $newval[$tld][1] += $data[1]; + } + } + } + } + // check again since none of the domains might be hotlinking + if ($BAW_CONF['hideempty'] && count($newval) == 0 ) { + return ''; + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + + +function baw_display_searchphrases($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[103], 'format' => 'layout_text'), + 1 => array ('percent'=> true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $val = array(); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'SEARCHWORDS', $BAW_CURR['yearmonth'])) { + foreach ($val as $id => $data) { + $newval[$id] = array( + urldecode($id), + $data[0] + ); + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_searchwords($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[13], 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $val = array(); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'KEYWORDS', $BAW_CURR['yearmonth'])) { + foreach ($val as $id => $data) { + $newval[$id] = array( + urldecode($id), + $data[0], + ); + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, $set['avg'], $set['total'], $set['top_x'], false); + } + return $out; +} + +function baw_display_misc($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[139], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 2 => array ('title'=> $BAW_MES[15], 'format' => 'layout_percent') + ); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'MISC', $BAW_CURR['yearmonth'])) { + foreach ($BAW_LIB['misc'] as $type => $msg) { + @$percent = $val[$type][1] / ($val['TotalMisc'][1] / 100); + $newval[$type] = array($BAW_MES[$msg], @$val[$type][1], $percent); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format); + } + return $out; +} + +function baw_display_errors($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[32], 'format' => 'layout_text', 'colspan'=> 2), + 1 => array ('format' => 'layout_text'), + 2 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 3 => array ('title'=> $BAW_MES[106], 'format' => 'layout_bytes') + ); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'ERRORS', $BAW_CURR['yearmonth'])) { + foreach ($val as $type => $data) { + $ntype = $type; + if ($type == '404') { + if ($BAW_CONF['module'] == 'drupal') { + $ntype = baw_create_link('404', "/{$BAW_CONF['drupal_base']}/details/errors404/{$BAW_CURR['month']}/{$BAW_CURR['year']}"); + } else { + $ntype = baw_create_link('404', "{$BAW_CONF['site_url']}/index.php?site={$BAW_CURR['site_name']}&month={$BAW_CURR['month']}&year={$BAW_CURR['year']}&action=get_fulltable&what=errors404"); + } + } + $newval[$type] = array( + $ntype, $BAW_LIB['http_status'][$type], $data[0], $data[1] + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format); + } + return $out; +} + +function baw_display_errors404($set) { + global $BAW_MES, $BAW_CURR, $BAW_CONF, $BAW_LIB; + $format = array( + 0 => array ('title'=> $BAW_MES[49], 'format' => 'layout_text'), + 1 => array ('title'=> $BAW_MES[57], 'format' => 'layout_hits'), + 2 => array ('title'=> $BAW_MES[127], 'format' => 'layout_text') + ); + $newval = array(); + if ($val = baw_data($BAW_CURR['site_name'], 'SIDER_404', $BAW_CURR['yearmonth'])) { + foreach ($val as $type => $data) { + $newval[$type] = array( + baw_create_link($type, "http://{$BAW_CURR['site_name']}", array(), true), + $data[0], + baw_create_link($data[1],$data[1], array(), true) + ); + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, false, $set['total'], $set['top_x']); + } + return $out; +} +/* + + From0 6240 13402 +From1 3 11 // unknown +From2 5471 8003 // search engine +From3 1956 3723 // external page +From4 10544 208546 // bookmarks/direct +From5 0 0 // newsgroups + +*/ +?> diff --git a/betterawstats/core/display_helpers.php b/betterawstats/core/display_helpers.php new file mode 100644 index 0000000..16f50b9 --- /dev/null +++ b/betterawstats/core/display_helpers.php @@ -0,0 +1,786 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * File contents: + * + * This file contains various functions which generate output to the browser. + * Mainly it contains the index-function that builds the whole site. Other functions + * create menus, links, images etc. + */ + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'display_helpers.php') !== false) { + die ('This file can not be used on its own!'); +} + +/* +* Display Helper Function: run the menus and render the whole page +* called by index.php and baw_action_get_fulltable() as well as config manager +* +* @param arr $settings the 'set'-array from the config for a display section +* @return str HTML +* +*/ +function baw_display_index($settings = array()) { + global $BAW_CONF, $BAW_CONF_DIS, $BAW_CONF_DIS_DEF, $BAW_MES, $BAW_LIB; + global $BAW_DFILES, $BAW_CURR, $BAW_D; + + // this comes second since site_name is unknown otherwise + echo baw_site_header($BAW_CURR['site_name']); + $content = baw_top_menu_bar() + . "
\n"; + $tmp = array(); // temp array where we record which section has data to show/hide menu options + + // sort the charts according to order in config + $BAW_CONF_DIS = baw_array_sorting($BAW_CONF_DIS, 'order', SORT_ASC); + // ---------- CONTENT BOX -------------------------------------------------- + // this should be removed once we move to beta. + + if ($BAW_CURR['site_name'] == 'all_months') { + $settings['section'] = "months"; + $section = $settings['section']; + $function = "baw_display_$section"; + $temp_conf = $BAW_CONF_DIS[$section]; + $temp_conf['chart'] = true; + $temp_conf['table'] = false; + $temp_conf['name'] = $BAW_CONF_DIS_DEF[$section]['name']; + baw_debug("Printing Stats for: " . $BAW_CONF_DIS_DEF[$section]['name']); + $content .= $function($temp_conf); + } else if ($BAW_CURR['site_name'] == 'all_days') { + $settings['section'] = "days"; + $section = $settings['section']; + $function = "baw_display_$section"; + $temp_conf = $BAW_CONF_DIS[$section]; + $temp_conf['chart'] = true; + $temp_conf['table'] = false; + $temp_conf['name'] = $BAW_CONF_DIS_DEF[$section]['name']; + baw_debug("Printing Stats for: " . $BAW_CONF_DIS_DEF[$section]['name']); + $content .= $function($temp_conf); + } else if (isset($settings['section'])) { + $section = $settings['section']; + $function = "baw_display_$section"; + $temp_conf = $BAW_CONF_DIS[$section]; + $temp_conf['top_x'] = $BAW_CONF['maxlines']; + $temp_conf['name'] = $BAW_CONF_DIS_DEF[$section]['name']; + baw_debug("Printing Stats for: " . $BAW_CONF_DIS_DEF[$section]['name']); + $content .= baw_section_header($section, $temp_conf['name'], false, 'menu_section') + . $function($temp_conf) + . baw_section_footer(); + } else { + $content .= "\n\n"; + if ($BAW_CONF['layout_type'] == 'horizontal') { + foreach ($BAW_LIB['item_groups'] as $group => $group_details) { + $group_items = $group_details['members']; + $menubuttons = "
"; + $stats_section = ''; + $item_id = 0; + $count_members = count($group_details['members']); + foreach ($group_details['members'] as $item) { + $sect_data = $BAW_CONF_DIS[$item]; + $sect_data['name'] = $item; + $function = "baw_display_$item"; + if (function_exists($function)) { + baw_debug("Printing Stats for: $function"); + $stats_html = $function($sect_data); + if ($sect_data['show'] == true && + (strlen($stats_html)> 1 || !$BAW_CONF['hideempty'])) { + $stats_section .= "\n\n"; + $button_title = $BAW_CONF_DIS_DEF[$item]['name']; + if ($item_id == 0) { + $button_class = "menu_button_active"; + } else { + $button_class = "menu_button_inactive"; + } + $menubuttons .= "
$button_title
\n"; + if ($item == 'weekdays' && !isset($BAW_CURR['wdays']['count'])) { + $setarr = array('collapse' => false, 'chart' => false,'table' => false); + baw_display_weekdays($setarr); + } + $title = $BAW_CONF_DIS_DEF[$item]['name']; + $collapse = $sect_data['collapse']; + $name = "{$group}_$item_id"; + $collapse = false; + if ($item_id == 0) { + $class = 'menu_section_active'; + } else { + $class = 'menu_section_inactive'; + } + $stats_section .= baw_section_header($name, $title, $collapse, $class) + . $stats_html + . baw_section_footer(); + $tmp[$item] = true; + $stats_section .= "\n\n"; + $item_id++; + } else { + $tmp[$item] = false; + } + } + } + if (strlen($stats_section) > 1) { + $content .= "\n\n"; + $content .= baw_section_header($group, $group_details['title'], false, 'group_title'); + $menubuttons .= "
"; + $content .= $menubuttons . "\n$stats_section\n"; + $content .= baw_section_footer(); + $content .= "\n\n"; + $tmp[$group] = true; + } else { + $tmp[$group] = false; + } + } + } else { + foreach ($BAW_CONF_DIS as $section => $sect_data) { + $stats_html = ''; + $content .= "\n\n"; + $title = $BAW_CONF_DIS_DEF[$section]['name']; + $collapse = $sect_data['collapse']; + $name = $section; + $sect_data['name'] = $section; + $function = "baw_display_$section"; + if ($sect_data['show'] == true && function_exists($function)) { + baw_debug("Printing Stats for: baw_display_$section"); + $stats_html = $function($sect_data); + if (strlen($stats_html)> 1) { + $content .= baw_section_header($name, $title, $collapse, 'menu_section') + . $stats_html + . baw_section_footer(); + $tmp[$section] = true; + } else { + $tmp[$section] = false; + } + } + $content .= "\n\n"; + } + } + $content .= "\n\n"; + } + + $content .= "
"; + baw_debug("Starting to build menu"); + // ---- MENU BOX ----------------------------------------------------------- + $menubox = "\n\n\n" + . "
\n" + . baw_sites_dropdown(); + $qstrng = ''; + if (strlen($_SERVER['QUERY_STRING']) > 0) { + $qstrng = '?' .$_SERVER['QUERY_STRING']; + } + $url = "{$BAW_CONF['site_url']}/index.php$qstrng"; + $menubox .= "
    \n" + . "
  • \n" + . " " + . baw_create_link($BAW_MES[77], "$url#", array('class' => 'leftlink')) . "\n " + . "
  • \n"; + $c = 1; // top link was '0' + if ($BAW_CURR['site_name'] == 'all_months' or $BAW_CURR['site_name'] == 'all_days') { + $sites = array_keys($BAW_DFILES); + foreach ($sites as $site) { + $class = baw_even($c, 'menu_even', 'menu_odd'); + $menubox .= "
  • \n" + . " " . baw_create_link($site, "$url#site_$site") . "\n" + . "
  • \n"; + $c++; + } + } else { + if ($BAW_CONF['layout_type'] == 'horizontal') { + foreach ($BAW_LIB['item_groups'] as $group => $group_details) { + if ($tmp[$group]) { + $class = baw_even($c, 'menu_even', 'menu_odd'); + $name = $group_details['title']; + $menubox .= "
  • \n" + . " " . baw_create_link($name, "$url#h2_$group") . "\n" + . "
  • \n"; + $c++; + } + } + } else if (isset($settings['section'])) { + // we are doing a full list + $url = str_replace('&action=get_fulltable&what='. $settings['section'], '', $url); + $menubox .= "
  • \n" + . baw_create_link($BAW_MES['back'], $url) . "\n" + . "
  • \n"; + } else { + $count_sections = count($BAW_CONF_DIS); + foreach ($BAW_CONF_DIS as $section => $sect_data) { + if ($sect_data['show'] && + ($tmp[$section] || !$BAW_CONF['hideempty'])) { + $class = baw_even($c, 'menu_even', 'menu_odd'); + $name = $BAW_CONF_DIS_DEF[$section]['name']; + $menubox .= "
  • \n" + . " " . baw_create_link($name, "$url#h2_$section", array('class' => 'leftlink')) . "\n" + . baw_display_list_icons ($section, array('info'), false) . "\n" + . "
  • \n"; + $c++; + } + } + } + } + + $menubox .= "
\n"; + $menubox_end = "\n
\n\n"; + baw_debug("Menu finished"); + $finaltime = baw_ptime(); + $out = $menubox + . baw_display_version(" in $finaltime, max menory: " . baw_byte_format(memory_get_peak_usage(true))) + . $menubox_end . $content + . baw_site_footer(); + return $out; +} + +/* +* Display Helper Function: display the menu bar on the top of the page +* called by baw_display_index +* +* @return str HTML +* +*/ +function baw_top_menu_bar() { + global $BAW_MES, $BAW_CONF_DEF, $BAW_CONF, $BAW_CURR; + // sites / dates dropdown + $n1 = $n2 = ''; + if ($BAW_CONF['auto_submit_form' ]) { + $n1 = "\n"; + } + $out = "\n
    \n" + . "
  • \n" + . "
    \n" + . "
    \n" + . " \n" + . baw_date_dropdown(); + if (isset($_GET['action'])) { + $out .= " \n"; + } + if (isset($_GET['what'])) { + $out .= " \n"; + } + $out .= " $n1$n2\n" + . "
    \n" + . "
    \n"; + + $out .= "
  • \n"; + + $out .= "
  • \n" + . baw_create_link( + $BAW_MES['get_help'], + 'http://betterawstats.com/forum/', + array('class'=>'rightlink') + ). "\n"; + $out .= "
  • \n"; + + $out .= "
  • \n" + . baw_create_link( + $BAW_MES['version_check'], + "http://betterawstats.com/main/index.php?lang=eng&action=versioncheck&version=" + . $BAW_CONF_DEF[$BAW_MES['cfg_advanced_settings']]['version']['default'] + ) . "\n"; + $out .= "
  • \n"; + + $out .= "
  • "; + if ($BAW_CONF['online_config'] && (baw_is_writable($BAW_CONF['site_path'] . '/config.php'))) { + $out .= baw_create_link( + $BAW_MES['config_editor'], + "{$BAW_CONF['site_url']}/index.php?action=config_editor" + ) . "\n"; + } else if ($BAW_CONF['online_config']) { + $out .= $BAW_MES['config_not_writable']. "\n"; + } + $out .= "
  • \n"; + + @session_start(); + if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) { + $out .= "
  • "; + if ($BAW_CONF['online_config'] && (baw_is_writable($BAW_CONF['site_path'] . '/config.php'))) { + $out .= baw_create_link( + $BAW_MES['cfg_logout'], + "{$BAW_CONF['site_url']}/index.php?action=do_logout" + ) . "\n"; + } + $out .= "
  • \n"; + } + + $out .= "
\n\n"; + + return $out; +} + +/* +* Display Helper Function: display a text including the version and other info +* called by baw_display_index +* +* @param str $text text to be included in the message +* @return str HTML +* +*/ +function baw_display_version($text = '') { + global $BAW_CONF_DEF, $BAW_MES; + + $link = baw_create_link('BetterAWstats', 'http://betterawstats.com'); + $out = "
\n " + . sprintf($BAW_MES['created_by'], $link) + . " {$BAW_CONF_DEF[$BAW_MES['cfg_advanced_settings']]['version']['default']}\n" + . " $text\n" + . "
"; + return $out; +} + +/* +* Display Helper Function: display links for left-hand menu block +* called by baw_display_index +* +* @param str $section which section is it? (for link) +* @param str $text text to use as alt of icon or instead of icon +* @param bol $useicon shall we display the icon? +* @param bol $getonlyone shall we get only one or all three? +* @param bol $btn if true, we use alternative image with button layout +* @return str HTML +* +*/ +function baw_display_list_icons ($section, $exclude, $btn) { + global $BAW_CONF_DIS, $BAW_CONF_DIS_DEF, $BAW_CONF, $BAW_MES, $BAW_CURR, $BAW_MES; + + if ($btn) { + $btn_str = '_btn'; + } else { + $btn_str = ''; + } + $links_arr = array( + 'info' => array( + 'check' => @$BAW_MES["hlp_$section"], + 'image' => $BAW_CONF['site_url'] . "/icons/help.png", + 'msg' => htmlentities(@$BAW_MES["hlp_$section"]), + 'what' => 'span', + ), + 'full_list' => array( + 'check' => @$BAW_CONF_DIS[$section]['top_x'], + 'image' => $BAW_CONF['site_url'] ."/icons/fulllist{$btn_str}.png", + 'msg' => $BAW_MES[80], + 'what' => $section, + ), + 'versions' => array( + 'check' => @$BAW_CONF_DIS_DEF[$section]['hasversions'], + 'image' => $BAW_CONF['site_url'] ."/icons/versions{$btn_str}.png", + 'msg' => $BAW_MES['version_info'], + 'what' => @$BAW_CONF_DIS_DEF[$section]['hasversions'], + ), + 'unknown' => array( + 'check' => @$BAW_CONF_DIS_DEF[$section]['hasunknown'], + 'image' => $BAW_CONF['site_url'] ."/icons/unknown{$btn_str}.png", + 'msg' => $BAW_MES['unknown_list'], + 'what' => @$BAW_CONF_DIS_DEF[$section]['hasunknown'], + ), + ); + + $out = ''; + $i = 1; + foreach ($links_arr as $link => $settings) { + if ((!in_array($link, $exclude)) && isset($settings['check'])) { + $icon = baw_create_image($settings['image'], array('title'=> $settings['msg'],'alt'=> $settings['msg'])) . " "; + $class = "icon_indent_$i"; // we indent more for each icon + if ($link == 'info') { // we have a hover-text + $out .= " $icon{$settings['msg']}\n"; + $i++; + } else { // we have a link + $out .= " " + . baw_display_list_link($icon, $settings['msg'], $settings['what'], $class) + . "\n"; + $i++; + } + } + } + return $out; +} + +function baw_display_list_link($text, $title, $section, $class) { + global $BAW_CONF, $BAW_CURR; + $out = ''; + if ($BAW_CONF['module'] == 'drupal') { + $url = "/{$BAW_CONF['drupal_base']}/details/$section/{$BAW_CURR['month']}/{$BAW_CURR['year']}"; + } else { + $url = "{$BAW_CONF['site_url']}/index.php?site={$BAW_CURR['site_name']}&month={$BAW_CURR['month']}&year={$BAW_CURR['year']}" + . "&action=get_fulltable&what=$section"; + } + $out .= baw_create_link($text, $url, array('title'=>$title, 'class'=>$class), false, false); + return $out; +} + +/* +* Display Helper Function: display only and the full table of one section +* called by index.php +* +* @return str HTML +* +*/ +function baw_action_get_fulltable() { + global $BAW_CONF; + $settings = array(); + $out = ''; + if (isset($_GET['what'])) { + $what = $_GET['what']; + $settings['section'] = $what; + } else { + $out = baw_display_index(); + } + if (isset($_GET['sort'])) { + $sort = $_GET['sort']; + $settings['sort'] = $sort; + }; + $out .= baw_display_index($settings); + return $out; +} + +/* +* Display Helper Function: create a HTML link from parameters +* +* @param str $content the text to be linked +* @param str $url the url to link to +* @param arr $attr var attributes to include in the links +* @param bol $codehtml do we use htmlspecialchars() on the content? +* @param bol $shorten do we shorten the content according to config? +* @return str HTML +* +*/ +function baw_create_link ($content, $url, $attr=array(), $codehtml = false, $shorten = true) { + global $BAW_CONF; + if ($url == '-') { + return $url; + } + $attr_str = ''; + if (strlen($content) > $BAW_CONF['field_length'] && $shorten) { + $content = substr($content, 0, $BAW_CONF['field_length']-3) . "..."; + } + $url = htmlspecialchars($url); + if ($codehtml) { + $content = htmlspecialchars($content); + } + if (!isset($attr['title'])) { + $attr['title'] = $content; + } + $check = strpos($url, $BAW_CONF['site_url']); + if ($check !== 0) { + if (isset($attr['class'])) { + $attr['class'] .= " ext_link"; + } else { + $attr['class'] = "ext_link"; + } + } + foreach ($attr as $key => $value) { + $attr_str .= " $key=\"$value\""; + } + $out = "$content"; + + return $out; +} + +/* +* Display Helper Function: create a HTML image from parameters +* +* @param str $url the url of the image to link to +* @param arr $attr var attributes to include in the links +* @return str HTML +* +*/ +function baw_create_image($url, $attr=array()) { + global $BAW_CONF; + + $hasalt = false; + $attr_str = ''; + if (!isset($attr['alt'])) { + $attr['alt'] = ' '; + } + foreach ($attr as $key => $value) { + $attr_str .= " $key=\"$value\""; + } + if ($BAW_CONF['module'] !== 'drupal') { + if (strpos($url, 'http://') !== 0 && strpos($url, 'https://') !== 0) { + $url = $BAW_CONF['icons_url'] . $url; + } + } + $out = ""; + return $out; +} + +/* +* Display Helper Function: create the HTML for a favicon of a given URL +* Parses the URL, retrieves the domain and links to the favicon +* +* @param str $url the url of the image to link to +* @return str HTML +* +*/ +function baw_get_favicon($url) { + if ($url !== strip_tags($url)) { // we have a HTML link + $pattern = '/ 16, 'width'=> 16) + ); + } + return $image . $code; +} + +/* +* Display Helper Function: create the HTML of the site header +* switches between HTML/XHTML, displays title, charset etc. +* +* @param str $title title of the page to be used +* @return str HTML +* +*/ +function baw_site_header($title = '') { + global $BAW_CONF_DEF, $BAW_CONF, $BAW_MES; + if ($BAW_CONF['xhtml']) { + $out = ""; + $root_dec = " xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\""; + } else { + $out = "\n"; + $root_dec = ''; + } + $out .= "\n" + ." \n" + ." $title Better AWstats v. {$BAW_CONF_DEF[$BAW_MES['cfg_advanced_settings']]['version']['default']}\n" + ." \n" + ." \n" + ." \n" + ." \n" + ." \n" + ." \n"; + return $out; +} + +/* +* Display Helper Function: create the HTML of the site footer +* +* @return str HTML +* +*/ +function baw_site_footer() { + $out =""; + return $out; +} + +/* +* Display Helper Function: create the HTML of the section header +* +* @param str $name name of the section for the HTML ID +* @param str $title title to be displayed +* @param bol $collapse is it collapsed or not? +* @param str $class which CSS class do we use? +* @return str HTML +* +*/ +function baw_section_header($name, $title, $collapse, $class = 'menu_section') { + global $BAW_CONF; + $buttons = baw_show_expand_collapse($name, $collapse). "\n" + . baw_display_list_icons($name, array(), true); + if ($collapse) { + $show = " style=\"display:none\""; + } else { + $show = ""; + } + $out = "

\n $title\n $buttons\n

\n" + . "
\n"; + return $out; +} + +/* +* Display Helper Function: create the HTML of the expand/collapse button +* +* @param str $name name of the section for JS to identify it +* @return str HTML +* +*/ +function baw_show_expand_collapse($name, $collapse) { + global $BAW_CONF, $BAW_MES; + + $url = $BAW_CONF['site_url'] . "/icons/expand.gif"; + $arr_show = array( + 'class' => "showhidebutton", + 'onclick' => "showElement('{$name}');", + 'title' => $BAW_MES['show'], + 'id' => "button_show_{$name}", + ); + $arr_hide = array( + 'class' => "showhidebutton", + 'onclick' => "hideElement('{$name}');", + 'id' => "button_hide_{$name}", + 'title' => $BAW_MES['hide'], + ); + if ($collapse) { + $arr_hide += array('style' => "display:none"); + } else { + $arr_show += array('style' => "display:none"); + } + $url = $BAW_CONF['site_url'] . "/icons/expand.gif"; + $out = baw_create_image($url, $arr_show); + $url = $BAW_CONF['site_url'] . "/icons/collapse.gif"; + $out .= baw_create_image($url, $arr_hide); + return $out; +} + +/* +* Display Helper Function: create the HTML of footer of a section +* +* @return str HTML +* +*/ +function baw_section_footer() { + $out = "
\n"; + return $out; +} + +/* +* Display Helper Function: create a generic dropdown for HTML forms +* +* @param str $name name of the dropdown for the form identification +* @param arr $list associative array of items to list (ID => NAME) +* @param str $selected entry which should be preselected +* @param str $attr any strng attribute that is added to the \n"; + foreach ($list as $key => $value) { + if (is_bool($selected)) { + if ($selected) { + $selected = 'true'; + } else { + $selected = 'false'; + } + } + if ($key == $selected) { + $sel = ' selected="selected"'; + } else { + $sel = ''; + } + $out .= " \n"; + } + $out .= "\n"; + return $out; +} + +/* +* Display Helper Function: create a year/date dropdown from the current list of +* available datafile dates +* +* @return str HTML +* +*/ +function baw_date_dropdown() { + global $BAW_CURR; + $out = ''; + $out .= baw_generic_dropdown('month', $BAW_CURR['months'], $BAW_CURR['month']); + $out .= baw_generic_dropdown('year', $BAW_CURR['years'], $BAW_CURR['year']); + return $out; +} + +/* +* Display Helper Function: create a dropdown of all sites available from the +* datafiles +* +* @param str $selected preselected item if available +* @param str $fld_name field name of \n"; + foreach ($sites_temp as $site => $filedata) { + $sel = ''; + if ($BAW_CURR['site_name'] == $site) { + $sel = ' selected="selected"'; + } + $site_txt = $site; + if ($site == 'all_months' || $site == 'all_days') { + $site_txt = $BAW_MES[$site]; + } + $out .= " \n"; + } + $out .= "\n" + . "$n1$n2\n" + . "\n" + . "\n"; + if (isset($_GET['action'])) { + $out .= " \n"; + } + if (isset($_GET['what'])) { + $out .= " \n"; + } + $out .= "
\n" + . "\n"; + return $out; +} +?> \ No newline at end of file diff --git a/betterawstats/core/extras.inc.php b/betterawstats/core/extras.inc.php new file mode 100644 index 0000000..79c93e0 --- /dev/null +++ b/betterawstats/core/extras.inc.php @@ -0,0 +1,87 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// DO NOT EDIT THESE 3 LINES +if (strpos ($_SERVER['PHP_SELF'], 'extras.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +// EDIT BELOW HERE +// Please make sure to read /docs/install.txt to see all places where you have to +// edit items to see your extras +// In order to add new sections of extras to the site, please make copies of the +// section below. change all occurences of extra_1 to extra_2 etc and all EXTRA_1 +// to EXTRA_2 etc. Also change the texts as indicated. + +// copy section starts below here +function baw_display_extra_1($set) { // <- change extra_1 to extra_2, 3, 4 etc + global $BAW_MES, $BAW_CURR, $BAW_D, $BAW_CONF, $BAW_LIB, $BAW_CONF_DIS_DEF; + $format = array( // change the 'Screen colors' to other titles below here + 0 => array ('title'=> 'Screen colors', 'format' => 'layout_text'), + 1 => array ('percent' => true, 'title'=> $BAW_MES[57], 'format' => 'layout_hits') + ); + $newval = array(); // change the two following lines from EXTRA_1 to EXTRA_2, 3, 4 etc + if ($val = baw_data($BAW_CURR['site_name'], 'EXTRA_1', $BAW_CURR['yearmonth'])) { + foreach ($val as $type => $data) { + $newval[$type] = array($type, $data[1]) ; + } + } else if ($BAW_CONF['hideempty']){ + return ''; + } + $newval = baw_array_sorting($newval, $set['sort'], $set['sort_dir']); + $out = ''; + if ($set['table']) { + $out .= baw_render_table($set['name'], $newval, $format, false, $set['total'], $set['top_x']); + } + return $out; +} +// copy section ends above here + +// insert copies here + +// Please make sure to read /docs/install.txt to see all places where you have to +// edit items to see your extras +// to add more extras-sections, please copy the following section as often as +// you need and edit the extras_1 to extras_2 etc. Also change the text to +// the desired descriptions. + +// copy section start below here +$BAW_CONF_DIS_DEF['extra_1'] = array ( // please make sure this is unique + 'help' => 'Screen colors of users', // help for config + 'name' => "Color depth", // display name + 'sorting' => array( // what fields can it be sorted by? + 0 => 'Color depth in bits', + 1 => $BAW_MES[57] + ) +); +// copy section end above here + + // insert copies here + +?> \ No newline at end of file diff --git a/betterawstats/core/helpers.inc.php b/betterawstats/core/helpers.inc.php new file mode 100644 index 0000000..b93490f --- /dev/null +++ b/betterawstats/core/helpers.inc.php @@ -0,0 +1,393 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * File contents: + * + * This file contains functions that are used to make checks, format data and do + * other side-functions. + */ + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'helpers.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +/* +* Helper Function: executes a function that is stored in the $BAW_LIB['formats'] +* called by final output functions in /modules/ +* +* @param str $function_str string of format 'baw_num_format(%s);' +* @param str $var data to be filled in +* @return result of the function +* +*/ +function exec_function($function_str=false, $var=false) { + // check if function exists + $out = $var; + if ($function_str && $var !== false) { + $txt = explode('(',$function_str); + $func_name = $txt[0]; + if (function_exists($func_name)) { + $out = eval("return " . sprintf($function_str, $var)); + } else { + $out = "error finding function $func_name ($function_str, $var)"; + } + } + return $out; +} + +/* +* Helper Function: check for various cfg settings to find if they are correct or not +* called by index.php +* +*/ +function baw_check_config() { + global $BAW_CONF, $BAW_MES; + + // lets check a non-std file, config.php might exist elsewhere + $path = $BAW_CONF['site_path'] . "/modules/render_table.inc.php"; + if (!file_exists($path)) { + // lets get an error-free error message + $BAW_MES[58] = ''; + $BAW_MES['e'] = 'UTF-8'; + include_once('./language/lang_en.inc.php'); + $check = substr($_SERVER["SCRIPT_FILENAME"], 0, -10); + echo baw_raise_error('site_path', array($BAW_CONF['site_path'], $check)); + exit; + } + + /* this does not work if the folder is protected with htaccess + since the fopen is not authenticated. + $url = $BAW_CONF['site_url']. '/modules/render_table.inc.php'; + if (!@fopen($url, "r")) { + include_once('./language/lang_en.inc.php'); + $check = 'http://' . $_SERVER["SERVER_NAME"] . substr($_SERVER["PHP_SELF"], 0, -10); + echo baw_raise_error('site_url', array($BAW_CONF['site_url'], $check)); + exit; + } + + $url = $BAW_CONF['icons_url']. '/os/linux.png'; + if (!@fopen($url, "r")) { + echo baw_raise_error('iconpath', array($BAW_CONF['icons_url'])); + exit; + } + */ +} + +/* +* Helper Function: debug output with time stamp and memory meter; +* called by all functions +* +* @param str $msg_code the message to be shown either directly or from +* language file +* @param str $data data to be filled in +* @param bol $always show always or only when debug more is set? +* @return debug message +* +*/ +function baw_debug($msg_code, $data = false, $always = false) { + global $BAW_CONF, $BAW_MES; + $out = ''; + if ($BAW_CONF['debug'] || $always) { + if (isset($BAW_MES[$msg_code])) { + if ($data) { + $out .= sprintf($BAW_MES[$msg_code], $data); + } else { + $out = $BAW_MES[$msg_code]; + } + } else { + $out = $msg_code; + } + $memory = baw_byte_format(memory_get_usage(),4); + $time = baw_ptime(); + echo "
$out | Memory used: $memory | Time: $time
\n"; + } +} + +/* +* Helper Function: returns the time between the start of the script until now +* called by baw_debug() and baw_display_index() +* +* @return time in seconds +* +*/ +function baw_ptime() { + $now = baw_mtime(); + $overall = $now - START_TIME; + $time_str = baw_num_format($overall, 3). " sec"; + return $time_str; +} + +/* +* Helper Function: sets the current time to START_TIME for calculation +* of time spent for script execution. +* called by index.php, baw_ptime() +* +*/ +function baw_mtime() { + $arr = explode(" ", microtime()); + $out = $arr[0] + $arr[1]; + return $out; +} + +/* +* Helper Function: format numeber of bytes +* +* @param int $number number of bytes (1024-base) +* @param int $decimals number of decimals to display +* @return formatted according to config +* +*/ +function baw_byte_format($number, $decimals = 2) { + global $BAW_CONF; + // kilo, mega, giga, tera, peta, exa, zetta, yotta + $prefix_arr = array('','k','M','G','T','P','E','Z','Y'); + $i = 0; + $value = round($number, $decimals); + while ($value > 1024) { + $value /= 1024; + $i++; + } + $result = baw_num_format($value, $decimals); + $result .= ' '.$prefix_arr[$i].'B'; + return $result; +} + +/* +* Helper Function: format numbers according to config +* +* @param int $number number +* @param int $decimals number of decimals to display +* @return formatted according to config +* +*/ +function baw_num_format($number, $decimals = 0) { + global $BAW_CONF; + if ($number == 0 || empty($number) || !isset($number)) { + $result = '0'; + } else { + $result = number_format($number, $decimals, $BAW_CONF['dec_point'], $BAW_CONF['tho_point']); + } + return $result; +} + +/* +* Helper Function: format dates according to config +* +* @param int $str date in the format YYYYMMDDHHMMSS +* @return formatted date according to config +* +*/ +function baw_getdate_format($str) { + global $BAW_CONF; + $out = date($BAW_CONF['date_format'], strtotime($str)); + return $out; +} + +/* +* Helper Function: format time according to config +* +* @param int $str date in the format YYYYMMDDHHMMSS +* @return formatted time only according to config +* +*/ +function baw_time_format($str) { + global $BAW_CONF, $BAW_MES; + if ($str == 0) { + return $BAW_MES[0]; + } + $out = date($BAW_CONF['date_time_format'], strtotime(sprintf("%.0f",$str))); + return $out; +} + +/* +* Helper Function: deliver output according to odd/even numbers +* +* @param int $num number to check if odd/even +* @param str $even string to be returned in case $num is even +* @param str $odd string to be returned in case $num is odd +* @return $odd or $even +* +*/ +function baw_even($num, $even, $odd) { + if ($num%2 == 0) { + return $even; + } else { + return $odd; + } +} + +/* +* Helper Function: format a number as a percentage +* +* @param int $num number to format +* @return str formatted number +* +*/ +function baw_percent_format($number) { + global $BAW_CONF; + $result = baw_num_format($number, $BAW_CONF['percent_decimals']) . " %"; + return $result; +} + +/* +* Helper Function: Slice an array but keep numeric keys +* called only by baw_display_days() +* +* @param arr $array array to be sliced +* @param int $day $day from where to slice +* @return arr sliced array +* +*/ +function baw_cut_date_array($array, $day) { + $output_array = array(); + foreach ($array as $key => $value) { + if ($key > $day) { + $output_array[$key] = $value; + } + } + return $output_array; +} + +/* +* Helper Function: sort a multi-dimensional array by key or index +* called by almost all functions in display.inc.php. For performance reasons, +* the key is the preferred method. +* +* @param arr $data array to be sorted +* @param str $column column to be the sorting reference +* @param con $order SORT_DESC or SORT_ASC +* @return arr sorted array +* +*/ +function baw_array_sorting($data, $column, $order = SORT_DESC) { + if (count($data) ==0) { + return $data; + } else if ($column == 'key') { + baw_debug("sorting array by key"); + if ($order == SORT_DESC) { + krsort($data); + } else { + ksort($data); + } + } else { + baw_debug("creating sorting array using column $column $order"); + foreach ($data as $description => $numbers) { + $sort_col[$description] = @$numbers[$column]; + } + baw_debug("sorting array by column $column $order"); + array_multisort($sort_col, $order, $data); + } + baw_debug("array sorted"); + return $data; +} + +/* +* Helper Function: raise an error for custom events +* +* @param str $type index for error message +* @param str $data error-specific data to fill into the message +* @return str error message +* +*/ +function baw_raise_error($type, $data = array()) { + global $BAW_MES, $BAW_CONF; + + $cd = count($data); + if ($cd == 0) { + $out = $BAW_MES[$type]; + } else if ($cd == 1) { + $out = sprintf($BAW_MES[$type], $data[0]); + } else if ($cd == 2) { + $out = sprintf($BAW_MES[$type], $data[0], $data[1]); + } else if ($cd == 3) { + $out = sprintf($BAW_MES[$type], $data[0], $data[1], $data[2]); + } + // this is here in case the error comes so early that display helpers was not included yet. + if ($BAW_CONF['module'] == 'drupal') { + drupal_set_message(t('The Betterawstats engine generated the error below. If it is a configuration error concerning AWStats locations (i.e. the AWstats data directory, library directory, or language direction), these must be set using the') . '
' . t('BAW Statistics') . ' ' . t('administration pages.'),'error'); + drupal_set_message($out,'warning'); + } else { + include_once('display_helpers.php'); + $out = baw_site_header() . "

{$BAW_MES['baw_error']}

$out
"; + return $out; + } +} + +/* +* Helper Function: check if a file is writable +* called by itself and other occasions where config links are displayed +* +* @param str $path path to the file +* @return bol true if writable, otherwise false +* +*/ +function baw_is_writable($path) { + //will work in despite of Windows ACLs bug + //NOTE: use a trailing slash for folders!!! + //see http://bugs.php.net/bug.php?id=27609 + //see http://bugs.php.net/bug.php?id=30931 + baw_debug('dbg_test_writable', $path); + if ($path{strlen($path)-1}=='/') {// recursively return a temporary file path + return baw_is_writable($path.uniqid(mt_rand()).'.tmp'); + } else if (is_dir($path)) { + return baw_is_writable($path.'/'.uniqid(mt_rand()).'.tmp'); + } + // check tmp file for read/write capabilities + $rm = file_exists($path); + $f = @fopen($path, 'a'); + if ($f===false) { + @fclose($f); + baw_debug('dbg_test_writable_false', $path); + return false; + } + if (!$rm) { + unlink($path); + } + fclose($f); + baw_debug('dbg_test_writable_true', $path); + return true; +} + +/* +* Helper Function: debug helper that gives var_dump as a return instead of a screendump +* +* @param misc $var variable to be dumped +* @return str formatted, dumped variable contents +* +*/ +function baw_var_dump($var) { + ob_start(); + var_dump($var); + $dump = ob_get_contents(); + ob_end_clean(); + return "
$dump
"; +} +?> \ No newline at end of file diff --git a/betterawstats/core/index.html b/betterawstats/core/index.html new file mode 100644 index 0000000..e69de29 diff --git a/betterawstats/core/language.inc.php b/betterawstats/core/language.inc.php new file mode 100644 index 0000000..86f1a00 --- /dev/null +++ b/betterawstats/core/language.inc.php @@ -0,0 +1,177 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * File contents: + * + * This file coordinates the complete language-file processing. + */ + + +// this is the main function that should coordinate reading all language ressources +function baw_language() { +// find out what our language is +baw_detect_language(); +// include the AWSTATS language file +baw_set_language(); +// include the BAW language file +baw_select_internal_language(); +// read the AWSTATS tooltips +// baw_get_tooltips(); + +} + +function baw_set_language() { + global $BAW_CONF, $BAW_MES; + + $path = $BAW_CONF['path_lang']."/awstats-{$BAW_CONF['lang']}.txt"; + if (!file_exists($path)) { + // lets get an error-free error message + $BAW_MES[58] = ''; + $BAW_MES['e'] = 'UTF-8'; + include_once($BAW_CONF['site_path'].'/language/lang_en.inc.php'); + echo baw_raise_error('languagefile', array($path)); + exit; + } else { + $alternative = $BAW_CONF['path_lang']."/awstats-en.txt"; + baw_read_lng_data($path, $alternative); + } +} + +// this is detecting the required language if not set to auto by config. +// this is called only by baw_set_language() +function baw_detect_language() { + global $BAW_CONF; + $lang = ''; + if ($BAW_CONF['lang_setting'] == 'auto') { + baw_debug('dbg_detect_language'); + $acc_lang = explode(',', @$_SERVER['HTTP_ACCEPT_LANGUAGE']); + foreach ($acc_lang as $lang) { + $lang = strtolower(substr($lang, 0, 2)); + if (file_exists($BAW_CONF['path_lang'] . "/awstats-$lang.txt")) { + break; + } else { + $lang = ''; + } + } + if (!$lang) { + $lang = 'en'; + } + } else { + $lang = $BAW_CONF['lang_setting']; + } + $BAW_CONF['lang'] = $lang; + baw_debug('dbg_detected_language', $lang); +} + +// we assume that awstats has more translations than betterawstats +// so we check if the one selected is available, otherwise include +/// english. +function baw_select_internal_language() { + global $BAW_CONF; + $lang = $BAW_CONF['lang']; + $path = "{$BAW_CONF['site_path']}/language/lang_$lang.inc.php"; + if (file_exists($path)) { + include_once($path); + } else { + $path = "{$BAW_CONF['site_path']}/language/lang_en.inc.php"; + include_once($path); + } +} + +// this function gets the file and returns the array +// that is then added to the language file. +function baw_read_lng_data($file, $alternative) { + global $BAW_MES; + $r = array(); + baw_debug("reading language data: $file"); + $lines = file($file); + $encode_str = false; + foreach ($lines as $line) { + if (substr($line, 0, 7) == 'message') { + $match = explode('=', $line); + $match[0] = substr($match[0], 7); + $r[$match[0]] = trim($match[1]); + } else if (substr($line, 0, 8) == 'PageCode') { + $encode_str = substr($line, 9); + $r['e'] = $encode_str; + } + } + // check that we have the whole file + if (count($r) < 173) { + baw_debug( + "The language file is incomplete, only " . count($r) + . "entries. Filling the rest with english" + ); + $lines = file($alternative); + foreach ($lines as $line) { + if (substr($line, 0, 7) == 'message') { + $match = explode('=', $line); + $match[0] = substr($match[0], 7); + if (!isset($r[$match[0]])) { + $r[$match[0]] = trim($match[1]); + } + } + } + } + baw_debug("finished reading language data"); + $BAW_MES += $r; +} + +function baw_get_tooltips() { + global $BAW_CONF, $BAW_MES; + $path = $BAW_CONF['path_lang']."/tooltips_w/awstats-tt-{$BAW_CONF['lang']}.txt"; + if (!file_exists($path)) { + echo baw_raise_error('languagefile', array($path)); + $file_text = array(); + } else { + $file_text = file_get_contents($path); + } + $search = array( + "\n", + "\r", + "", + "
" + ); + $replace = array( + "", + "", + "", + "" + ); + $file_text = str_replace($search, $replace,$file_text); + $file_text = explode('
\ No newline at end of file diff --git a/betterawstats/core/library.inc.php b/betterawstats/core/library.inc.php new file mode 100644 index 0000000..18b0080 --- /dev/null +++ b/betterawstats/core/library.inc.php @@ -0,0 +1,200 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * File contents: + * + * This file sets default/addon data for libraries and reads the aditional data + * from the library files. + */ + + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'library.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +$BAW_LIB['formats'] = array( + // class img text format + 'layout_visitors' => array( + 'img' => 'vu.png', + 'txt' => 11, + 'frm' => 'baw_num_format(%s);', + 'max'=> 'layout_visits'), + 'layout_visits' => array( + 'img' => 'vv.png', + 'txt' => 10, + 'frm' => 'baw_num_format(%s);', + 'max'=> 'layout_visits'), + 'layout_pages' => array( + 'img' => 'vp.png', + 'txt' => 56, + 'frm' => 'baw_num_format(%s);', + 'max'=> 'layout_pages'), + 'layout_hits' => array( + 'img' => 'vh.png', + 'txt' => 57, + 'frm' => 'baw_num_format(%s);', + 'max'=> 'layout_hits'), + 'layout_bytes' => array( + 'img' => 'vk.png', + 'txt' => 75, + 'frm' => 'baw_byte_format(%s);', + 'max'=> 'layout_bytes'), + 'layout_percent' => array( + 'img' => '', + 'txt' => 15, + 'frm' => 'baw_percent_format(%s);', + 'max'=> ''), + 'layout_date' => array( + 'img' => '', + 'txt' => '', + 'frm' => 'baw_getdate_format(%s);', + 'max'=> ''), + 'layout_text' => array( + 'img' => '', + 'txt' => '', + 'frm' => false, + 'max'=> ''), + 'layout_ratio' => array( + 'img' => '', + 'txt' => '', + 'frm' => 'baw_num_format(%s,2);', + 'max'=> '') +); + +// this is defined here to indicate the order of the array, otherwise the information is in the datafile +$BAW_LIB['sessions'] = array( + '0s-30s', '30s-2mn', '2mn-5mn', '5mn-15mn', '15mn-30mn', '30mn-1h', '1h+' +); + +$BAW_LIB['os']['families'] = array( + 'win' => array('win', 'Windows',0), + 'mac' => array('mac', 'Macintosh',0), + 'linux'=> array('linux', 'Linux',0), + 'bsd' => array('bsd', 'BSD',0) +); + +$BAW_LIB['os']['codes'] = array('win', 'mac', 'linux', 'bsd'); +$BAW_LIB['os']['list'] = baw_get_library("/operating_systems.pm", 'OSHashLib'); +$BAW_LIB['domains'] = baw_get_library("/domains.pm", 'DomainsHashIDLib'); +$BAW_LIB['robots'] = baw_get_library("/robots.pm", 'RobotsHashIDLib'); +list ( + $BAW_LIB['worms']['names'], + $BAW_LIB['worms']['targets']) = baw_get_library( + "/worms.pm", + array('WormsHashLib', 'WormsHashTarget') +); +list ( + $BAW_LIB['files']['types'], + $BAW_LIB['files']['icons'], + $BAW_LIB['files']['family']) = baw_get_library ( + "/mime.pm", + array('MimeHashLib', 'MimeHashIcon', 'MimeHashFamily') +); +$BAW_LIB['browser']['familes'] = array('msie'=>1,'firefox'=>2,'netscape'=>3,'svn'=>4); +list ( + $BAW_LIB['browser']['names'], + $BAW_LIB['browser']['grabbers'], + $BAW_LIB['browser']['icons']) = baw_get_library( + "/browsers.pm", + array('BrowsersHashIDLib','BrowsersHereAreGrabbers','BrowsersHashIcon') +); +$BAW_LIB['searchengines']['names']= baw_get_library("/search_engines.pm", 'SearchEnginesHashLib'); +$BAW_LIB['misc'] = array( + // 'TotalMisc' => 0, + // 'AddToFavourites' => 137, + 'JavascriptDisabled' => 168, + 'JavaEnabled' => 140, + 'DirectorSupport'=> 141, + 'FlashSupport' => 142, + 'RealPlayerSupport'=> 143, + 'QuickTimeSupport' => 144, + 'WindowsMediaPlayerSupport' => 145, + 'PDFSupport' => 146 +); +$BAW_LIB['http_status'] = baw_get_library("/status_http.pm", 'httpcodelib'); + +$BAW_LIB['item_groups'] = array( + 'time' => array( + 'title' => $BAW_MES['time'], + 'members' => array('overview', 'months', 'days', 'weekdays', 'hours') + ), + 'userinfo' => array( + 'title' => $BAW_MES['user_information'], + 'members' => array('domains', 'visitors', 'os', 'osversions', 'browsers','browserversions', 'misc', 'screensizes') + ), + 'actions' => array( + 'title' => $BAW_MES['user_actions'], + 'members' => array('logins', 'sessions', 'filetype', 'urls') + ), + 'origin' => array( + 'title' => $BAW_MES['user_origin'], + 'members' => array('referers', 'referer_domains', 'se_referers','searchphrases', 'searchwords') + ), + 'other' => array( + 'title' => $BAW_MES['other_access'], + 'members' => array('robots', 'worms', 'unknownos', 'unknownbrowser', 'hotlinks', 'hotlink_domains', 'errors', 'errors404') + ) +); + +/* + this is obsolete but kept here for ev. future usage + +$BAW_LIB['data']['full'] = array( + 'GENERAL' => array('Misc ID', 'Pages', 'Hits', 'Bandwidth'), + 'TIME' => array('Hour','Pages','Hits','Bandwidth','Not viewed Pages','Not viewed Hits','Not viewed Bandwidth'), + 'VISITOR' => array('Host','Pages','Hits','Bandwidth','Last visit date','[Start date of last visit]','[Last page of last visit]'), + 'DAY' => array('Date','Pages','Hits','Bandwidth','Visits'), + 'DOMAIN' => array('Domain','Pages','Hits','Bandwidth'), + 'LOGIN' => array('Login','Pages','Hits','Bandwidth','Last visit'), + 'ROBOT' => array('Robot ID','Hits','Bandwidth','Last visit','Hits on robots.txt'), + 'WORMS' => array('Worm ID','Hits','Bandwidth','Last visit'), + 'SESSION' => array('Session range','Number of visits'), + 'SIDER' => array('URL','Pages','Bandwidth','Entry','Exit'), + 'FILETYPES' => array('Files type','Hits','Bandwidth','Bandwidth without compression','Bandwidth after compression'), + 'OS' => array('OS ID','Hits'), + 'BROWSER' => array('Browser ID','Hits'), + 'SCREENSIZE' => array('Screen size','Hits'), + 'UNKNOWNREFERER' => array('Unknown referer OS','Last visit date'), + 'UNKNOWNREFERERBROWSER' => array('Unknown referer Browser','Last visit date'), + 'ORIGIN' => array('Origin','Pages','Hits '), + 'SEREFERRALS' => array('Search engine referers ID','Pages','Hits'), + 'PAGEREFS' => array('External page referers','Pages','Hits'), + 'SEARCHWORDS' => array('Search keyphrases','Number of search'), + 'KEYWORDS' => array('Search keywords','Number of search'), + 'MISC' => array('Misc ID','Pages','Hits','Bandwidth'), + 'ERRORS' => array('Errors','Hits','Bandwidth'), + 'CLUSTER' => array('Cluster ID','Pages','Hits','Bandwidth'), + 'SIDER_404' => array('URL with 404 errors','Hits','Last URL referer'), + 'EXTRA_1' => array('Extra key','Pages','Hits','Bandwidth','Last access') +); +*/ + +?> \ No newline at end of file diff --git a/betterawstats/docs/FAQ.txt b/betterawstats/docs/FAQ.txt new file mode 100644 index 0000000..d208550 --- /dev/null +++ b/betterawstats/docs/FAQ.txt @@ -0,0 +1,3 @@ +Please see the FAQ here: + +http://betterawstats.com/forum/viewforum.php?f=6 \ No newline at end of file diff --git a/betterawstats/docs/LICENSE.TXT b/betterawstats/docs/LICENSE.TXT new file mode 100644 index 0000000..85a1c52 --- /dev/null +++ b/betterawstats/docs/LICENSE.TXT @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/betterawstats/docs/history.txt b/betterawstats/docs/history.txt new file mode 100644 index 0000000..abc48e4 --- /dev/null +++ b/betterawstats/docs/history.txt @@ -0,0 +1,209 @@ +== 1.0 final== +- reduced memory load for HOSTS +- unknonwn browsers/os & Versions default to display=off +- improved design +- improved code for table creation (-30%) +- added missing TLDs to worldmap +- added HTML charts also for full list +- added password-protection of config editor +- added new config options to prevent oversized charts +- added rowspan for tables +- added favicon for refering sites +- added chart titles +- added charts for screen sizes +- fixed Authenticated users +- fixed OS chart +- fixed Hotlinks +- fixed Averages +- fixed HTML codes in config file help +- fixed sorting for keys +- fixed URL-encoding of searchphrases/words +- fixed strange int(0) == string error for HTTP error tables +- fixed URL of 404 Errors table + +== 1.0 Beta == +- added countries map to Visitors Domains data +- added new config option to exclude empty data from averages +- added check for config options +- added extras-addon help +- added ratio display for visitors +- added XHTML STRICT validation to HTML Strict +- added HMTL charts for browsers, Os (incl Versions) +- added 'Average' option for all HTML charts +- added 'Others' in HTML charts +- added German language file +- added Dutch language file (thanks Edwin de Ruijter) +- added files/paths statistics +- added screen size visuals to screen size stats +- added sections to config options +- revamped CSS +- revamped data formatting scheme to allow custom formats +- fixed word wrap for config descriptions +- fixed hide menu entries for empty data +- fixed text-shorting of non-linked text if full text cannot be shown +- fixed html tags from unknown OS & Browsers +- fixed online config link/error only if enabled +- fixed undefined variables +- fixed bug where not all sites were listed when selecting an early year +- Fixed HTML Validation in several places +- fixed windows config file writable test +- fixed path for error messages +- fixed last day of the month missing while showing previous months +- fixed linking of non-existing referes in 404 error stats +- fixed omitted duplicate referer and error entries (thanks Edwin de Ruijter) +- fixed icons for unknown domains +- fixed max_lines config setting +- fixed foreign language encoding +- fixed bots detection for visitors & allow finetuning +- fixed quotes for string-type config settings +- fixed width of HTML chart bars calculation +- fixed external links for browser versions +- Fixed day display for half-filled months + +== 0.12 Alpha == +- fixed last month daily data if current has no hits +- fixed menu sorting for vertical layout +- different format for external links +- interlinked unknown browsers & OS with respective table +- fixed slashes in OS icons +- renamed all functions & globals to baw_* to make sure they work when + betterawstats is included into other projects +- fixed highlighting of current month/day +- applied var fixes (thanks Andrew Gillies) +- added config option for inclusion in other projects +- improved datelist-creation + +== 0.11 Alpha == +- added unknown browsers stats +- added unknown OS stats +- introduced additional horizontal layout +- improved overall layout & html readablity +- combined www.-subdomains for domain referrers +- added possible values remark for options to config file +- allowing choice of maximum value setting in chart through config file +- inversed $CONF['online_config'] +- fixed 'Unknown' OS icon +- fixed number format for stats report +- fixed date-fields for Sum, Avg & 'Others' +- preventing direct call of backend files +- page & menu title now include stats name +- months & years dropdown now only show available values +- Display Configurator link only if file writable +- fixed time display for PHP 4.x Versions +- fixed day stats for PHP 4.x Versions + +== 0.10 Alpha == +- new 'hide empty data' config feature +- new 'All (Daily)' Data +- improved browser processing +- new log-parsing stats +- added browser version +- added OS versions +- added rowcount for "Others" +- fixed error in parsing robots.pm for latest awstats build (thanks J. Hill) +- fixed non-existing filetype icons +- fixed error in icons for https:// (thanks J. Hill) +- fixed column spanning for "Others" +- fixed logins date format +- fixed visit duration data table + +== 0.9 Alpha == +- fixed ascending/descending sort storage in config editor +- Split Referrers and Hotlinks into two stats +- Added Domain-only referres and Hotlinks +- Moved "Full List"-link in sections to the "Other"-field +- fixed html validation +- fixed unix/dos mix of datafiles +- implemented "all sites" statistics +- menu shortened +- various fixes + +== 0.8 Alpha == +- Top_x value for screensizes +- Rewrote table creation to allow better control through a config system +- Added Miscellaneous +- Added HTTP Codes +- Added Color Depth +- Split days & weekdays in two different functions +- introduced default config file for gui config editor +- split display files from display helpers +- config variable reconstruction +- Build config editor +- validate HTML strict +- Added menu +- Added full lists +- Table row counter for all tables + +== 0.7 Alpha == +- re-introduced css classes for chart legends +- allow monday as first day of the week +- automated percent formatting +- added OS table +- renamed all global variables to pattern $VAR +- fixed problems with data where extras-plugin was not used (thanks J.P van Oyen) +- fixed an function-naming conflict with PHP 5.x (thanks J.P van Oyen) +- fixed & Optimized data library reading code +- removed 'All' Month option since its not enabled yet +- rearranged function calls +- added Browser table +- added screen sizes table +- added referers table +- added search engine referers table +- use "others" only when > 0 +- introduced sorting option for screensizes +- moved percentage calculation to tablecreation +- introduced expand/collapse buttons for each section +- replaced title-div with h2 semantics +- added PHP4-compatible array_slice function (thanks Jonathan Tiez) + +== 0.6 Alpha == +- Added alt & title attributes to domain & hour icons +- Added visitors table +- Created Error-handler and error message array +- reformed data-structure to prevent missing cells for 0-value days +- prevented missing months/days in charts & tables if no data available +- improved error messages, text & layout +- introduced array-sorting and enabled top_x parameter +- added login-users +- added robots table +- added tooltips +- moved javascript into seperate file +- Improved Library files reading in case there are several arrays in one file +- added session time +- added site urls +- added file types +- added worms + +== 0.5 Alpha == +- Increased Data rading speed ca. 60 times by using the file index instead of preg +- Added Hourly stats +- Added Domain stats +- created library file for data +- improved message file parsing +- wrote function to parse library data from awstats + +=== 0.4 Alpha === +- Introduced table creation function to modularize code + +=== 0.3 Alpha === +- Monthly chart year spans over months +- section header html fixes +- charts format improved +- implemented strict html layout/css +- sitefooter has its own function now +- Weekend Coloring for daily data +- fixed daily data column order +- fixed column header text +- weekday data in average values, chart & table + +=== 0.2 Alpha === +- Added year-colored background for monthly data +- Added complete daily stats +- corrected switched hits/bandwidth data indaily charts +- Improved layout CSS, removed tables + +=== 0.1 Alpha === +Initial version +- Summary +- full monthly stats +- Daily stats charts \ No newline at end of file diff --git a/betterawstats/docs/index.html b/betterawstats/docs/index.html new file mode 100644 index 0000000..e69de29 diff --git a/betterawstats/docs/install.drupal.txt b/betterawstats/docs/install.drupal.txt new file mode 100644 index 0000000..0cdfd6f --- /dev/null +++ b/betterawstats/docs/install.drupal.txt @@ -0,0 +1,142 @@ +CONTENTS OF THIS FILE +--------------------- + + * Requirements + * Installation + * Configuration + * Customising which statistics to display + +REQUIREMENTS +------------ + +BAWstats (betterAWstats as a Drupal module) requires Drupal 6 (from +beta 1 on) and betterAWstats (beta 1). No other Drupal modules are +required. + +A working AWstats system is needed with access to the AWstats data, +however, AWstats does not have to be operating as a CGI. + +Administration privileges within Drupal are required to install the +module. For viewing statistics from multiple sites (in addition to the +default installed site) the ability to edit the Drupal site's +settings.php file is required. + + +INSTALLATION +------------ + +1. You can obtain the latest code for betterAWstats either from +tokyoahead.com or from the Drupal module repository. + +2. Unzip (or Untar) the betterAWstats source under the chosen module +directory (e.g. sites/all/modules or under the modules directory of a +specific site). + +3. As betterAWstats is designed as a stand alone CGI there are two +main requirements for converting it into a safe Drupal only module. + +* Firstly, rename the directory from "betterawstats" to "bawstats" +(the Drupal module name). + +* Secondly, remove or set permissions to unreadable the index.php file +that is the main CGI component of betterAWstats. This prevents the +CGI component being run when you are using the code as a Drupal model. +The BAWstats module itself does not need this file. + +4. At this point the module should appear in the Drupal admin modules +page (the Drupal path /admin/build/modules). It can be activated in +the usual Drupal way. + + +CONFIGURATION +------------- + +Before the BAWstats Drupal module can access the AWstats data, the +locations of the key AWstats directories must be configured. Once the +BAWstats module is installed, it can be configured within the Drupal +administration pages (Drupal path /admin/settings/bawstats). + +The module will not work without the correct locations of the four +required AWstats paths: + +* AWstats data directory + The directory containing the core AWstats data. Within the AWstats +configuration it is the directory specified by the "DirData" +parameter. The data must be accessible by php. + +* AWstats library directory + In the top level of a default AWstats install, this is the directory +wwwroot/cgi-bin/lib. It's contents must be accessible by php. + +* AWstats language directory + In the top level of a default AWstats install, this is the directory +wwwroot/cgi-bin/lang. Again it must be accessible by php. + +* AWstats icon directory + In the top level of a default AWstats install, this is the directory +wwwroot/icon. IMPORTANT: This must be copied into the bawstats module +directory - e.g. copy the "icon" directory and all its contents into +the bawstats module directory. NOTE, the "icon" directory is not the +same as the betterAWstats "icons" directory. +This is needed as the icons are referenced as URLs within the Drupal +tree. The default value for this configuration option assumes the +icon directory has been copied. + +Once configured correctly, betterAWstats statistics can be viewed in the +Drupal admin location admin/bawstats. + + +CUSTOMISING WHICH STATISTICS TO DISPLAY +--------------------------------------- + +AWstats can be configured to collect and store statistics for multiple +sites in it's data directory. + +For privacy reasons, the BAWstats module will present and display +statistics only for the domain name of the site it is running in Drupal +under. For example, if the BAWstats module is running on the Drupal +website http://www.example.com the module will look for AWstats data +files for "example.com" (AWstats drops the "www" by default). + +If this is incorrect, for example, you wish the BAWstats module +running on site http://www.example.com to display some other AWstats +statistics (say, stats for another site, http://www.myexample.com), +the default can be overridden by editing the Drupal settings.php file +belonging to the www.example.com site. In the settings.php file, the +$conf['bawstats_defsite'] variable can be set to the site from which +to collect and display AWstats statistics. For example: + +$conf['bawstats_defsite'] = 'myexample.com'; + +would configure the bawstats module to look for and display AWstats +data for the domain myexample.com. + +The reason this is not made configurable with the other configuration +settings above (i.e. via the Drupal admin pages) is that it may be +deemed inappropriate that site administrators for one site can configure +BAWstats to look at statistics for other sites. + +One of the nice features of betterAWstats is its ability to show +statistics from multiple sites. This is available in the Drupal +module, again, by editing the settings.php of the Drupal site for +which you want bawstats to have this ability. Adding the following to +a settings.php file will allow bawstats to view ALL statistics +available in the AWstats data directory: + +$conf['bawstats_admin_access'] = 1; + + +OTHER CUSTOMISATION +------------------- + +Other configurations to the display of data can be made by directly +editing the betterAWstats config.php. + + +NOTICE +------- + +This module uses one non-drupal CGI to render the world map of domain locations. +No data is revealed from this CGI (as it simply builds the map image from the +data it is given), but if this causes concern, it can be disabled by removing +access to the file modules/render_map.inc.php diff --git a/betterawstats/docs/install.txt b/betterawstats/docs/install.txt new file mode 100644 index 0000000..9af05f1 --- /dev/null +++ b/betterawstats/docs/install.txt @@ -0,0 +1,38 @@ +REQUIREMENTS: + +- awstats and generated datafiles from awstats. +- PHP 5.2 or above +- a Webserver that can process PHP files (Apache, IIS etc) +- 1MB space +- A recent browser version that can properly render CSS, such as Opera 9, Firefox 2, IE 7 etc. +- 1024x786 screen or larger + +INSTALL PROCEDURE BETTERAWSTATS: + +1. Extract the files into any web-accessible directory, preserving the directory structure. +2. Edit the file config.php. Specially the paths to the awstats files have to be correct +3. Open index.php in your browser and you should see the results. +4. Under Linux, in order to use the online config editor, please make your config.php + file writable by apache: + chown apache:apache ./config.php + chmod 664 ./config.php + and set $BAW_CONF['online_config'] to true. + If your BetterAWStats installation is not protected by password, you have to make the + config.php file unwritable after you changed the settings and disable $BAW_CONF['online_config'] + +IMPORTANT NOTES: + +It is STRONGLY recommended to password-protect the folder where BetterAWStats is installed +SPECIALLY when using the online config editor. You can use .htaccess files for example. + +DAILY USE: + +- update your statistics as usual with awstats +- Open BetterAwstats to see the statistics + +HOW TO ADD ADITIONAL EXTRA SECTIONS: + +Awstats allows to add aditional extra sections with custom stats. In order to create those, +1. Please edit the file /core/extras.inc.php. Take a look at section EXTRAS_1 and copy the whole function again into the file, changing the function to show the data desired. +2. Below that, please copy the $BAW_CONF_DIS_DEF section and edit the fariables according to point 1. +3. Copy the respective section also in config.php and adjust the values accordingly. \ No newline at end of file diff --git a/betterawstats/favicon.ico b/betterawstats/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..589fa3fc0ea68ca7ef926f87031b842b1c3c6fc1 GIT binary patch literal 766 zcmZvav2DaK3`Kw9lmQGjsjtiymqIIK7PT%l76%ZJHBuT#8$kIabv{cu8lUnbDTvd8XW$LMJH-$_D2ux>_sBL2(rx`^>!7NPZD^LKYyG8lXc1sCixexm*~G-5 zU}j5;+%^OM*dpnaAGst5B;5-}uJGAX&e37!gc8U11{2p~o@g*LN{x9FqQS^gds@Jq z>@{+cPuuMiNEMDUaGlo0`H7Kvdzr?J z-{Z(_UzlLD)WlP+CcPUcyKGH=@V*VXg~Y=((x literal 0 HcmV?d00001 diff --git a/betterawstats/horizontal.css b/betterawstats/horizontal.css new file mode 100644 index 0000000..049c80b --- /dev/null +++ b/betterawstats/horizontal.css @@ -0,0 +1,50 @@ +h2.group_title { + border: 2px solid #BBBBBB; +} +.group_header h2 { + background-color:#DDDDDD; + font-size:12px; + font-weight:bold; + text-align:center; + margin-top:2px; +} +.menu_button_inactive { + border-top:2px solid #BBBBBB; + border-left:2px solid #BBBBBB; + border-right:2px solid #BBBBBB; + padding:4px; + margin-right:3px; + margin-top:2px; + float:left; + background-color: #DDDDDD; + white-space:nowrap; + cursor:pointer; +} +.menu_button_active { + border-top:2px solid #BBBBBB; + border-left:2px solid #BBBBBB; + border-right:2px solid #BBBBBB; + border-bottom:2px solid #FFFFFF; + padding:4px; + margin-right:3px; + margin-top:2px; + margin-bottom:-2px; + float:left; + background-color: #FFFFFF; + white-space:nowrap; + cursor:pointer; +} +.menu_section_inactive { + text-align: center; + border: 3px solid #dddddd; + padding:10px; + display:none; +} +.menu_section_active{ + text-align: center; + border: 2px solid #BBBBBB; + padding:10px; +} +h2.menu_section_active { + display:none; +} \ No newline at end of file diff --git a/betterawstats/icons/bar.png b/betterawstats/icons/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..9fe8cce964cebe6095775dd2c11c0d1e6f43f069 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7El0V4TBv}}PCOS+@4BLlfH%J+NCt9DuW n%gvmy@)YAb=O6#xh$b*p9I@F_R$jypG@ilJ)z4*}Q$iB}9MnR# literal 0 HcmV?d00001 diff --git a/betterawstats/icons/btn_empty.gif b/betterawstats/icons/btn_empty.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cac32855cc8ddc3c60e4e68e70876e32c6dbe1f GIT binary patch literal 268 zcmV+n0rUPxNk%w1VG#fk0K^>t-rU;H%*x{7-|6V+b;^E-m-Q3pG(%|0R=jG(^?(XgD>g40%>gebF{r&dz^z-rY+u7Lp`1t<*{*jJ~ z|NsC0|Nj6000000A^8LW0012TEC2ui01*HY000GvVAly#X`YiHc8{>VaJ&gm2Rxet z?L6;n4*+38$M%k4(2hsE40CRtg1&i;GqT7?6>PRv48C9G#w@97`Av0UHCLpGyHX Sq%y9nD*&3aw3+}SApkqG1dpfy literal 0 HcmV?d00001 diff --git a/betterawstats/icons/circ-blue.png b/betterawstats/icons/circ-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..7d82937eca8d74af8c62f6b6bc8ce54f0c169ddf GIT binary patch literal 5320 zcmV;(6gTUMP)$tShg&bbA^H0~qkeD=+;5eu?uubI$Xe zm*^MhrB|~tFo1DjjM47ag|{l^EHbi~ELD+|#7k8xexN{!EvZF*`XeGEvob-YQmIrI zmbvsVpgL5xjaB3G3bs?)f@j?I(ZDak=Ue{{PZ^q~Csk*Y4Z*ZrzekWn@WB9)d+tjF z*TMJQ8JLDY2f!%Uv&q(={Tjhf9#{nbj^I1__%4QN1P?J7xrWi^YdvIZU={J?47{elgJO&bXtrAFM_n1UrA}9j5iILCcV+<7P*yGC9 zKvIK90;DiYVVJs)N!{}{1tTyEd5#2<7>dNX*8j}dK-u6_f5qz9*UPqm{40StfvLbG z1Dk=#z~=6e42ldA4>R7t-TH$F99liXHqh{M1^Y6!!K@sZZC^GAlS7dMxqHrJ!PhrI ztmRX!icchK;D6+*!@SR6lHs5Ya~-dg59evch;Qw zn8V1!9Kvb{W=I7#$!Z|$Fhig;Jl1tEujKF-_|{~DQ2Vb0zL#A2ki%GDCPQEd#mGHI z1Bi3yPEsg6O#ep_=ExU0@ldH_pC|p2Y6 zvCo$W`fCh7#W+Yg%!V)=LNW$B0!Cm)4rV!MDS~$8$3x(}+HmUFjYETR=DmbjGlFOg zW&(`e=hWR<&zaC%y|(Ej4Bjxva*Bq26F9uBzM^ zeotW}KnD_LR}+XPF7%dTHb67Bfj$T3*$woDz-|p&5+H-C0ZfLloIvc|IdN_+Lx=j1 z>%ZTtQ!qR8pPx@**!?4e4>`<6FdT!OLV1OQ+UC$hfp+Ho?94B68iiq(1XuJ7fiWzv zAe%yQCAriWMol5ttMfp;I`<15Pc{Ua!u=2?BUnzsT*);B#HDctr4PCFMthSw{ociw z{soRNYh)anz=sUy&?#isuzCm4dr04by#=mtUU+qd#KuP^$=_|HkAVDegu;VEUzKEf#OE; zX&8F<6-PaMA9kx}FR03=5_%uTFrLEd2GScSZ*ZY^#3uCaaB1IO|KaM<3#*_?=zW|( zaxJ;^R`RJ2yhKG;VbfuR8_EdO@|}F{$EQs* zFhji*ybUvvdknhuL=h;G5Wb2+twS|6X*)zQ~?dUbGi$42mL;@0Sn#;~}7{2kcu z1nME-w-+-or&PzldZ<5TU?*U2+%#JS^$G{oJN2c@JHL5#2(0zpq#VX$H-DPE2m8Jy z{3_HP>PU0c8u%nF!Vi*DSMQB5c;J4$yWNUz+ImGoWURE7EiUGPn*dcVG-bPc?N;&0;AYqrC09jXG|p$j>- z-q2?X%UhRIlN*R7r^angRj7M(sZi`I-~n#2*)2pt^PwE!?k^2jJA~h>+M^4AwZVL< z9RoKFP{WQ=D1~~U&I~rJfEl?}58TS-J4y=m2s$I!umbkeZ}|;w>dkkQe49|msISyH z9UFvTq+Q63OudcS%+kF1KJPJfCa`|C=5r1+S$Jmr8l@0wTSH&I4|L9n5UxmVjB0f&hkE1gdMn$Usyd=h05+_G?Fa@_=Tv{gaU8CI2&IsZ zs3U_7L-5_eZL?#qAo2I7=CX05hTs$H*f}r@ta7k+zy0a^i{O-FR>)*P$s{eXvB zUxcPQv5pyvgH?w9Cgj53rq@p zW*v>$?9w7FLk+>_))By3+~&=nWl`E{8bI~i?q~=;vtAjBeZlmTG$ZWT6-$ZVJycd0 zMh4dYn-uC9bOgu#8tkvc1d@sD^Bc^uKADbFomj60D{j5dU6-l!P<=003#JR{6=1`0 z>tul2>(_4&+fXp6YtO0II5u3vG{S}99rvwvTWq8AoV^_Bc9zvX({N<($)ne|c| z)%J%-<cGn3%wNZ1@scf8u(4zx)`~!YvT9Q*9r8F=$Sdz zyLBW*laV2gX}dK;0bfYZb*zBRB@AbB2$8zAYkCRT7_R-CtDMTHZta?$0k*!SEOK`0 z*0@#G5j_V+eeBwF5{3!BR&_xg2zKklsSK8KWOb>zwWE5DVSN> z4jt}@TW{r9>#c+RbP~OTI>52@b8VJVG?l)6sLNhDs6#_>Pz`58uwgZW(67=R^*vJI@NL)rn>8u%z1R6eG#%%KRwu=a*KtUYjkk-{lT!DKksHsx1! zZpX9>Y%rTMkfDwV!mt{)%Q_J3G6$2hHIt+3guAR3u-3pw0sENZfch}3MN<#7!?8ZU zj*=k1hP`3UuN~IDQ0zNS8JH9zt%iG|Hb@43laA9Obx=uRtxf-)XovfL5Xa^T+b1Y1 z)E;PuW2+uRhm>R(P8J&L%SQ~<^Lsh^X)egtT5zG@PBn-!GCsnCBsJ4lA z1GnPXRRT#IZ0Dmc?SYyc=;1}MNWdg5`yZ-0tR12FK89S1r^a2?R2^2EVVD1+W`y4!SwlcttVIYOf^^*Dp#5ak_ZZQYY(*}6cd4o(bW>Y)V|JB1c`U5y0u5z zF^;U20b6n`-=ue()U+av7=#RCI{ZzC$uo~daFW84|N7)W)cL{GKDv5QC? zt0B0D+Eo=Bt%&=pws9FRZrC5*q>#n!y1wjO3Aaah4S3LpX!CGIo1TZ^l=TQ#L)~J6{;SnWgPpv zg;5Dh54PkfRE6AOwN%A_Ujrp%1+HN%uGPx8FWS|4S_1_nD~Jm=U{yU(i(|3yWexKZ zYyoBHSXB?yb|-*^>k=1+3+LFfbioj)aMiKV_F|9J5Q_bf=l?BO z3B^?bRWF_tbVs$Lc>1q3tbI6M$)i@rJ<+b?S=KNqffW>zXDKxt_d|Oo+P{=AFCbn* z85B_J*sg1rV|``30+tRgh3g%wx~^U8ilzJH!4@m$+9!Ed-P=L6fUPD2r2E7YSl}T0 zW`(N5+H)tsKiBX@z$PJBt&BUaJvsKrnq%Vylpb!f{k7VS>XP=|yA$Nuw0=~JhT;xs57>_Y5&RjuBU+LH ztVdvmxEpBeyS6FZj%ZJgH8SLRU%+|^s|9Y@<8!T6#~sxnH$GeVZ4K)c*aa}h!PQk2 z9o8Xdv|ISWccA95nz={gi>P?}Yc(8qK?iPC@X_KNx`1>B$qaREr*(j1jRm`g-%9vl z35z*IGl=}qCqtduIUTyWNDz+Kb6^H`hAX1#Ek<>32Xr7<6HExK7Xq~&j#VAfbG8GL zE>y9E%sY0DcA`3|7l6H9!E6EPBgEdd^>xPz`NDbz*s6D2K)Ha$33-+-h8_ zuD!5c2)1&q6j3~Yy$>p6b?t@qnvJMs=<{dbT6Vcs;hs^i09&oDSi#*K77tK70Bx>S zol&pdI$nyX=>pb|E*$U7wd&e4>6Ku^Tsxe>`W})yTu9c5_zUV7hdl%hi~Iq&bIxT( z^URMzK7)<`wsP$f?qv)zmd@5loL!adxa0jJtHR^ornRUo2 z#RFtyBNA4?4AytDsC)<}XZx-JzcxzONu5x~JW$DZqZTlDfc014E1R*chU7EqNREZg zYDNn9Jcq$OMB>^chcd;jLDmBh&!8h8fo7x|b-#q+Bcxx!eud&59owE&M|5nZHGE&N z=^=lWeCzMf^R5l=)YE)>WSszPSV(=DL4F5jAmKQZ|Fh{NX@z@4ox-tDEqZ%c!1X)~p?J+e*+7N|lp3%GlLX$naSq);Yo4}Ub@9#JO-Ta9g3Fr5K0EK-QXwTZa4ItM-+ zekt5n=+us78!j`*zB;HyQ@&N_9!X~a3$AftB_x~3{l8X1vhg9gDc^#^eUZ)t7TC(S z+&j0%;#d=c4ILbQuflzX&IooZB+p@R2a5#q1PTwg9*z~}3w2J%62O%qP#FVpP(+1J zO;FdqSZ4+cl5YVPu!vw3!7_#@mi$|Htyan}&;`H()!gmv95CY42%^Zrjg1U}GWmLi z`%GO3Y&dtz9ERf1rNG4maI0@(yE_F6xK)>OEVW`vpk)HJ5a(7-HMNhu)V(dbAXuou z1@0n9Bgi8#0=qhlI78tctP6vMV6p(1KEj;~#_eutZ+o%qKh3z@qKMah3iG`JQ{}!Gh zzqJvz!mX)eU}4k1_^_aYSXw!HZ7nMy{YuANzNrZ=ykWo{1PdFupO)~mICijxgvJkJ&ro;Sg)#}lF&O8*DifXF2R)Uks+J0?wbzHJpc=}4wV4T ze6M-6xk`Z>XR=tXEi}V74!9>^p*C?aV{<&4z%AssaZ^A!W|McD#=G#1ySGPRLB_GA zE2OGpP~}wWft+)ToK9WkT|eG!TPz3PAmDvRpmkLLD?ok`ut_0Zs}c%7-er?&Z4=aQ zy14533$cDWFM&UEcs~TDz%_6K#SNG#u7&0AtlxLvP|x2Jr=Er4y28->Ufg?E!gK}8 z6&N}9)?Be2ntfr_HVs&Ru6OD=STD2Q%%0~vp>NEw zp?pK*N7?r8uM#FJ7%rd`_Zo3k)6LMe(iwWct zD6W7BB;%mC%6Qs$KIGPuPQ0hzuwz5{l^3>FSS{uJpz;x-2^14x0%pv{!5PHj;4<7+ zq59#q&pVNeJMq_bURCau#s(RcgBihUB6)Y>a&oJK>$69la`77k>$Mf06RHqB8^Uk| zj5m|tQ@G1vI>5p7fF(Q|si5QVj{Lfd z_l4`aj?O{BR;v2WzW1EM`wSSsV&q(F#^T2u5$LE1#TFoV=1`G#N8^oZVTDF#>xltQn1g` z6BozuIfdIGTrUPLG#d%c{*erf&&72&har1c=sp;>f_;&!f8RV14@jK+n8_w(8RW8u zBsmlTWHPr)-Bx8C*M4SGj`nJDwt4b_>ZRIRb`wJOpk+@h<6SK~!KN9kGDy99gHT<8 zPTcLJr9h5NZ3C93Fm6D>9$6vePZ9iV;9oI(AHnAYZezGlVVnr)0O~4$oBBV9I%t2V ze_P0|E(Los*}99O&GknNA0qgYxZQH5G1wSP4D$p`0$B{J;4zJ1RSVA^a$?-}4hr@H zY6M+>lP z#@tO}FJ^KR%+i1p450ZF$s&tctuX4PI4C)u#Fqb zq$qxNRh>Dfx{GSjq)1t$*xfpf6q;XBWIcM{^PZ~y07O)>Rd0*rS0G?zE77L^^)Ihx z!ae+-hw9+-m+$!W;YSa7C;nZ)EnimQ;Q7mDczybFGhWB3*Ux;0pbPMVfYmhiWGMbv(%k1c3z=siQw>2cjZCg@g2 zdqx2;WRtESbZRZr@)Kz_eeyl9dF&v^|O!6s#!i4{9F&V#0(WE87i zR`ZZPJ|r~{O>#6&)X}(Edpv=h*|k8vpcTU+RnLG53)DSN(Z+)Ym)2hgW3qP!JS6)b zl5G!SxG~Ure?Uqek&;I_CEGk?0lXOOh3$LJYx97=t7eRRyW|z=fK&-ohk;b9cnk>i zfS~qS$)IZks>vg&$pNyj%LLd8;L9m?ku5J$HY@-g0PlplOJ6diMtY#4Xy8?>b_nul zU}3<(hq)RZ0JB9q!TJ7*g$qDm7Bv41wG472gf6mdUxyJ0Fu(w!T0gdNpI+jXETozVFkt0M1hJf2=E{UGV*B6^CR!&J;SN;5A^dl&(+6rh8=5J#XEq zg^%-z`Z@xhPQ`2cqq%^h^J?Z1XMkDBTbYu#NyQ9!mp;CmLCpj1X9^xo)!=KXV11SD zZ~@y^8Qdt_>kM$+Lw3;gfFq<4dB8jfYEbYXr0MG#vh;@jzZZcF8DPvH*Ybc##k&gK zE}~fNSRX&YjF%qph(J0PnbUKe}T z1^(G!39Ft3c#G6aHccu8V7N_!+aRdj%$^4`df>_dE`u#Cvgv7yZe|vJivZsNsNF+n z9}wXCl%S{Wng0+X0t^DS_<%#W;u?ID#y$bQOX|H(3Hm+(zK3SCZ%q3p*)xA;>#+Y& zSFQHy68_A~Sag&Djst9hnFv2nwYSWFrROO)n)JXC zZqaD^o;S7OJEY!wpvj`Gxm#C%xMh-~8<~aIvg8Z`w&)h^Af{2H!8LV<_Isq>ecH1< z-%}9Z)wTWo%(l0)I$e5eu2NlrIg=ZZQ*kW|Od)m> zZxx&MMfRMZ;JE44OJFHEdu!%2&8fO$e`p?j{IayExvH};ixPB5&uMGqz_&)MUWQ9; z(f*G5$ib=cYz_irt?-!%8d{VJ&yS~P`?{dYsBx52reJ3QP_Fr>w4nz`PO`zn$w;aNWIqF ziD9QjaCbY&_l+O%Y3=amhlNed*ZGY0^ZMR=YUa9oi{MhQif?OutF>4AZ1*4Ce>JEb z(nW2D2cN$jtIsz#fgy^0f92NBD3@(HUGfVH_8UDK zL%^=amM3YMlJdT>?XcvxvGrU5dpWrIw9I{O3!?Z|tae)j_lDZwA+7>;b+(+Y3}M8r z&@COed{XY%AL`j3fPgI--24pHcFvZ$-tO(ipN56{E3LNzc1>`}k~vVdRJy)<<%hNk z*wxx{Sn~6SxiVM^Q~6U$u53e*vyub zby>0~c0J0430#bVCGSzaZN<2A)5Bh~B@5W~!p$!j@Z}S3Lac8RV4sqI!*AAR$pZFj z!c;ml<=_UQ+v5Y%8T1G6_13zMyb!Qg6Q;s}aoeO?4;M}1gVYmvwieY&c)FVY_SBNo zi-C^#`jBWwe2wPN<6;)5M6o5Tx89QdMaKZhj-wm7-gc#`6|h$edUC8X!My>xc7s&A zmMho@*iE!R3=-T9I!i53eAC$W&LDYFR~Ns2w16!L+-Ra&jQDD%lGAk`q%dbly}>{5TbvUy|yyE(X%-d6E? zEx<0?@iy1mpYY2|*IEI)Imi>Zq}uItnlaj`!JWn@@a?4+mIVXw7a`cX?Uwy;Lh;i=o<}H_3?N43L#3s zmUoL3xNyj7Gh6YgcarZf)YA&sBDOvlrDyFq;1K20@m}q-TEDi3fGsZA{G|^XDtB|^Ww;60V%xC~QGCNiv?hSn%cNrgTMj$kqI6tW z;nr*dwi00T_r%>&h)dO30b2$;jxf~Px^bPQ4w(_KWl*gHuCpF2wLMGKSpi%8ZF0U3 z^|NHhk$|mG+mqgoJc_qK*S6H@Q5AFRtbi>~+vDpjwLSGbSW#?6+8&7Y7Mju4AbD}F z9Shhp)maKrRAmhe=ibj&Ak0cc9b`BV%7wgPPr zsg|Jn1Kwg$Y;}^cw_?z>I9GQ?u_aE%lYW-MlSXTN%k$cPH!~Rv*s}Jsv5x6kd_Vp| zthg$57L<-jv7yF_6<4gzl4e^{V=D(2Af}cl&b=lzw&Yt-X#~0sL-R`{HMR19B-xp@Rlt@vIQfC-d>S6wUuCYiijW)e zhe{M%UWhZHqDj1Jf5UI2-6?;wbDD|+;1A$yQEUZ*lUF9CVh`1rwuGmu)mYFqrFBca zGT%ygx-Od>%vP=qb9x+FzAearu>-jtE__;zs--&QP_0EhS(FAr;Sr zDqzd4T(V;4AOD133fL<3v7qa|&VB;liWOI(;qgsR6x-~vSaD@+I6{loxExq%cPdd^ z9XN=!p~rJoD`3k9*O6ikDb@y-cxie3q*z#;HQ>dX+8=s4S( zc~Avx$tfRg0d5KuSmZ{Alu&h=JPNSjwZPMz@3QhvH zJoVL3|H>*Iv1%Lfhsk+1EMQAiUlpE$?bsjeBCyiO7Pr3UXPXjqZmg^uTh&YU^rz=0 zVgXy0HphXluZo6Ntzg4$UVRlSE{hGPX?TQYG#(@`LU1~F6R;&{bEtnEkz$7y2IFS! zu~BnYbOdb4)JkKh0EUX|Y_<-2o(&7w;)CUS%4!`jTwU8=I58n$i*Li}+;D^gYIO$2 zwnrIgCt%BO!y|N-ZFr#L)+lGgO2C%ehKB%ApVII!tF?BS;3R!)F()NXLlfJuf&u9I zP@S&9;xgY*6kE(miD1J6GzkZ%V8gg54GY*}hNiHfKBnGv$f3zXZ#YO^Tu7~A#l-_0 z(lFQ40mQnmac@Y$Y3Vd9iY;!7lhsz$XSkGzN6Su12-sq`IAgA@WWzlM+p#}f*oFn{ zCP`v4uf<`t_Q-}A>~JssG`Xl+rN(Y>1E{^*;zT&~P*r@AS@9$dU-bKnVvAzK;Ks^< z2b+z7y1*2ofGysH1bS6sG@=%Vfu3Yw-zzi;*kUE&No_@w1hp=`k|Q;?n0>3CWg;u? z15j;^Vjr3=qgGLDk<g#H-;I2aKK&*pWSJvJL*sHIrCQ~LWw8LO2 zFrBO;Fv$eP)zwuS>MHfD9Z+#wQGL~FJ%LFSdv$enlxuC;Ua@NoOagYjP~D8W+V*43 zfl0uwSE(*vSE;p0p#pSOy4JdOr~-ENkk1@#NNVj+Ytsf@>kN_?6ALD&ZrwkOfL%ww z>VW&zV^Zr|g_i5;NwfBNxbC_tVAoey!z4ro6-ll2?rZzqT3Z_ddj(KcI#u{K8~nI` zKmKC8&elf2t^;a>;aU;AzIsgKt#a#W`ZG&&RS-W$kbydKwu2($+m8|zIK|OBhM{A!l6tL@6>Io%a zw%sE%BOjI+>S6!kMxhGWRX{~NVzAWKbh1=DKG=R~HVIY0&IdYg^5G0r>Q&#+I5Nr6 zvC5sAv1zCRcCkwHeX5yK>Kn3O3QL_%Pd(pQTQhHy_1N>Rcc%TaQW+}QZ(FPS$)5Ub zSR|;T*u_vMm*(MML{N`NslOA{H&zXNulgfC4NAo#{e!dsom*q`CnR?XD$o5ML98h( z=?*E?+wT*2Rw$*4Vi!XVbH5$xQ#mC4uF$?w>5&kHtEr;c^P#3eDZ-I*Fz|D~JWYt{ z3Yg4rJDLX+3(+} zroPc}t4&aQhy918fO;*!W|s)SIj@~L^@8gusq~1(@5;Hq8{0k_BrhhD57~^8E5pCL z>Q>B`1eo>O^j$LgS&!P`BOj=p=}y%)h;347 zN9$IX+L=&KH@5U9U@sPsPVbK4AU&8nJMNc{Ce*4G7RXCePpc00Je9hsddg6}^?IPO zZX44kmA3LHA=|R4v}#}%*>3)(_2E34uAg`?uEQ$j`kI}9Tw3d`5?DOv_31Vy%=ez~ zqywLyN-FJG=y{dCGT#m#=r2ocy;T5<3to3>`o3^!K;qhYOe#GlmHHEpDe?L{WDwNS zTW^`cE&}?l?eZa^h$o1SCmoLcB?9#1BG37I*|;h}EeqIXf!bU+N>$1i$3j2f%PQ?= zlMutHTIy5cP0 zuF#FxCEM*9?DUL!({HFp!FDT=c*_D7mwYe1HogNp6^sU1IO=gd^;Z#1Ew|6pfs}eD zwp(?T76I(CFmaCMra&X)I_mFwK?)6_D6E%`uZ!(&5-eWe{XEQ5pb?Hqkt4pBD#7e~ zkfc!MT+d*a)tLuss+x8;4Hhr>{&Wv&rzRKtG$6Gt1NvkSAWH9a0nn$kJ0QEw*U)PX zbk$(-JwAgoW{CpK0Cec@%E)$>4|0G$mM*QD5aAoEshChBw$)ahaJ4RP6KjcpIJ#cm&lp2Jt>Bm9#9 zU9lD8lEG&lOp~+Pgg}l7;*gX%Vuez=4ayu^)gxuLM%lenL%OvD^;)$p>rm`6Q+ap} zOgjT6-^tk9ErA?S-5jAcBkDbeq)di59NJ&UjrhZ{)~zJ>J;L`?0(5z>_8f5M!E`ee znOCL>stmO=gX!BAbY^T}K#$d!ClOegZ<9lFt9D?fV2V256YOv%JaDKmnrE-!7at%P z0_YzTyo9VZRVku}N{S5qB|n~6F@+%W+J0x>!2hzvT7oJtSG2*w&#(UN9W|cL$DTgt zUpO_A^q(VmhTu(<$uK=!OK=elg`Nb>$dDpafTYHu`Gq|9wb_fGn&0pn_W^u;MwJ3{ z1ql{Ue|?&i_KF&QQYa8J>wm!%Vo0tA379)$y8r|nQ=raS0_ed~eY6D6SUjF=guVN2Ue{CD;k^g=KH7u10%yn5Y!TVeICDUWfu%mK@*brP@KLgjQ6Gt_Xp;}U* zYv@M|)pe5Z-7xx_>&GuxjqbNT3vf znpp54d7+xM$MaI}rS+<%$>tfbftSuulc%xZCd#HZ>BJY#6;GyRuI zusVGGQ03sA`5J*(EU?kCQ-%VrL}2qzWUJ05*PsxvvXyE3e*p#nq@$)R26Mcd00000 LNkvXXu0mjfPdij9 literal 0 HcmV?d00001 diff --git a/betterawstats/icons/collapse.gif b/betterawstats/icons/collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..59be44da3cf1fe3d2a160a360dde8705dcec445b GIT binary patch literal 978 zcmZ?wbhEHb6l4%&_%6qA@6N5yA3wf)@#6fMQ;#0r|M2eJqlXXf-oADJ?w$Mh?moDG z@8N^{j~_j}cjxxC%a`uly7}bMqX+lyK7ab;?dw-h9zS~Z;`!gdf4_bClAV=x`{s?G zKYslC_itif*MBfz7zLvtFt|fN@h1x-1A`oc4#=6HJi)-Rp24<4!C~QogUuow9A5+) z8QR+gl#3Ju4l*}z$jEryI5BZCGoK)X!2^bcO(!R7XmdO`aDaiGS2*d^9Lt5w?9AM8 zVj2w#m;3Wr=jsJ~Fmh;^Z`XS(WWs}|t;+)z$8DI&aL}7KVsqBj1YyVK>0*bvWU~*Z zH8bm*uZTTe)_j(k|I)VH?9YyDJBzR1I#VF-)V{xgxjbT~;voh;CKmQM%LR)PJ10o% RvmDsIDRmzM3mXfAH2~egnh^j1 literal 0 HcmV?d00001 diff --git a/betterawstats/icons/empty.png b/betterawstats/icons/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..46da0e7cf967f3635cfdc52b89e3f5ce93783b7d GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamUKs7M+S!VC(K#9UIO`&C9V-A z!TD(=<%vb942~)JNvR5+xryniL8*x;m4zo$ZGehoJY5_^DsCnH`TyUZ*|MRt(Z^s_ hVaVfviyQ(843%G*C8Hi*kOrz_@O1TaS?83{1OOqOC|&>n literal 0 HcmV?d00001 diff --git a/betterawstats/icons/expand.gif b/betterawstats/icons/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6689d52f6061964d3e605aded9ffb38f987aa85 GIT binary patch literal 281 zcmV+!0p|WkNk%w1VG#fk0K^^u-rU;h=;-3%-_Oj-@b2#8;^EfQ(&Xae;o#rk-`?Wk z;N9EW-`(8a+}qsR+27vX;NIQm<>dYS{r2?q^YQWR>+0m=;_B$<+u7Lp`1t<*{%dM# zk&cT0|NsC0{{R30A^8LW0015UEC2ui01*HY000G+pyvTtX`UD$deFeVaLf%5>jqt} z>%k0R9Ncc$IdDpxj%LYhYBEPha=EEmH%q8vG1XkHS7 z>#2$@InOtpuqyg8<+R}9g-+|v&13&5`dCp`{|95_8^+nQkC>(b&0z3!^>bP0l+XkK DO07OF literal 0 HcmV?d00001 diff --git a/betterawstats/icons/fulllist.png b/betterawstats/icons/fulllist.png new file mode 100644 index 0000000000000000000000000000000000000000..a71511c6c3bf00e96d02d78059b35d3073dd4490 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmUKs7M+S!VC(K#9UIO`&C9V-A z!TD(=<%vb942~)JNvR5+xryniL8*x;m4zo$ZGehuJzX3_DsCnH`TyUZS+jxln1{c= zJ@b;Dk1I;&S{6T(Q&V9SR(RL4DV*6*S!f+YlB$UGf(N!!_O+|=8Fw^xHcYl|h!BWm znBG>T@Q;6~WXHt|oTa~Y<}7SsULw4S@mZW|(?;nh_*-d!urN<0!hX z8{+mXqE@Y8Xk?VJo2v_<;N&=pnVDJin$2ASFXb{4i8IX2dxRoZ$mi6%joGb z>Q99b2Ig?(ZKu2CuEIV9aiZ**Eet) ziy@UxV{&2wexFbJ>Fo9OO?)R6{e{$T$7C{z*1!~g&Q literal 0 HcmV?d00001 diff --git a/betterawstats/icons/help.png b/betterawstats/icons/help.png new file mode 100644 index 0000000000000000000000000000000000000000..7be8fdfe5f9f04b5d997c449b62ee99550d9d450 GIT binary patch literal 485 zcmVsb~Vw41O|sP{QLWl zL0(abk@4Q0TVNM#+_09x)zyPRP)LZN0q@_vW7xfW2ZMh=FxW+mj~_k!zi!P+hTxD0 z1~xWUqFwTzfstXwvPBF*A>j-xurLu76Jz-D`4iEG2#JV734SRu)A;D=>C&fmbhI!r4r$zyPzeb6{AzW(A4_ zJ^)e&O7b9mApP)M{QlirhC_!A5S{En1_%lXLvk@JOzz*k{r@j8YZD8YfklU+vMM;r b00ImE5X-BIOa!F)00000NkvXXu0mjfz%|SJ literal 0 HcmV?d00001 diff --git a/betterawstats/icons/index.html b/betterawstats/icons/index.html new file mode 100644 index 0000000..e69de29 diff --git a/betterawstats/icons/screen.png b/betterawstats/icons/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e64d82930ce9fe6bf5faedc963beaec6011339 GIT binary patch literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ihk44ofy`glX(f`hhDcma nHo3g_e1o)s;R9CXP$`B93XEaLpZ#70RKVcr>gTe~DWM4fRoWLW literal 0 HcmV?d00001 diff --git a/betterawstats/icons/unknown.png b/betterawstats/icons/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..d55bd30ff38c510a915ef9ae44a2a96eb27d393c GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmUKs7M+S!VC(K#9UIO`&C9V-A z!TD(=<%vb942~)JNvR5+xryniL8*x;m4zo$ZGeiZJzX3_DsCnH`TyUZS+jw4=Hz+v z_!gaN+`+8%MXtlzvEtd8nF)+)Cd>(4+6^-VR{_QQGMUeqsQi=DSj!@uaOiPNvcf#h z(rY?SQZWrbc&5DNI+EUb@c_fu(~&8hF;WTh?ltQ*dNXUJ{B!>6IE8Ia!^A5y)NZmh cFfcQye3$%kWpnN#pfeaeUHx3vIVCg!04BUrasU7T literal 0 HcmV?d00001 diff --git a/betterawstats/icons/unknown_btn.png b/betterawstats/icons/unknown_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..50f78982df087b786ef8e74a2937c434c76915ae GIT binary patch literal 520 zcmV+j0{8uiP)GR;6hZcz1k+%?X2aJ8de60t(85WynSH z652$=u0KFXyIJQMJU=Oj$4}sNxz+;4qY=vG63)((JR{OmyYw-Ck7Vi^cDv1TCKLp@ zyIaVqD@e05aeF-Y`TjDTsXK zfoLSc*Du8)SlMiC%IGg-+MVNAjN42H!61i>#$&^0Eo5H3ejj;7!G>PaVJNf|B48dO zNhWKyTDZw(^@~7|$zX6{bC(cq&j%kT#R%e%A)A%vJ5STM7dt!CxS zLl#vi6p&7*p{nZtA(k#3D`&R&7!I-R^;#}xI2agn!KNQ(I2?tN&zUw>iTSZB&*E6T z@ruWzPtJ4xKW(cL^{>Ofx6j-8E5HEV62bcI^Q%Ju0000< KMNUMnLSTY0QQ?08 literal 0 HcmV?d00001 diff --git a/betterawstats/icons/versions.png b/betterawstats/icons/versions.png new file mode 100644 index 0000000000000000000000000000000000000000..38357eff3169202c7d929537f190576eea7515e4 GIT binary patch literal 237 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 'fieldset', + '#title' => t('AWstats configuration'), + '#collapsible' => TRUE, + '#collapsed' => FALSE, + '#weight' => -1 + ); + $form['bawstats_config']['bawstats_data'] = array( + '#type' => 'textfield', + '#size' => 40, + '#maxlength' => 80, + '#title' => t('AWstats data directory'), + '#default_value' => variable_get('bawstats_data',''), + '#description' => t('Set this value to the directory where AWStats saves its database files into. No trailing slash.'), + '#weight' => -3 + ); + $form['bawstats_config']['bawstats_lib'] = array( + '#type' => 'textfield', + '#title' => t('AWstats library directory'), + '#size' => 40, + '#maxlength' => 80, + '#default_value' => variable_get('bawstats_lib',''), + '#description' => t('Set this value to the directory where the AWStats library files are located (the "lib" directory under the AWstats tree). No trailing slash.'), + '#weight' => -2 + ); + $form['bawstats_config']['bawstats_lang'] = array( + '#type' => 'textfield', + '#title' => t('AWstats language directory'), + '#size' => 40, + '#maxlength' => 80, + '#default_value' => variable_get('bawstats_lang',''), + '#description' => t('Set this value to the directory where the AWStats language files are located (the "lang" directory under the AWstats tree). No trailing slash.'), + '#weight' => -1 + ); + $bawstats_path = drupal_get_path('module', 'bawstats'); + $form['bawstats_config']['bawstats_icon'] = array( + '#type' => 'textfield', + '#title' => t('AWstats icon directory'), + '#size' => 40, + '#maxlength' => 80, + '#default_value' => variable_get('bawstats_icon','/' . $bawstats_path . '/icon'), + '#description' => t('Set this value to the URL where AWStats icons can be obtained. Note, as this is used for icon URLs, this must be in web file space. The default is to copy the icons to a directory called "icon" in the toplevel of the BAWstats module directory') . ' (' . $bawstats_path . '/icon).', + '#weight' => 0 + ); + $form['bawstats_settings'] = array( + '#type' => 'fieldset', + '#title' => t('BAWstats general settings'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#weight' => 0 + ); + $form['bawstats_settings']['bawstats_page_view'] = array( + '#type' => 'checkbox', + '#title' => t('Split page view'), + '#default_value' => variable_get('bawstats_page_view',0), + '#description' => t('By default statistics for a single month are displayed on a single large page. Selecting this option splits the page into multiple sub-views.'), + '#weight' => 1 + ); + // turn off display controle if we are not yet configured + //if ($configured==0) $form['bawstats_settings']['bawstats_page_view']['#disabled']=TRUE; + + $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration') ); + $form['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset to defaults') ); + + if (!empty($_POST) && form_get_errors()) { + drupal_set_message(t('The settings have not been saved because of the errors.'), 'error'); + } + + $form['#submit'][] = 'bawstats_admin_settings_submit'; + $form['#theme'] = 'system_settings_form'; + + return $form; +} + +function _bawstats_remove_slash($path) { + if (substr($path,strlen($path)-1,1)=='/') return substr($path,0,strlen($path)-1); + return $path; +} + +function bawstats_admin_settings_validate($form, &$form_state) { + global $BAW_CONF,$BAW_LIB,$BAW_CONF_DIS_DEF; + $op = isset($form_state['values']['op']) ? $form_state['values']['op'] : ''; + + if ($op!=t('Reset to defaults')) { + // check the key paths + + $settingOK = TRUE; + $data_dir = _bawstats_remove_slash($form_state['values']['bawstats_data']); + + if (is_dir($data_dir)) { + if (!is_readable($data_dir)) { + form_set_error('bawstats_data', t('AWstats data directory "') . $data_dir . t('" is not accessible.')); + $settingOK = FALSE; + } + } else { + form_set_error('bawstats_data', t('AWstats data location "') . $data_dir . t('" is not a directory.')); + $settingOK = FALSE; + } + + if (!$settingOK) variable_del('bawstats_data'); // this is evil doing this in validate, but ensures clean fall-over + + $settingOK = TRUE; + $lib_dir = _bawstats_remove_slash($form_state['values']['bawstats_lib']); + + if (is_dir($lib_dir)) { + if (is_readable($lib_dir)) { + // directory is there and readable, so check it contains the AWstats lib stuff + if (!is_readable($lib_dir.'/domains.pm')) { + form_set_error('bawstats_lib', t('AWstats library directory "') . $lib_dir . t('" does not contain the necessary library files?')); + $settingOK = FALSE; + } + } else { + form_set_error('bawstats_lib', t('AWstats library directory "') . $lib_dir . t('" is not accessible.')); + $settingOK = FALSE; + } + } else { + form_set_error('bawstats_lib', t('AWstats library location "') . $lib_dir . t('" is not a directory.')); + $settingOK = FALSE; + } + + if (!$settingOK) variable_del('bawstats_lib'); // this is evil doing this in validate, but ensures clean fall-over + + $settingOK = TRUE; + $lang_dir = _bawstats_remove_slash($form_state['values']['bawstats_lang']); + + if (is_dir($lang_dir)) { + if (is_readable($lang_dir)) { + // directory is there and readable, so check it contains the AWstats lib stuff + if (!is_readable($lang_dir.'/awstats-en.txt')) { + form_set_error('bawstats_lang', t('AWstats library directory "') . $lang_dir . t('" does not contain the necessary language files?')); + $settingOK = FALSE; + } + } else { + form_set_error('bawstats_lang', t('AWstats language directory "') . $lang_dir . t('" is not accessible.')); + $settingOK = false; + } + } else { + form_set_error('bawstats_lang', t('AWstats language location "') . $lang_dir . t('" is not a directory.')); + $settingOK = FALSE; + } + + if (!$settingOK) variable_del('bawstats_lang'); // this is evil doing this in validate, but ensures clean fall-over + } +} + + +function bawstats_admin_settings_submit($form, &$form_state) { + global $BAW_CONF,$BAW_LIB,$BAW_CONF_DIS_DEF; + $op = isset($form_state['values']['op']) ? $form_state['values']['op'] : ''; + + // Exclude unnecessary elements. + unset($form_state['values']['submit'], $form_state['values']['reset'], $form_state['values']['form_id'], $form_state['values']['op'], $form_state['values']['form_token']); + + foreach ($form_state['values'] as $key => $value) { + if ($op == t('Reset to defaults')) { + variable_del($key); + } + else { + if (is_array($value) && isset($form_state['values']['array_filter'])) { + $value = array_keys(array_filter($value)); + } + // Test the key is correct: + + if ($key == 'bawstats_data') { + // assume validation has taken care of testing for directory/readable + $value = _bawstats_remove_slash($value); + // do some further checking + $count = count(glob($value . "/*.txt")); + if ($count==0) drupal_set_message(t('Warning, the AWstats data directory "') . $value . t('" does not contain any text data files'),'warning'); + } + + if ($key == 'bawstats_lib') { + // assume validation has taken care of testing for directory/readable + $value = _bawstats_remove_slash($value); + } + + if ($key == 'bawstats_lang') { + // assume validation has taken care of testing for directory/readable + $value = _bawstats_remove_slash($value); + } + + if ($key == 'bawstats_icon') { + // assume validation has taken care of testing for directory/readable + $value = _bawstats_remove_slash($value); + $testvalue = substr($value,1); + // do some further checking + if (is_dir($testvalue)) { + if (is_readable($testvalue)) { + // directory is there and readable, so check it contains the AWstats lib stuff + if (!is_readable($testvalue.'/browser')) { + drupal_set_message(t('Warning, the AWstats icon path "') . $value . t('" does not appear to contain icon directories.'),'warning'); + } + } else { + drupal_set_message(t('Warning, the AWstats icon path "') . $value . t('" is not accessible.'),'warning'); + } + } else { + drupal_set_message(t('Warning, the AWstats icon path "') . $value . t('" is not a directory.'),'warning'); + } + } + + // set the actual variable + variable_set($key, $value); + } + } + + if ($op == t('Reset to defaults')) { + drupal_set_message(t('The configuration options have been reset to their default values.')); + } + else { + drupal_set_message(t('The configuration options have been saved.')); + } + + // can only get this if configured + if ((strlen($BAW_CONF['path_data'])>0)&&(strlen($BAW_CONF['path_lib'])>0)&&(strlen($BAW_CONF['path_lang'])>0)) { + // create the stat groups var in case they are wanted post configuration! + $statgroups = array(); + foreach ($BAW_LIB['item_groups'] as $group => $group_details) { + $statgroups[check_plain($group)] = check_plain($group_details['title']); + } + variable_set('bawstats_groups',$statgroups); + + // similarly with the stat sections + $statsections = array(); + foreach ($BAW_CONF_DIS_DEF as $key => $value) { + $statgroups[] = $key; + } + variable_set('bawstats_sections',$statsections); + } + + menu_rebuild(); +} diff --git a/betterawstats/includes/bawstats.config.inc b/betterawstats/includes/bawstats.config.inc new file mode 100644 index 0000000..443d1db --- /dev/null +++ b/betterawstats/includes/bawstats.config.inc @@ -0,0 +1,114 @@ + 0); +$BAW_MES = array(); +$BAW_DFILES = array(); // data files +$BAW_SERVERS = array(); // this will be populates with the servers for the config + +if (!defined ('XHTML')) { + if ($BAW_CONF['xhtml']) { + define('XHTML', ' /'); + } else { + define('XHTML', ''); + } +} +if (!defined ('BR')) { + define('BR', ''); +} + +// check we are configured... +if ((strlen($BAW_CONF['path_data'])>0)&&(strlen($BAW_CONF['path_lib'])>0)&&(strlen($BAW_CONF['path_lang'])>0)) { + include_once($bawstats_path . '/core/helpers.inc.php'); + include_once($bawstats_path . '/modules/render_htmlchart.inc.php'); + include_once($bawstats_path . '/modules/render_table.inc.php'); + include_once($bawstats_path . '/modules/render_jpgraph.inc.php'); + include_once($bawstats_path . '/modules/render_map.inc.php'); + include_once($bawstats_path . '/core/data.inc.php'); + include_once($bawstats_path . '/core/language.inc.php'); + baw_language(); + include_once($bawstats_path . '/core/display_helpers.php'); + + if (!isset($BAW_MES['e'])) { + $BAW_MES['e'] = 'utf-8'; + } + + //baw_check_config(); + include_once($bawstats_path . '/core/library.inc.php'); + + include_once($bawstats_path . '/core/display.inc.php'); + include_once($bawstats_path . '/core/extras.inc.php'); + + // add language-dependent library values + $BAW_LIB['domains']['unknown'] = $BAW_MES[0]; + $BAW_LIB['domains']['ip'] = $BAW_MES[0]; + $BAW_LIB['os']['list']['Unknown'] = $BAW_MES[0]; + $BAW_LIB['browser']['names']['Unknown'] = $BAW_MES[0]; + $BAW_LIB['browser']['icons']['Unknown'] = 'unknown'; + include_once($bawstats_path . '/core/config_default.inc.php'); +} + +$BAW_CONF['site_url'] = '/admin/bawstats'; + +// ensure the baw backend knows we are drupal +$BAW_CONF['module'] = 'drupal'; + +unset($bawstats_path); diff --git a/betterawstats/includes/bawstats.css b/betterawstats/includes/bawstats.css new file mode 100644 index 0000000..85bf070 --- /dev/null +++ b/betterawstats/includes/bawstats.css @@ -0,0 +1,143 @@ + +.baw-content table { + font-size: 0.9em; + margin: 0px auto; + border-collapse: separate; +} +.baw-content td, th { + padding-left:2px; + padding-right:2px; + padding-bottom:1px; + padding-top:1px; +} +.baw-content th { + padding: 0 5px 0 5px; + text-align:center; +} +.baw-content tbody { + border:0px; +} +.baw-content tbody th { + border:0px; +} +.baw-content img { + margin: 0px; + padding: 0px; + border:0px; +} +.baw-content .chartcell { + padding:2px; + vertical-align:bottom; + white-space: nowrap; + text-align:center; +} +.baw-content .charttable { + margin-bottom: 10px; + margin-top:8px; + white-space: nowrap; +} +.baw-content .datatable { + background-color:#eeeeee; +} +.baw-content .datatable tr{ + background-color:#ffffff; +} +.baw-content .chartlegend { + background-color:#eeeeee; + font-size: 0.9em; + border: none; +} +.baw-content div.aws_data{ + text-align: center; + border: 1px solid #dddddd; + margin-bottom: 15px; + padding:5px; +} +.baw-content .aligncenter { + text-align:center; +} +.baw-content .alignright { + text-align:right; +} +.baw-content .alignleft { + text-align:left; +} + +.baw-content .others { + color:grey; +} + +.baw-content th.layout_text { + background-color: #ECECEC; +} +.baw-content th.layout_visitors{ + background-color: #FFAA66; +} +.baw-content th.layout_visits { + background-color: #F4F090; +} +.baw-content th.layout_pages { + background-color: #4477DD; +} +.baw-content th.layout_hits { + background-color: #66DDEE; +} +.baw-content th.layout_percent { + background-color: #ECECEC; +} +.baw-content th.layout_bytes { + background-color: #2EA495; +} +.baw-content td.layout_text { + text-align:left; +} +.baw-content tr.layout_avg td, +.baw-content tr.layout_sum td{ + background-color: #CCCCCC; +} +.baw-content td.layout_bytes , +.baw-content td.layout_hits , +.baw-content td.layout_pages , +.baw-content td.layout_visits , +.baw-content td.layout_visitors , +.baw-content td.layout_percent { + text-align:right; +} +.baw-content .currentday{ + font-weight:bold; +} +.baw-content tr.weekend, +.baw-content td.weekend { + background-color:#DDDDCC; +} + +.baw-content .conf_setting{ + clear:both; + border:1px solid grey; + padding: 2px; + margin: 2px; +} +.baw-content .default { + color:blue; +} +.baw-content .small { + font-size:0.9em; + font-weight:normal; +} +.baw-content .percent_button { + width:9px; + text-align:center; + border:grey 1px solid; + position:absolute; + bottom:0px; + right:-8px; + font-size:0.9em; +} + +.baw-content .header_wrap { + position:relative; +} + +.baw-map { + text-align: center; +} diff --git a/betterawstats/includes/bawstats.stats.inc b/betterawstats/includes/bawstats.stats.inc new file mode 100644 index 0000000..c2a8980 --- /dev/null +++ b/betterawstats/includes/bawstats.stats.inc @@ -0,0 +1,464 @@ +0)&&(strlen($BAW_CONF['path_lib'])>0)&&(strlen($BAW_CONF['path_lang'])>0)) { + + // recall the site we are looking at from the SESSION + if (isset($_SESSION['bawstats'])) { + $BAW_CURR['site_name'] = $_SESSION['bawstats']['site_name']; + } else { + // its not set in the session, so set it here to the default (and record it in the session for the future) + $oursite = $_SERVER['HTTP_HOST']; + if (strpos(strtolower($oursite),"www.")===0) $oursite = substr($oursite,4); // remove www. if any + // this can be overriden only in the settings.php file using conf + $BAW_CURR['site_name'] = variable_get('bawstats_defsite',$oursite); + $_SESSION['bawstats']['site_name'] = $BAW_CURR['site_name']; + } + + // record what was requested before checks so we can make a nice message + $rec_year = $BAW_CURR['year']; + $rec_month = $BAW_CURR['month']; + + // sanity check on date data: + if ((!is_numeric($BAW_CURR['month']))||(intval($BAW_CURR['month'])<1)||(intval($BAW_CURR['month'])>12)) { + $site_OK = False; + $date_OK = False; + // drupal_set_message(t('Invalid month %name.', array('%name' => $BAW_CURR['month']))); + $BAW_CURR['month'] = '01'; + } + $curyear = date('Y'); + if ((!is_numeric($BAW_CURR['year']))||(intval($BAW_CURR['year'])>intval($curyear))) { + $site_OK = False; + $date_OK = False; + //drupal_set_message(t('Invalid year %name.', array('%name' => $BAW_CURR['year']))); + $BAW_CURR['year'] = $curyear; + } + + // $BAW_CURR['monthyear'] = $BAW_CURR['month'].$BAW_CURR['year']; + $BAW_CURR['yearmonth'] = $BAW_CURR['year'].$BAW_CURR['month']; + + // set key request variables in the session for use in the, only if sane! + if ($site_OK) { + $_SESSION['bawstats']['month'] = $BAW_CURR['month']; + $_SESSION['bawstats']['year'] = $BAW_CURR['year']; + } + + baw_match_files(); + + // some simple validation + if (count($BAW_DFILES)>0) { + + // build a 'stats selection' form + $form['bawstats'] = array( + '#type' => 'fieldset', + '#title' => t('Statistics selection'), + '#prefix' => '
', + '#suffix' => '
' + ); + + // check year is in list of options: + + // FIX, this doesn't work - range of years is nolonger filled, as baw_match_files doesn't do it! + if (!isset($BAW_CURR['years'][$BAW_CURR['year']])) { + $site_OK = False; + drupal_set_message(t('No data for year %name.', array('%name' => $BAW_CURR['year']))); + $BAW_CURR['year'] = $curyear; + // re-read data for current year, so that the forms are correctly built + // need new function! baw_read_data(); + } + + $options = bawstats_sites_dropdown(); + + // make sure stats exist for this site + if ((!isset($options[$BAW_CURR['site_name']])) && + (!(($BAW_CURR['site_name']=='all_days')||($BAW_CURR['site_name']=='all_months')))) $site_OK = False; + + // only admin has the option of sites + if ($site_access>0) { + if (count($options) == 1 ) { + $BAW_CURR['site_name'] = $options[0]; + } + $form['bawstats']['site'] = array( + '#type' => 'select', + '#options' => $options, + '#default_value' => $BAW_CURR['site_name'] + ); + } + + $options = bawstats_months_dropdown(); + + $form['bawstats']['month'] = array( + '#type' => 'select', + '#options' => $options, + '#default_value' => $BAW_CURR['months'][$BAW_CURR['month']] + ); + + $form['bawstats']['year'] = array( + '#type' => 'select', + '#options' => $BAW_CURR['years'], + '#default_value' => $BAW_CURR['year'] + ); + + $form['bawstats']['submit'] = array( + '#type' => 'submit', + '#value' => t('View') + ); + } else $site_OK = False; + + if ($site_OK) { + $form['bawstats_results'] = array( + '#value' => bawstats_display() + ); + } else { + if ($date_OK) { + $form['bawstats_results'] = array( + '#value' => "No statistics found for site " . $BAW_CURR['site_name'] . " " . $rec_month . "/" . $rec_year + ); + } else { + $form['bawstats_results'] = array( + '#value' => "No statistics found for site " . $BAW_CURR['site_name'] . " " + ); + } + + } + } else { + $form['bawstats_results'] = array( + '#value' => 'No statistics found. Please check the configuration of the AWstats data, library and language locations.' + ); + } + + return $form; +} + +function bawstats_view_theform($month='-1',$year='-1',$section='') { + global $BAW_CURR, $BAW_CONF_DIS_DEF, $BAW_CONF, $BAW_LIB; + + // get configuration from drupal variables + $BAW_CONF['path_data'] = variable_get('bawstats_data',''); + $BAW_CONF['path_lib'] = variable_get('bawstats_lib',''); + $BAW_CONF['path_lang'] = variable_get('bawstats_lang',''); + + if (is_numeric($year) && is_numeric($month)) { + if (intval($month)>=0) { + //bawstats_view_selection will check validity of month + $BAW_CURR['month'] = $month; + } else { + $BAW_CURR['month'] = date('m'); + } + + if (intval($year)>=0) { + //bawstats_view_selection will check validity of year + $BAW_CURR['year'] = $year; + } else { + $BAW_CURR['year'] = date('Y'); + } + } + + if (strlen($section)>1) { + // validate sections (ignore all that are not recognised from the default configuration) + $found = False; + // NOTE, must ensure group and section names are different! + // first, is it a group? + foreach ($BAW_LIB['item_groups'] as $group => $group_details) { + if ($section==check_plain($group)) { + $found = True; + break; + } + } + if ($found) $BAW_CURR['drupal_group'] = $section; + else { + // second, is it a section + foreach ($BAW_CONF_DIS_DEF as $key => $value) { + if ($section==$key) { + $found = True; + break; + } + } + if ($found) $BAW_CURR['drupal_section'] = $section; + } + } + return drupal_get_form('bawstats_view_selection'); +} + +/** + * set the desired viewing section using the current view + */ + +function bawstats_set_section($section='') { + global $BAW_CONF; + + $month = '0'; + $year = '0'; + + if (isset($_SESSION['bawstats'])) { + if (isset($_SESSION['bawstats']['month'])) $month = $_SESSION['bawstats']['month']; + if (isset($_SESSION['bawstats']['year'])) $year = $_SESSION['bawstats']['year']; + } + + if ((strlen($section)>1)&&(intval($month)>0)&&(intval($year)>0)) drupal_goto($BAW_CONF['drupal_base'] . '/' . $section . '/' . $month . '/' . $year); + else drupal_goto('admin/bawstats'); +} + +/** + * perform the chosen display settings + */ + +function bawstats_view_selection_submit($form, &$form_state) { + global $BAW_CURR, $BAW_MES, $BAW_LIB, $BAW_CONF; + + $site_access = variable_get('bawstats_admin_access', 0); + + $form_values = $form_state['values']; + + if (isset($form_values['year'])) { + $year = $form_values['year']; + } else { + $year = date('Y'); + } + + if (isset($form_values['month'])) { + $month = array_search($form_values['month'],$BAW_CURR['months']); + } else { + $month = date('m'); + } + + if ($site_access>0) { + // ensure we are allowed to change sites + if (isset($form_values['site'])) { + // alter the session site record + $_SESSION['bawstats']['site_name'] = $form_values['site']; + } + } + + if (variable_get('bawstats_page_view',0)==0) $redirect = $BAW_CONF['drupal_base'] . '/all/' . $month . '/' . $year; + else { + $statgroups = variable_get('bawstats_groups',array()); + $keys = array_keys($statgroups); + $redirect = $BAW_CONF['drupal_base'] . '/' . $keys[0] . '/' . $month . '/' . $year; + } + $form_state['redirect'] = $redirect; +} + +/** + * mirror function to betterawstats baw_sites_dropdown() [core/display_helpers.php] + */ + +function bawstats_sites_dropdown() { + global $BAW_CURR,$BAW_DFILES, $BAW_MES; + $sites = array(); + + $detected = array_keys($BAW_DFILES); + $site_access = variable_get('bawstats_admin_access', 0); + + if (count($detected)>0) { + foreach ($detected as $site) { + $sites[$site] = $site; + } + if ($site_access>0) { + # add the "all" options + $sites['all_months'] = $BAW_MES['all_months']; + $sites['all_days'] = $BAW_MES['all_days']; + } + } // else there is a problem - no sites data! + + return $sites; +} + +/** + * mirror function to betterawstats baw_date_dropdown() + */ + +function bawstats_months_dropdown() { + global $BAW_CURR, $BAW_MES; + + $months = array(); + + foreach ($BAW_CURR['months'] as $month) { + $months[$month] = $month; + } + return $months; +} + +/** + * perform the display, main calls to the betterawstats library + * + */ + +function bawstats_display() { + global $BAW_CURR, $BAW_LIB; + + $out = "
\n"; + + if (@$BAW_CURR['site_name'] == 'all_months') { + $settings['section'] = "months"; + $out .= baw_display_drupal($settings); + } else if (@$BAW_CURR['site_name'] == 'all_days') { + $settings['section'] = "days"; + $out .= baw_display_drupal($settings); + } else if (@strlen($BAW_CURR['drupal_section'])>1) { + $settings['section'] = $BAW_CURR['drupal_section']; + $out .= baw_display_drupal($settings); + } else { + if (variable_get('bawstats_page_view',0)>0) { // sub-pages + if (@strlen($BAW_CURR['drupal_group'])>1) { + $settings['group'] = $BAW_CURR['drupal_group']; + } else { + // as we are in multi-page view, produce the first entry only + $groupkeys = array_keys($BAW_LIB['item_groups']); + $settings['group'] = $groupkeys[0]; + } + $out .= baw_display_drupal($settings); + } else $out .= baw_display_drupal(); + } + + $out .= "
\n"; + + return $out; +} + +/** + * mirror function to, and based on, betterawstats baw_display_index() + */ + +function baw_display_drupal($settings = array()) { + global $BAW_CONF, $BAW_CONF_DIS, $BAW_CONF_DIS_DEF, $BAW_D, $BAW_MES, $BAW_CURR, $BAW_LIB, $BAW_DFILES; + + // sort the charts according to order in config + $BAW_CONF_DIS = baw_array_sorting($BAW_CONF_DIS, 'order', SORT_ASC); + + // ---------- CONTENT BOX -------------------------------------------------- + // create the main content + $content = "
\n"; + $nodata = 0; + + if (isset($settings['section'])) { + $section = $settings['section']; + $function = "baw_display_$section"; + $temp_conf = $BAW_CONF_DIS[$section]; + $temp_conf['top_x'] = false; + $temp_conf['chart'] = false; + $temp_conf['table'] = true; + if (($section == 'months') || ($section == 'days')){ + $temp_conf['chart'] = true; + $temp_conf['table'] = false; + } else { + $temp_conf['chart'] = false; + $temp_conf['table'] = true; + } + $temp_conf['name'] = $BAW_CONF_DIS_DEF[$section]['name']; + if (function_exists($function)) { + $stats_html .= $function($temp_conf); + if ((strlen($stats_html)> 1) || (!$BAW_CONF['hideempty'])) { + $content .= $stats_html; + $nodata += 1; + } + } + if ($nodata==0) { + $content .= 'No data found for site '.$BAW_CURR['site_name'].' during '.$BAW_CURR['month'].'/'.$BAW_CURR['year']; + } + } else { + $singlegroup = false; + if (isset($settings['group'])) { + $showonly = $settings['group']; + $singlegroup = true; + } else $showonly = ''; + $content .= "\n\n"; + foreach ($BAW_LIB['item_groups'] as $group => $group_details) { + if (($showonly==$group)||($showonly=='')) { + $group_items = $group_details['members']; + $has_overview = in_array('overview',$group_items); + if ($singlegroup&&(!$has_overview)) { + // pretend to display the overview, as it sets some BAW_CURR variables that may be needed + // by other groups (namely, session) + $sect_data = $BAW_CONF_DIS['overview']; + $sect_data['name'] = 'overview'; + $junk = baw_display_overview($sect_data); + } + $menubuttons = ''; + $stats_section = ''; + $item_id = 0; + $count_members = count($group_details['members']); + $content .= "\n\n"; + + foreach ($group_details['members'] as $item) { + $sect_data = $BAW_CONF_DIS[$item]; + $sect_data['name'] = $item; + //if ($item == 'weekdays' && !isset($BAW_CURR['wdays']['count'])) { + // $setarr = array('collapse' => false, 'chart' => false,'table' => false); + // baw_display_weekdays($setarr); + //} + $class = 'aws_data'; + $function = "baw_display_$item"; + $title = $BAW_CONF_DIS_DEF[$item]['name']; + if (($sect_data['show'] == true)&&(function_exists($function))) { + $stats_html = $function($sect_data); + if ((strlen($stats_html)> 1) || (!$BAW_CONF['hideempty'])) { + $stats_section .= "\n\n"; + $collapse = false; + $name = "{$group}_$item_id"; + $stats_section .= "

$title

\n" + . "
\n" + . $stats_html + . "
"; + $stats_section .= "\n\n"; + } + } + $item_id++; + } + if ((strlen($stats_section)> 1) || (!$BAW_CONF['hideempty'])) { + $content .= '

' . $group_details['title'] . '

'; + $content .= $stats_section; + $nodata +=1; + } + $content .= "\n\n"; + } + } + $content .= "\n\n"; + if ($nodata==0) { + $content .= 'No data found for site '.$BAW_CURR['site_name'].' during '.$BAW_CURR['month'].'/'.$BAW_CURR['year']; + } + } + $content .= "
"; + return $content; + // return filter_xss($content, array('a', 'em', 'strong', 'cite', 'code', 'ul', 'ol', 'li', 'dl', 'dt', 'dd', 'table', 'td', 'tr', 'th', 'div', 'img', 'br', 'h1', 'h2', 'h3')); +} diff --git a/betterawstats/includes/index.html b/betterawstats/includes/index.html new file mode 100644 index 0000000..e69de29 diff --git a/betterawstats/index.php b/betterawstats/index.php new file mode 100644 index 0000000..93da9a8 --- /dev/null +++ b/betterawstats/index.php @@ -0,0 +1,141 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/** + * File contents: + * + * This file is the central gateway for all other files. It includes all required + * files and handles in/output from GET /POST as well as preparation of default values + */ + +// var declaration +$BAW_LOGTYPE = 'W'; // fix to weblog only for now, no email / FTP +$BAW_CURR = array(); // holds all global values of the current session +$BAW_CURR['thismonth'] = array('hits'=> 0); +$BAW_CONF['max_percent'] = 'layout_percent'; +$BAW_CONF['max_bytes'] = 'layout_bytes'; +$BAW_D = array(); +$BAW_MES = array(); +$BAW_DFILES = array(); // data files +$tmp = null; // Temp variable for all kinds of things + +include_once('./config.php'); + +if ($BAW_CONF['debug']) { + error_reporting(E_ALL); + // ini_set('memory_limit','25M'); +} + +if (!defined ('XHTML')) { + if ($BAW_CONF['xhtml']) { + define('XHTML', ' /'); + } else { + define('XHTML', ''); + } +} +if (!defined ('BR')) { + define('BR', ''); +} +include_once('./core/helpers.inc.php'); +// define when the script was started +if (!defined ('START_TIME')) { + define('START_TIME', baw_mtime()); +} +if ($BAW_CONF['online_config'] && baw_is_writable($BAW_CONF['site_path'] . '/config.php')) { + include_once('./core/config.inc.php'); +} +// start time calculation and save the first one for reference + +include_once('./modules/render_htmlchart.inc.php'); +include_once('./modules/render_table.inc.php'); +include_once('./modules/render_jpgraph.inc.php'); +include_once('./modules/render_map.inc.php'); +include_once('./core/data.inc.php'); +include_once('./core/language.inc.php'); +baw_language(); // this has to be b/f library & b/f baw_match_files() +// find all the data, populate $BAW_DFILES +$BAW_SERVERS = array(); // this will be populates with the servers for the config +// editor. Since we need that in the config_default.inc.php, we need it even if online config is off + + +include_once('./core/display_helpers.php'); +baw_match_files(); // we read all files here so we have the array for config and normal + +if (!isset($BAW_MES['e'])) { + $BAW_MES['e'] = 'utf-8'; +} + +baw_check_config(); +include_once('./core/library.inc.php'); + +include_once('./core/display.inc.php'); +include_once('./core/config_default.inc.php'); +include_once('./core/extras.inc.php'); + + +// get input from forms +// it is questionable if this needs to be slashed or filtered since we dont write any data +if (isset($_GET['year'])) { + $BAW_CURR['year'] = $_GET['year']; +} else { + $BAW_CURR['year'] = date('Y'); +} +if (isset($_GET['month'])) { + $BAW_CURR['month'] = $_GET['month']; +} else { + $BAW_CURR['month'] = date('m'); +} +$BAW_CURR['day'] = date('d'); +$BAW_CURR['yearmonth'] = $BAW_CURR['year'] . $BAW_CURR['month']; +if (isset($_GET['site'])) { + $BAW_CURR['site_name'] = $_GET['site']; +} + + +// add language-dependent library values +$BAW_LIB['domains']['unknown'] = $BAW_MES[0]; +$BAW_LIB['domains']['ip'] = $BAW_MES[0]; +$BAW_LIB['os']['list']['Unknown'] = $BAW_MES[0]; +$BAW_LIB['browser']['names']['Unknown'] = $BAW_MES[0]; +$BAW_LIB['browser']['icons']['Unknown'] = 'unknown'; + +if (isset($_REQUEST['action'])) { // used by poll and config editor + $action = 'baw_action_' . $_REQUEST['action']; + $out = $action(); +} else if (@$BAW_CURR['site_name'] == 'all_months') { + $settings['section'] = "months"; + $out = baw_display_index($settings); +} else if (@$BAW_CURR['site_name'] == 'all_days') { + $settings['section'] = "days"; + $out = baw_display_index($settings); +} else { + $out = baw_display_index(); +} + +echo $out; +?> \ No newline at end of file diff --git a/betterawstats/language/index.html b/betterawstats/language/index.html new file mode 100644 index 0000000..e69de29 diff --git a/betterawstats/language/lang_de.inc.php b/betterawstats/language/lang_de.inc.php new file mode 100644 index 0000000..9018c4f --- /dev/null +++ b/betterawstats/language/lang_de.inc.php @@ -0,0 +1,390 @@ + 'Data File Update Stats:', + 'parsed_records' => 'Verarb. Einträge:', + 'old_records' => 'Alte Einträge:', + 'new_records' => 'Neue Einträge:', + 'corrupted' => 'Ungültig:', + 'dropped' => 'Übersprungen:', + 'ratio_pages_hits' => 'Ratio'.BR.'(Zugriffe/Seiten)', + 'files_paths' => 'Dateien/Verzeichnisse', + 'user_agent' => 'User Agent', + 'size' => 'Grösse', + 'by_domains' => '%s pro Domäne', + 'visits' => 'Besuche', + 'averages' => ' (Averages)', + 'assumedscript' => 'Vermutlich Roboter/Spider', + 'weekday_averages' => $BAW_MES[91] . ' (Durschn.)', + 'hours_averages' => $BAW_MES[20] . ' (Durschn.)', + 'os_versions' => "{$BAW_MES[59]} (+{$BAW_MES[58]})", + 'browser_versions' => "{$BAW_MES[21]} (+{$BAW_MES[58]})", + 'referer_hotlinks' => 'Hotlinks', + 'hl_by_domains ' => "Hotlinks pro Domäne", + 'hotlinks_proxies' => 'Hotlinks/Proxies', + + // baw_raise_error + 'baw_error' => 'BetterAWstats Fehler', + 'datafile' => + "Daten-Datei ist fehlerhaft, Daten konnten nicht gelesen werden: %s;
'%s' sollte BEGIN_... sein.".BR + . "Bitte lesen sie die FAQ (/docs/FAQ.txt)", + 'datafileindex' => + "Daten-Datei ist fehlerhaft, Daten-Index konnte nicht gelesen werden: %s;
'%s' sollte BEGIN_... sein.".BR + . "Bitte lesen sie die FAQ (/docs/FAQ.txt)", + 'datafilesdir' => + "Die Daten-Dateien konnten nicht gefunden werden: %s".BR + . "Bitte überprüfen Sie die config.php. Der Wert von \$BAW_CONF['path_data'] muss " + . "auf das Verzeichnis der AWStats-Daten zeigen, " + . "typischerweise /cgi-bin/awstats/data. Bitte stellen Sie auch sicher " + . "dass PHP diesen Ordner lesen kann.", + 'languagefile' => + "Die Sprach-Dateien konnten nicht gefunden werden: %s".BR + . "Bitte überprüfen Sie die config.php. Der Wert von \$BAW_CONF['path_lang'] muss " + . "auf das Verzeichnis der AWStats-Sprach-Dateien zeigen, " + . "typischerweise /cgi-bin/awstats/lang. Bitte stellen Sie auch sicher " + . "dass PHP diesen Ordner lesen kann.", + 'libraryfiles' => + "Die Library-Dateien konnten nicht gefunden werden: %s".BR + . "Bitte überprüfen Sie die config.php. Der Wert von \$BAW_CONF['path_lib'] muss " + . "auf das Verzeichnis der AWStats-Library-Dateien zeigen, " + . "typischerweise /cgi-bin/awstats/lib. Bitte stellen Sie auch sicher " + . "dass PHP diesen Ordner lesen kann.", + 'configwrite' => + "Die Konfigurations-Datei ist nicht überschreibbar. Bitte stellen Sie sicher," + . "dass PHP diese Datei überscreiben kann oder bearbeiten Sie diese Datei mit" + . "einem geeigneten Editor anstelle das Online-Formular zu verwenden.", + 'configread' => + "Die Konfigurations-datei konnte nicht zum lesen geöffnet werden.", + 'configdisabled' => + "Das Online-Konfigurations-Formular wurde blockiert. Um es zu verwenden, " + ."setzen Sie bitte \$BAW_CONF['online_config'] = true in der config.php", + 'libraryeval' => + "Es gab einen Fehler beim Lesen der awstats library datei %s um die Variable" + . "%s zu erhalten. Bitte verwenden Sie den Debug-Modus und wenden Sie sich an " + . "den Support.", + 'jpgraph_path' => + "Die JPGraph-Dateien konnten nicht unter %s gefunden werden. Bitte schalten" + . "Sie entweder JPGraph ab oder installieren Sie die Dateien richtig.", + 'gd2notavailable' => + "Die PHP GD2-Graphik-Bibliothek konnte nicht gefunden werden. Bitte installieren Sie diese." + . "oder schalten Sie die Karten-funktion ab. Weitere info zu GD2 unter http://php.net/manual/en/ref.image.php", + 'mapnotavailable' => + "Die Graphik zur erstellung der Karte (%s) konnte nicht gefunden werden. " + . "Bitte stellen Sie sicher dass sie BetterAWStats richtig installiert haben" + . "und dass alle Dateien von PHP lesbar sind.", + 'iconpath' => + "The AWSTATS icons could not be found in this location: %s".BR + . "Please check your config.php. The value of \$BAW_CONF['icons_url'] has " + . "to point to the URL where awstats stores its library files " + . "(typically somewhere http://awstats.local/awstats/icon).", + 'site_path' => + "The path to awstats is set incorrectly to the folder: %s".BR + . "Please check your config.php. The value of \$BAW_CONF['site_path'] has " + . "to point to the directory where BetterAWStats is installed" + . "(typically somewhere /home/user/public_html/baw).".BR + . "It seems your script is installed under '%s'.", + 'site_url' => + 'The URL to BetterAWStats is set incorretly in your config.php. It is currently ' + . 'set to %s, but it this is incorrect. It seems the URL could be %s instead.', + 'password_match' => + 'The passwords you have entered do not match. Please go back and try again.', + 'password_change' => + 'You are trying to use the default password. Please go back change to a ' + . 'different password', + 'password_short' => + 'Your password has to have a minimum of 6 characters. Please go back and' + . 'choose a longer password.', + 'xmldata' => + 'Your AWStats data files are stored in XML format. Unfortunately, BetterAWSTats ' + . 'does not support XML data yet. Please store your datafiles in plain text.', + + // $BAW_LIB['item_groups'] + 'time' => 'Zeit', + 'user_information' => 'Besucher-Information', + 'user_actions' => 'Besucher-Handlungen', + 'user_origin' => 'Besucher-Herkunft', + 'other_access' => 'Andere Zugriffe', + + // debug messages + 'dbg_detect_language' => "Versuche Sprache zu erkennen.", + 'dbg_detected_language' => "Erkannte Sprache: %s", + 'dbg_test_writable' => "überprüfe ob %s schreibbar ist.", + 'dbg_test_writable_false' => "NICHT schreibbar: %s", + 'dbg_test_writable_true' => 'IST schreibbar: %s', + 'dbg_found_dir' => 'Verzichnis gefunden: %s', + 'dbg_found_file' => 'Datei gefunden: %s', + 'dbg_finished_parse_dir' => "Verzeichnis lesen beendet: %s", + 'dbg_start_parse_dir' => "Verszeichnis lesen startet: %s", + + // config_default.inc.php + 'cfg_enable' => 'Einschalten', + 'cfg_disable' => 'Ausschalten', + 'cfg_show_all' => 'Alle zeigen', + 'monday' => 'Montag', + 'sunday' => 'Sonntag', + 'cfg_hide' => 'Verstecken', + 'cfg_show' => 'Zeigen', + 'cfg_site_settings' => 'Site Einstellungen', + 'cfg_path_to_aws_data' => 'Pfad zu AWStats Daten', + 'cfg_path_to_aws_data_hlp' => "Dieser Pfad muss auf die von AWSTATS " + . "generierten Daten zeigen. ACHTUNG: Wenn diese Daten von einem Windows-" + . "System auf ein Linux-System übertragen werden (oder umgekehrt), ist es " + . "wichtig, diese als BINÄR-Daten zu übertragen. Ansonsten können sie nicht " + . "gelesen werden. Kein '/' am Ende.", + 'cfg_path_to_aws_lib' => 'Pfad zu den AWStats Libraries', + 'cfg_path_to_aws_lib_hlp' => "Dieser Pfad muss auf den Ordner zeigen, in dem " + . "AWSTATS die Library-Dateien speichert. Kein '/' am Ende.", + 'cfg_path_to_aws_lang' => 'Pfad zu den AWStats Sprachdateien', + 'cfg_path_to_aws_lang_hlp' => "Dieser Pfad muss auf den Ordner zeigen, in dem " + . "AWSTATS die Sprachdateien speichert. Kein '/' am Ende.", + 'cfg_script_url' => 'Programm-URL', + 'cfg_script_url_hlp' => "Die URL zu BetterAWStats. Kein '/' am Ende.", + 'cfg_script_path' => 'Programm-Pfad', + 'cfg_script_path_hlp' => "Der Pfad zu BetterAWstats. Kein '/' am Ende.", + 'cfg_aws_icons_url' => 'AWStats Icons URL', + 'cfg_aws_icons_url_hlp' => 'Die URL zu den AWStats Icons. Inclusive http://... ' + . "Kein '/' am Ende.", + 'cfg_web_config' => 'Web Konfiguration', + 'cfg_web_config_hlp' => 'Wollen Sie das Web-Frontend zur Konfiguration verwenden? ' + . 'ACHTUNG: hierfür muss die config.php beschreibbar sein. Dies ist generell ' + . 'ein SICHERHEITSRISIKO wenn die BetterAWStats-installation nicht ' + . 'durch ein .htaccess-file o.ä. passwortgeschützt ist.', + 'cfg_web_config_pw' => 'Ändere Konfigurations-Password?', + 'cfg_web_config_pw_hlp' => 'Dieses Passwort wid gebraucht um die online-' + . 'Konfiguration zu benutzen. Es muss länger als 5 Buchstaben sein.', + 'cfg_limit_server' => 'Nur einen Server verwenden?', + 'cfg_limit_server_hlp' => 'Setzen Sie dieses gleich einem Servernamen oder ' + . '"false" um alle zu zeigen. Der Servername sollte der gleiche sein wie in AWStats.', + 'cfg_layout_settings' => 'Layout Einstellungen', + 'cfg_layout_type' => 'Layout Typ', + 'cfg_layout_type_hlp' => 'Sollen die einzelnen Statistiken horizontal oder vertikal angeordnet werden?', + 'cfg_vertical' => 'Vertikal', + 'cfg_horizontal' => 'Horizontal', + 'cfg_language' => 'Sprache', + 'cfg_language_hlp' => "Gewünschte Interface-sprache auswählen. 'Auto' für automatisches erkennen.", + 'cfg_firstweekday' => 'Erster Tag der Woche', + 'cfg_firstweekday_hlp' => 'Sollte Montag oder Sonntag als erster Tag der Woche angezeigt werden?', + 'cfg_decimalpoint' => 'Dezimal-Trennzeichen', + 'cfg_decimalpoint_hlp' => "Welches Zeichen soll als Dezimal-zeichen verwendet werden (99.9)?", + 'cfg_thous_sep' => 'Tausender-Trennzeichen', + 'cfg_thous_sep_hlp' => "Welches Zeichen soll als Tausender-Trennzeichen verwendet werden (1'0000)?", + 'cfg_date_form' => 'Datums-Format (2007-31-12)', + 'cfg_date_form_hlp' => 'Wie soll das Datum aussehen? Für Hilfe bitte unter ' + . 'http://php.net/manual/de/function.date.php nachsehen.', + 'cfg_date_time_form' => 'Datums & Zeit Format (2007-31-12 23:59)', + 'cfg_date_time_form_hlp' => 'Wie soll Datum mit Zeit dargestellt werden? Für Hilfe bitte unter ' + . 'http://php.net/manual/de/function.date.php nachsehen.', + 'cfg_percent_dec' => 'Prozent-Dezimalstellen', + 'cfg_percent_dec_hlp' => "Wieviele dezimalstellen sollen Prozentwerte haben? (99.9%)", + 'cfg_field_length' => 'Link-länge', + 'cfg_field_length_hlp' => 'Wieviele Zeichen soll ein Tabllenfeld maximal lang sein?' + . "(Betrifft nur Links)", + 'cfg_max_lines' => 'Max. Anzahl von Zeilen einer Tabelle', + 'cfg_max_lines_hlp' => 'Wievele Zeilen darf eine Tabelle max. lang sein? ' + . 'Auf "false" setzen um ohne limit zu arbeiten. Wenn die max. Anzahl erreicht ist, ' + . 'wird der rest der tabelle in einer Zeile zusammengefasst. Das gilt auch fuer die' + . '"Gesamte Liste"-Ansicht einer Tabelle.', + 'cfg_hide_empty' => 'Verstecke leere Statistiken', + 'cfg_hide_empty_hlp' => 'Sollen Statistiken mit Null Zeilen versteckt werden? ' + . '(Inklusive des Menu-Eintrags)', + 'cfg_auto_submit_form' => 'Dropdowns nach Änderung ausführen', + 'cfg_auto_submit_form_hlp' => 'Wenn aktiviert haben die Site/datums-dropdowns ' + . 'keinen "OK"-Button. Die Seite wird neu angezeigt sobald sie einen neuen ' + . 'Wert auswählen. Nicht empfohlen für grosse Sites.', + 'cfg_chart_settings' => 'Chart Einstellungen', + 'cfg_max_scale_visitors' => 'Massstab Besucher', + 'cfg_max_scale_visitors_hlp' => 'Der höchste wert des gewählten Datentyps ' + . 'bestimmt den Massstab für die Besucher-Balken im Chart. ', + 'cfg_max_scale_visits' => 'Massstab Besuche', + 'cfg_max_scale_visits_hlp' => 'Der höchste wert des gewählten Datentyps ' + . 'bestimmt den Massstab für die Besuche-Balken im Chart. ', + 'cfg_max_scale_pages' => 'Massstab Seiten', + 'cfg_max_scale_pages_hlp' => 'Der höchste wert des gewählten Datentyps ' + . 'bestimmt den Massstab für die Seiten-Balken im Chart. ', + 'cfg_max_scale_hits' => 'Massstab Zugriffe', + 'cfg_max_scale_hits_hlp' => 'Der höchste wert des gewählten Datentyps ' + . 'bestimmt den Massstab für die Zugriffs-Balken im Chart. ', + 'cfg_max_chart_items' => 'Max Anz. Chart-Reihen', + 'cfg_max_chart_items_hlp' => 'Wenn Charts mit kompletten Listen angezeigt werden, ' + . 'wieviele Reihen sollen angezeigt sein? Der Rest wird in "'.$BAW_MES[2].'" summiert. ' + . 'Dies hilft, überbreite Charts zu vermeiden.', + 'cfg_chart_titles' => 'Chart Titel?', + 'cfg_chart_titles_hlp' => 'Sollen Titel über den Charts angzeigt werden?', + 'cfg_jpgraph_settings' => 'JPGraph Einstellungen', + 'cfg_jpgraph_enable' => 'JPgraph verwenden?', + 'cfg_jpgraph_enable_hlp' => 'Um JPGraph zu verwenden, muss es von' + . 'http://www.aditus.nu/jpgraph/jpdownload.php heruntergeladne werden', + 'cfg_jpgraph_path' => 'Pfad zu JPGraph', + 'cfg_jpgraph_path_hlp' => 'Wo ist JPGraph installiert? (Der Ordner ' + . "in dem sich jpgraph.php befindet. Kein '/' am Ende.", + 'cfg_table_settings' => 'Tabellen Einstellungen', + 'cfg_advanced_settings' => 'Fortgeschrittene Einstellungen', + 'cfg_version' => 'Version', + 'cfg_version_hlp' => 'Version des Programms', + 'cfg_xhtml' => 'XHTML/ HTML', + 'cfg_xhtml_hlp' => 'Soll HTML oder XHTML angezeigt werden?', + 'cfg_debug' => 'Problemsuche', + 'cfg_debug_hlp' => 'Sollen Status-meldungen zur Fehlersuche engezeigt werden (SEHR detailiert)?', + 'cfg_parser' => 'Daten-Verarbeitungs-Statistiken', + 'cfg_parser_hlp' => 'Wollen Sie eine Zusammenfassung der Logfile-auswertung anzeigen?', + 'cfg_module' => 'Modul-Einstellungen', + 'cfg_module_hlp' => 'Wird BetterAWStats als Modul innerhalb einer anderen Anwendung verwendet? ' + . '(Derzeit nur Drupal)', + 'cfg_type_order' => 'Sortierung', + 'cfg_type_show' => 'Daten anzeigen?', + 'cfg_type_collapse' => 'Minimiert?', + 'cfg_type_table' => 'Tabelle anzeigen?', + 'cfg_type_sort' => 'Sortieren nach...?', + 'cfg_possible_values'=> ' Mögliche Werte sind:', + 'cfg_type_sort_dir' => 'Sortier-richtung?', + 'cfg_type_sort_dir_opts' => 'SORT_ASC=Aufsteigend, SORT_DESC=Absteigend', + 'cfg_type_chart' => 'HTML Chart anzeigen?', + 'cfg_type_map' => 'Landkarte anzeigen?', + 'cfg_type_avg' => 'Durchnitt anzeigen?', + 'cfg_type_total' => 'Summe anzeigen?', + 'cfg_type_top_x' => 'Anzahl Zeilen?', + 'cfg_type_assumebot' => 'Verstecke Besucher wenn Zugriffe = Seiten?', + 'cfg_type_showmonths' => 'Wieviele Monate?', + 'cfg_type_favicon' => 'Favicons für externe URLs anzeigen?', + 'cfg_type_domain_lvls' => 'URLs auf wieviele Domain level kürzen? (-1 = nicht kürzen)', + 'cfg_dis_overview' => 'Übersicht Daten und Zahlen', + 'cfg_dis_months' => 'Monatsdaten', + 'cfg_dis_days' => 'Tagesdaten', + 'cfg_dis_weekdays' => 'Wochentage', + 'cfg_dis_hours' => 'Stunden', + 'cfg_dis_domains' => 'Besucher-Domains', + 'cfg_dis_visitors' => 'Besucher IP-Addressen', + 'cfg_dis_logins' => 'Login-Usernamen', + 'cfg_dis_robots' => 'Suchmaschinen, Spiders, Robots etc.', + 'cfg_dis_worms' => 'Würmer', + 'cfg_dis_sessions' => 'Wie lange waren besucher auf der Seite', + 'cfg_dis_filetype' => 'Auf welche Datei-Typen wurde zugegriffen', + 'cfg_dis_urls' => 'Seiten auf dem Server', + 'cfg_dis_paths_hlp' => 'Daten/Pfade auf dem Server', + 'cfg_dis_paths' => 'Daten/Pfade', + 'cfg_dis_os' => 'Betriebssysteme der Benutzer', + 'cfg_dis_unknownos' => 'Unbekannte Betriebssysteme', + 'cfg_dis_osversions' => 'Betriebssystem inkl. Versionen', + 'cfg_dis_browsers' => 'Browser-Typen', + 'cfg_dis_browserversions' => "Browser-Typen (+{$BAW_MES[58]})", + 'cfg_dis_unknownbrowser' => 'Unbekannte Browser', + 'cfg_dis_unknownbrowser_agent' => 'User Agent', + 'cfg_dis_screensizes' => 'Bildschirmgrössen', + 'cfg_dis_se_referers' => 'Eingehende Links von Suchergebnissen', + 'cfg_dis_referers' => 'Eingehende Links von anderen Seiten', + 'cfg_dis_referer_domains' => 'Eingehende Links, nach zweit-Level Domain sortiert', + 'cfg_dis_hotlinks' => 'Externe Seiten, welche direkt auf Bilder/Daten linken', + 'cfg_dis_hotlink_domains' => 'Domains externer Seiten, welche direkt auf Bilder/Daten linken', + 'cfg_dis_searchphrases' => 'Suchausdrücke', + 'cfg_dis_searchwords' => 'Suchwörter', + 'cfg_dis_misc' => 'Details der Besucher-Systeme', + 'cfg_dis_errors' => 'Fehler-Meldungen von aufgerufenen Seiten', + + // display_helpers + 'config_not_writable' => 'Konfigurationsfile ist nicht schreibbar!', + 'config_editor' => 'Konfigurations-Interface', + 'created_by' => 'erstellt von %s', + 'config_intro' => "// ACHTUNG:\r\n// BetterAWstats hat ein online Konfigurations-Interface " + . "mit dem Sie die einstellungen mit dem Browser ändern können. Der " + . "Link dazu befindet sich unten im Menu! Um diesen zu verwenden, muss " + . "\$BAW_CONF['online_config']= true; gestellt werden, und diese Datei " + . "muss für den Server beschreibbar sein.", + 'cfg_name' => 'NAME: ', + 'cfg_info' => 'INFO: ', + 'cfg_def' => 'STANDART:', + 'cfg_display' => 'ANZEIGE', + 'cfg_display2' => 'Statistik Anzeige', + 'cfg_logout' => 'Ausloggen', + 'confirm_password' => 'Password bestätigen: ', + 'cfg_saved' => "Die Konfiguration wurde gespeichert. Weiter zu den " + . "Statistiken oder zurück zum " + . "" + . "Konfigurations-Interface.", + 'cfg_save' => 'Alles Speichern', + 'cfg_reset' => 'Zurücksetzen', + 'cfg_exit' => 'Ende', + 'cfg_asc'=> 'Ausfteigend', + 'cfg_desc' => 'Absteigend', + 'show' => 'Anzeigen', + 'hide' => 'Verstecken', + 'all_months' => 'Alle (Monatlich)', + 'all_days' => 'Alle (Täglich)', + 'get_help' => 'Hilfe', + 'back' => 'Zurück', + 'version_check' => 'Suche nach Updates', + 'version_info' => 'Versions-Daten', + 'unknown_list' => 'Unbekannte Daten', + + // config.inc.php + 'require_password' => 'Please enter the password and press OK.', + 'password_incorrect' => 'The password is incorrect. Please try again', + + // reder_table + 'table_max_hits_exceed' => '(Über dem max_hits config Limit von %s)', + 'records'=> '%s records', // new + + // section help + 'hlp_overview' => 'Dieser Abschnitt zeigt generelle Daten des aktuell ausgewählten ' + . 'Monats. Diese Daten schliessen leider nicht exakt alle zugriffe durch ' + . 'Hotlinks, Roboter und Hacker-scripts etc. aus. Wenn man ' + . "\$BAW_CONF['show_parser_stats'] == true setzt, sieht man hier zusätzliche " + . 'Daten zum logfile Update wie zum Beispiel Parsed records, Old records, New records, ' + . 'Corrupted und Dropped lines.', + 'hlp_months' => 'Dieser Abschnitt zeigt die Monatlichen Daten. Wie weit diese ' + . 'für vergangene Monate angezeigt werden, lässt sich in der Konfiguration einstellen.', + 'hlp_days' => 'Dieser Abschnitt zeigt die täglichen Daten des aktuell ausgewählten Monats. ' + . 'Wenn der gewählte Monat noch nicht zu Ende ist, sieht man hier die Daten des letzten Monats, ' + . 'für die gleiche Anzahl von Tagen wie in diesem Monat noch Daten fehlen.', + 'hlp_weekdays' => 'Dieser Abschnitt zeigt Durschnittswerte für jeden Wochentag. ' + .'Da jeder Monat eine andere Anzahl jedes Wochentags hat, erzeugt eine einfache Summe dieser ' + . 'Daten, so wie es AWStats darstellt, eine Verzerrung der Daten. Darum stellt ' + . 'BetterAWStats die Durschnitte dar.', + 'hlp_hours' => 'Dieser Abschnitt zeigt die Durschnittswerte für jede Stunde des Tages. ' + .'Wenn der aktuell gewählte Monat noch nicht zu Ende ist, verzerrt eine Summe der Zugriffe ' + . 'So wie es von AWStats dargestellt wird, die Daten. Darum zeigt BetterAWStats die ' + . 'Durschnitte.', + 'hlp_domains' => 'Dieser Abschnitt zeigt die Zugriffe pro Land (sofern bekannt). ' + . 'Die Landkarte summiert die Domains mil, edu, gov and arpa zur "us"-Domain dazu.', + 'hlp_visitors' => 'Dieser Abschnitt zeigt die Daten pro User-IP Addresse. ' + . 'Da praktisch alle Webseiten aus mehreren Dateien bestehen (Bilder, CSS-file etc), ' + . 'sind zugriffe mit einem sehr tiefen "Zugriff pro Seiten"-Verhältnis höchstwahrscheinlich' + . 'von Robotern, Scripten oder anderen Programmen aber nicht von normalen Benutzern ' + . 'erzeugt. Diese Zugriffe sind hier unter "Vermuteten Scripts & Bots zusammengefasst. ' + . 'Um das Verhältnis "Zugriff pro Seiten" welches eine Script definiert zu ändern, ' + . 'justieret man den Wert von $BAW_CONF_DIS[\'visitors\'][\'assumebot\'] in der Konfiguration.' + . 'Ähnlich sind Zugriffe ohne Seitenaufrufe von Proxies or ' + . 'Hotlinks. Diese sind unter "Hotlinks/Proxies" summiert.' , + 'hlp_logins' => 'Dieser Abschnitt zeigt die Passwort-geschützten zugriffe pro Username. Ein Username' + . 'mit nur einem Zugriff stellt höchstwahrscheinlich einen Zugriffsversuch ohne Passwort dar.', + 'hlp_referer_domains' => 'This section takes the data from "Referring sites" ' + . 'and sums it up by domain. AWStats does not show this information. ' + . 'If a referer has a link to your site on each of its ' + . 'pages, the overall number of referred visitors might be high, but the ' + . 'referrer might still not show up in the top 10 of the "Refering Sites". ' + . 'This is why BetterAWStats shows the domain sum so you can judge the true ' + . 'value of a refering site.', + 'hlp_hotlinks' => 'This section shows the referrers from other sites where files ' + . 'such as graphics where requested but no pages. This indicates that the ' + . 'referring site is hotlinking to your site (using your bandwidth, storage ' + . 'and image) while giving its own users the impression the data was hosted ' + . 'at the referring site. This data is separated from the "Referring sites" ' + . 'Statistics by BetterAWStats. AWStats does not make this difference.', + 'hlp_hotlink_domains' => 'This section shows the referrers from other sites where files ' + . 'such as graphics where requested but no pages. This indicates that the ' + . 'referring site is hotlinking to your site (using your bandwidth, storage ' + . 'and image) while giving its own users the impression the data was hosted ' + . 'at the referring site. This data is separated from the "Referring sites" ' + . 'Statistics by BetterAWStats. AWStats does not make this difference. ' + . 'In addition, BetterAWStats sums in this section the data by domain to make the hits by ' + . 'domain more visible since one domain might hotlink the same data from ' + . 'multiple URLs.', +); + +?> \ No newline at end of file diff --git a/betterawstats/language/lang_en.inc.php b/betterawstats/language/lang_en.inc.php new file mode 100644 index 0000000..64e5a27 --- /dev/null +++ b/betterawstats/language/lang_en.inc.php @@ -0,0 +1,390 @@ + 'Data File Update Stats:', + 'parsed_records' => 'Parsed records:', + 'old_records' => 'Old records:', + 'new_records' => 'New records:', + 'corrupted' => 'Corrupted:', + 'dropped' => 'Dropped:', + 'ratio_pages_hits' => 'Ratio'.BR.'(Hits/Pages)', + 'files_paths' => 'Files/paths', + 'user_agent' => 'User Agent', + 'size' => 'Size', + 'by_domains' => '%s by Domains', + 'visits' => 'Visits', + 'averages' => ' (Averages)', + 'assumedscript' => 'Assumed Robots/Spiders', + 'weekday_averages' => $BAW_MES[91] . ' (Averages)', + 'hours_averages' => $BAW_MES[20] . ' (Averages)', + 'os_versions' => "{$BAW_MES[59]} (+{$BAW_MES[58]})", + 'browser_versions' => "{$BAW_MES[21]} (+{$BAW_MES[58]})", + 'referer_hotlinks' => 'Hotlinks', + 'hl_by_domains ' => "Hotlinks by Domains", + 'hotlinks_proxies' => 'Hotlinks/Proxies', + + // baw_raise_error + 'baw_error' => 'BetterAWstats Error', + 'datafile' => + "Datafile is corrupt, data could not be read: %s;".BR."'%s' should be BEGIN_...".BR + . "Please read the FAQ (/doc/FAQ.txt)", + 'datafileindex' => + "Datafile is corrupt, data-index could not be read: %s;".BR."'%s' should be BEGIN_...".BR + . "Please read the FAQ (/doc/FAQ.txt)", + 'datafilesdir' => + "The Data files could not be found in this location: %s".BR + . "Please check your config.php. The value of \$BAW_CONF['path_data'] has " + . "to point to the directory where awstats stores its data files " + . "(typically somewhere /cgi-bin/awstats/data). Please also make sure " + . "that php has read-permissions on that folder.", + 'languagefile' => + "The language file could not be found in this location: %s".BR + . "Please check your config.php. The value of \$BAW_CONF['path_lang'] has " + . "to point to the directory where awstats stores its language files " + . "(typically somewhere /cgi-bin/awstats/lang). Please also make sure " + . "that php has read-permissions on that folder.", + 'libraryfiles' => + "The library files could not be found in this location: %s".BR + . "Please check your config.php. The value of \$BAW_CONF['path_lib'] has " + . "to point to the directory where awstats stores its library files " + . "(typically somewhere /cgi-bin/awstats/lib). Please also make sure " + . "that php has read-permissions on that folder.", + 'configwrite' => + "The configuration file is not writable. Please make sure that the script " + . "can write to the file or simply edit the file directly on the server " + . "instead of using the configuration Editor.", + 'configread' => + "The config file could not be opened for read/write access", + 'configdisabled' => + "The online configurator has been disabled. Please set " + . "\$BAW_CONF['online_config'] = true in your config.php", + 'libraryeval' => + "There was an error parsing the awstats library file %s that is used to " + . "parse the variable %s. Please switch on debugging in config.php and " + . "post the PHP errors displayed to the support forum so the problem can be fixed.", + 'jpgraph_path' => + "The files for jpgraph could not be found at %s. Either disable the feature in " + . "config.php or correct the path to the files.", + 'gd2notavailable' => + "The PHP graphics library GD2 is not available. Please disable the map function or install GD2." + . "You can get more info at http://php.net/manual/en/ref.image.php", + 'mapnotavailable' => + "The graphics to create the Map (%s) is not available. Please make sure that " + . "you have all the files from the setup and that they are readable by " + . "the server.", + 'iconpath' => + "The AWSTATS icons could not be found in this location: %s".BR + . "Please check your config.php. The value of \$BAW_CONF['icons_url'] has " + . "to point to the URL where awstats stores its library files " + . "(typically somewhere http://awstats.local/awstats/icon).", + 'site_path' => + "The path to awstats is set incorrectly to the folder: %s".BR + . "Please check your config.php. The value of \$BAW_CONF['site_path'] has " + . "to point to the directory where BetterAWStats is installed" + . "(typically somewhere /home/user/public_html/baw).".BR + . "It seems your script is installed under '%s'.", + 'site_url' => + 'The URL to BetterAWStats is set incorretly in your config.php. It is currently ' + . 'set to %s, but it this is incorrect. It seems the URL could be %s instead.', + 'password_match' => + 'The passwords you have entered do not match. Please go back and try again.', + 'password_change' => + 'You are trying to use the default password. Please go back change to a ' + . 'different password', + 'password_short' => + 'Your password has to have a minimum of 6 characters. Please go back and' + . 'choose a longer password.', + 'xmldata' => + 'Your AWStats data files are stored in XML format. Unfortunately, BetterAWSTats ' + . 'does not support XML data yet. Please store your datafiles in plain text.', + + // $BAW_LIB['item_groups'] + 'time' => 'Time', + 'user_information' => 'User Information', + 'user_actions' => 'User Actions', + 'user_origin' => 'User Origin', + 'other_access' => 'Other Access', + + // debug messages + 'dbg_detect_language' => "trying to detect language", + 'dbg_detected_language' => "Detected language %s", + 'dbg_test_writable' => "Checking if %s is writable", + 'dbg_test_writable_false' => "IS NOT writable: %s", + 'dbg_test_writable_true' => 'IS writable: %s', + 'dbg_found_dir' => 'found directory %s', + 'dbg_found_file' => 'Found File: %s', + 'dbg_finished_parse_dir' => "Finished parsing Directory %s", + 'dbg_start_parse_dir' => "Start parsing Directory %s", + + // config_default.inc.php + 'cfg_enable' => 'Enable', + 'cfg_disable' => 'Disable', + 'cfg_show_all' => 'Show all', + 'monday' => 'Monday', + 'sunday' => 'Sunday', + 'cfg_hide' => 'Hide', + 'cfg_show' => 'Show', + 'cfg_site_settings' => 'Site Settings', + 'cfg_path_to_aws_data' => 'Path to AWStats Data', + 'cfg_path_to_aws_data_hlp' => "Set this value to the directory where AWStats " + . "saves its database files into. ATTENTION: If you read those files on " + . "windows but have them created on linux or the other way round, make " + . "sure you transfer them 'BINARY'. Otherwise they cannot be read properly. " + . "No trailing slash", + 'cfg_path_to_aws_lib' => 'Path to AWStats Libraries', + 'cfg_path_to_aws_lib_hlp' => "Set this value to the directory where AWStats " + . "saves its library files into. No trailing slash", + 'cfg_path_to_aws_lang' => 'Path to AWStats Language files', + 'cfg_path_to_aws_lang_hlp' => 'Set this value to the directory where AWStats ' + . 'saves its language files into. No trailing slash', + 'cfg_script_url' => 'Script URL', + 'cfg_script_url_hlp' => "The url of BetterAWstats' directory, No trailing slash", + 'cfg_script_path' => 'Script path', + 'cfg_script_path_hlp' => 'The path of BetterAWstats, No trailing slash', + 'cfg_aws_icons_url' => 'URL to AWStats Icons', + 'cfg_aws_icons_url_hlp' => 'The url to the awstats icons, should include the ' + . 'whole http://..., no trailing slash.', + 'cfg_web_config' => 'Web Configuration', + 'cfg_web_config_hlp' => 'Enable the online configuration editor? WARNING: ' + . 'Your config.php has to be writable in order to enable this. This is ' + . 'a BAD idea to use unless the folder is password-protected with a ' + . '.htaccess file or similar.', + 'cfg_web_config_pw' => 'Change configuration password?', + 'cfg_web_config_pw_hlp' => 'This password is needed to access the online ' + . 'configuration. It has to be longer than 5 letters.', + 'cfg_limit_server' => 'Limit to server?', + 'cfg_limit_server_hlp' => 'Set this to a simgle server that you want to limit ' + . 'or "false" to show all. The server name should be the one used for awstats.', + 'cfg_layout_settings' => 'Layout Settings', + 'cfg_layout_type' => 'Layout Type', + 'cfg_layout_type_hlp' => 'Display page in vertical or horizontal layout?', + 'cfg_vertical' => 'Vertical', + 'cfg_horizontal' => 'Horizontal', + 'cfg_language' => 'Language', + 'cfg_language_hlp' => 'Set your language. Set to "auto" to autodetect from browser', + 'cfg_firstweekday' => 'First day of the week', + 'cfg_firstweekday_hlp' => 'Should Sunday be the first day of the week or monday?', + 'cfg_decimalpoint' => 'Decimal Point', + 'cfg_decimalpoint_hlp' => "Decimal Point Character (99.9)", + 'cfg_thous_sep' => 'Thousands separator', + 'cfg_thous_sep_hlp' => "Thousand Digit separator (1'000)", + 'cfg_date_form' => 'Date format (2007-31-12)', + 'cfg_date_form_hlp' => 'How should a date look like? For formatting, please ' + . 'consult http://php.net/manual/en/function.date.php', + 'cfg_date_time_form' => 'Date & Time format (2007-31-12 23:59)', + 'cfg_date_time_form_hlp' => 'How should a date & time look like? For formatting,' + . 'please consult http://php.net/manual/en/function.date.php', + 'cfg_percent_dec' => 'Percentage decimals', + 'cfg_percent_dec_hlp' => "How many decimals for percentage value? (99.9%)", + 'cfg_field_length' => 'Field Length', + 'cfg_field_length_hlp' => 'What is the max. text length of table fields? ' + . "(Applies only to links)", + 'cfg_max_lines' => 'Max. Table Lines', + 'cfg_max_lines_hlp' => 'What is the max. no. of lines a table can have? ' + . 'Set to "false" to disable. If a table reaches this number of lines, ' + . 'The rest is summarized into one line. This also applies to the "full list" ' + . 'view of a table', + 'cfg_hide_empty' => 'Hide Empty data', + 'cfg_hide_empty_hlp' => 'Completely hide graphs with zero entries? ' + . '(The menu will also be hidden)', + 'cfg_auto_submit_form' => 'Submit dropdowns on change', + 'cfg_auto_submit_form_hlp' => 'If enabled, the site/date dropdowns do ' + . 'not have an "OK"-button. The page is refreshed as soon as you choose ' + . 'a new value. Not recommended for large sites.', + 'cfg_chart_settings' => 'Chart Settings', + 'cfg_max_scale_visitors' => 'Max scale for Visitors', + 'cfg_max_scale_visitors_hlp' => 'The maximum value of the chosen option will ' + . 'define the maximum height of the Visitors bars in the chart', + 'cfg_max_scale_visits' => 'Max scale for Visits', + 'cfg_max_scale_visits_hlp' => 'The maximum value of the chosen option will ' + . 'define the maximum height of the Visits bars in the chart', + 'cfg_max_scale_pages' => 'Max scale for Pages', + 'cfg_max_scale_pages_hlp' => 'The maximum value of the chosen option will ' + . 'define the maximum height of the Pages bars in the chart', + 'cfg_max_scale_hits' => 'Max scale for Hits', + 'cfg_max_scale_hits_hlp' => 'The maximum value of the chosen option will ' + . 'define the maximum height of the Hits bars in the chart', + 'cfg_max_chart_items' => 'Max no of chart rows', + 'cfg_max_chart_items_hlp' => 'When displaying the charts with the full lists, ' + . 'How many items can there be displayed? The rest will sum up into "'.$BAW_MES[2].'". ' + . 'This is done to prevent too wide charts', + 'cfg_chart_titles' => 'Chart Titles?', + 'cfg_chart_titles_hlp' => 'If enabled, it will show a title on top of each chart.', + 'cfg_jpgraph_settings' => 'JPGraph Settings', + 'cfg_jpgraph_enable' => 'Enable JPgraph?', + 'cfg_jpgraph_enable_hlp' => 'To use JPGraph, you have to download it from ' + . 'http://www.aditus.nu/jpgraph/jpdownload.php.', + 'cfg_jpgraph_path' => 'Path to JPGraph', + 'cfg_jpgraph_path_hlp' => 'Where is your JPGraph installation? (The folder ' + . 'where jpgraph.php is in. No trailing slash)', + 'cfg_table_settings' => 'Table Settings', + 'cfg_advanced_settings' => 'Advanced Settings', + 'cfg_version' => 'Version', + 'cfg_version_hlp' => 'Version of this software', + 'cfg_xhtml' => 'XHTML/ HTML', + 'cfg_xhtml_hlp' => 'Do you want output in HTML or XHTML?', + 'cfg_debug' => 'Debug', + 'cfg_debug_hlp' => 'Do you want to show debug-output (VERY detailed)?', + 'cfg_parser' => 'Parser Stats', + 'cfg_parser_hlp' => 'Do you want to show log file parsing data below the stats summary?', + 'cfg_module' => 'Module settings', + 'cfg_module_hlp' => 'Are you using BetterAWstats as a module for another ' + . 'software? (Currently only Drupal is supported)', + 'cfg_type_order' => 'Item Sequence', + 'cfg_type_show' => 'Show this Data?', + 'cfg_type_collapse' => 'Collapsed?', + 'cfg_type_table' => 'Show data table?', + 'cfg_type_sort' => 'Sort for which column? ', + 'cfg_possible_values'=> ' Possible values are:', + 'cfg_type_sort_dir' => "Sort direction?", + 'cfg_type_sort_dir_opts' => 'SORT_ASC=Ascending, SORT_DESC=Descending', + 'cfg_type_chart' => 'Show HTML chart?', + 'cfg_type_map' => 'Show Map Image?', + 'cfg_type_avg' => 'Show averages?', + 'cfg_type_total' => 'Show total Sum?', + 'cfg_type_top_x' => 'Show how many entries?', + 'cfg_type_assumebot' => 'Hits/pages minimum ratio to assume normal user?', + 'cfg_type_showmonths' => 'Show how many months?', + 'cfg_type_favicon' => 'Retrieve favicons for external URLs?', + 'cfg_type_domain_lvls' => 'Shorten URL to how many domain levels? (-1 to disable)', + 'cfg_dis_overview' => 'General Overview of key figures and dates', + 'cfg_dis_months' => 'Monthly data', + 'cfg_dis_days' => 'Daily data', + 'cfg_dis_weekdays' => 'Weekdays', + 'cfg_dis_hours' => 'Hours of the day', + 'cfg_dis_domains' => 'Domains of visitors', + 'cfg_dis_visitors' => 'IP addresses of visitors', + 'cfg_dis_logins' => 'Logins for username/password protected pages', + 'cfg_dis_robots' => 'Spiders, Robots of Search engines etc.', + 'cfg_dis_worms' => 'Worms searching for security holes', + 'cfg_dis_sessions' => 'How long have people been on the site?', + 'cfg_dis_filetype' => 'What filetypes are on the site', + 'cfg_dis_urls' => 'Pages on the site', + 'cfg_dis_paths_hlp' => 'Files/paths on the site', + 'cfg_dis_paths' => 'Files/paths', + 'cfg_dis_os' => 'Operating system of users', + 'cfg_dis_unknownos' => 'Unknown Operating system', + 'cfg_dis_osversions' => 'Operating system of users including versions', + 'cfg_dis_browsers' => 'User Browser Type', + 'cfg_dis_browserversions' => "User Browser Type (+{$BAW_MES[58]})", + 'cfg_dis_unknownbrowser' => 'Unknown Browsers', + 'cfg_dis_unknownbrowser_agent' => 'User Agent', + 'cfg_dis_screensizes' => 'Screensizes of users', + 'cfg_dis_se_referers' => 'Referrals from search engines', + 'cfg_dis_referers' => 'Referrals from other sites', + 'cfg_dis_referer_domains' => 'Referrals from other sites, grouped by 2-nd level domains', + 'cfg_dis_hotlinks' => 'Pages linking to images/data on your site', + 'cfg_dis_hotlink_domains' => 'Domains linking to images/data on your site', + 'cfg_dis_searchphrases' => 'Search phrases', + 'cfg_dis_searchwords' => 'Search words', + 'cfg_dis_misc' => 'User system features', + 'cfg_dis_errors' => 'Acesses to pages that returned errors', + + // display_helpers + 'config_not_writable' => 'Configuration file not writable!', + 'config_editor' => 'Configuration Editor', + 'created_by' => 'created by %s', + 'config_intro' => "// ATTENTION: BetterAWstats has an online config " + . "editor that you can use instead of editing this file here. The link " + . "is on the bottom of the menu! To use it, set \$BAW_CONF['online_config']" + . "= true; and make sure that the file is writable by the server, AND protect" + . "the BetterAWStats installation by a .htaccess file!", + 'cfg_name' => 'NAME: ', + 'cfg_info' => 'INFO: ', + 'cfg_def' => 'DEFAULT:', + 'cfg_display' => 'DISPLAY', + 'cfg_display2' => 'Stats Display', + 'cfg_logout' => 'Log Out', + 'confirm_password' => 'Confirm Password: ', + 'cfg_saved' => "The configuration has been saved. Continue to the " + . "Statistics or go back to the " + . "" + . "Config editor.", + 'cfg_save' => 'Save all', + 'cfg_reset' => 'Reset', + 'cfg_exit' => 'Exit', + 'cfg_asc'=> 'Ascending', + 'cfg_desc' => 'Descending', + 'show' => 'Show', + 'hide' => 'Hide', + 'all_months' => 'All (Monthly)', + 'all_days' => 'All (Daily)', + 'get_help' => 'Get Help', + 'back' => 'Back', + 'version_check' => 'Check for updates', + 'version_info' => 'Version Data', + 'unknown_list' => 'Unknown Data', + + // config.inc.php + 'require_password' => 'Please enter the password and press OK.', + 'password_incorrect' => 'The password is incorrect. Please try again', + + // reder_table + 'table_max_hits_exceed' => '(Above max_hits config limit of %s)', + 'records'=> '%s records', // new + + // section help + 'hlp_overview' => 'This section shows the general data for the currently ' + . 'selected month. Please note that this data does not accurately exclude ' + . 'hits caused by hotlinks and robots, hacker-scripts etc. If you set ' + . "\$BAW_CONF['show_parser_stats'] to true, you can see here statistics about" + . 'the logfile update such as Parsed records, Old records, New records, ' + . 'Corrupted and Dropped lines.', + 'hlp_months' => 'This section shows the history of data several months into ' + . 'the past. You can change the time span in the configuration.', + 'hlp_days' => 'This section shows the daily history of data of the selected month. ' + . 'If the current month is not finished, it will show the data of the ' + . 'past month for the same amount of days that are left within the current month. ', + 'hlp_weekdays' => 'This section shows the averages of visits/pages/hits history for ' + .'each weekday. Since the each month has a different amount of weekdays, summing ' + . 'up the data as AWSTATS is doing it, would distort the data. That is why BetterAWStats ' + . 'is showing the averages only.', + 'hlp_hours' => 'This section shows the averages of visits/pages/hits history for ' + .'each hour of the day. In case the current month is not finished, summing ' + . 'up the data as AWSTATS is doing it, would distort the data. That is why BetterAWStats ' + . 'is showing the averages.', + 'hlp_domains' => 'This section shows the hits per country (if known). Please note that ' + . 'the map-image summs the domains us, mil, edu, gov and arpa into the "us" domain.', + 'hlp_visitors' => 'This section shows the statistics per user\'s IP address. ' + . 'Since almost all pages consist out of several files (images, stylesheets etc.), ' + . 'visits with a low hits/pages ratio are most ' + . 'likely bots, scripts or other software but not by normal users. ' + . 'Those are summed up here under "Assumed Scripts & Bots". To change the ratio ' + . 'that defines a visit as a script, please change the ' + . '$BAW_CONF_DIS[\'visitors\'][\'assumebot\'] value in the configuration.' + . 'Similarly, users with only hits but no pages are hits from proxies or ' + . 'hotlinking users. Those are summed up under "Hotlinks/Proxies".' , + 'hlp_logins' => 'This section shows the hits per authenticated user. A user ' + . 'with one hit most likely represents a unsuccessful login attempt.', + 'hlp_referer_domains' => 'This section takes the data from "Referring sites" ' + . 'and sums it up by domain. AWStats does not show this information. ' + . 'If a referer has a link to your site on each of its ' + . 'pages, the overall number of referred visitors might be high, but the ' + . 'referrer might still not show up in the top 10 of the "Refering Sites". ' + . 'This is why BetterAWStats shows the domain sum so you can judge the true ' + . 'value of a refering site.', + 'hlp_hotlinks' => 'This section shows the referrers from other sites where files ' + . 'such as graphics where requested but no pages. This indicates that the ' + . 'referring site is hotlinking to your site (using your bandwidth, storage ' + . 'and image) while giving its own users the impression the data was hosted ' + . 'at the referring site. This data is separated from the "Referring sites" ' + . 'Statistics by BetterAWStats. AWStats does not make this difference.', + 'hlp_hotlink_domains' => 'This section shows the referrers from other sites where files ' + . 'such as graphics where requested but no pages. This indicates that the ' + . 'referring site is hotlinking to your site (using your bandwidth, storage ' + . 'and image) while giving its own users the impression the data was hosted ' + . 'at the referring site. This data is separated from the "Referring sites" ' + . 'Statistics by BetterAWStats. AWStats does not make this difference. ' + . 'In addition, BetterAWStats sums in this section the data by domain to make the hits by ' + . 'domain more visible since one domain might hotlink the same data from ' + . 'multiple URLs.', +); + +?> \ No newline at end of file diff --git a/betterawstats/language/lang_nl.inc.php b/betterawstats/language/lang_nl.inc.php new file mode 100644 index 0000000..4babbe4 --- /dev/null +++ b/betterawstats/language/lang_nl.inc.php @@ -0,0 +1,392 @@ + 'Gegevens bestand bijwerken statistieken:', + 'parsed_records' => 'Geanalyseerde records:', + 'old_records' => 'Oude records:', + 'new_records' => 'Nieuwe records:', + 'corrupted' => 'Onbetrouwbaar:', + 'dropped' => 'Niet meegenomen:', + 'ratio_pages_hits' => 'Verhouding'.BR.'(Hits/Pagina\'s)', + 'files_paths' => 'Bestanden/directories', + 'user_agent' => 'User Agent', + 'size' => 'Grootte', + 'by_domains' => '%s per domeinen', + 'visits' => 'Bezoeken', + 'averages' => ' (Gemiddelden)', + 'assumedscript' => 'Verondersteld Robots/Spiders', + 'weekday_averages' => $BAW_MES[91] . ' (Gemiddelden)', + 'hours_averages' => $BAW_MES[20] . ' (Gemiddelden)', + 'os_versions' => "{$BAW_MES[59]} (+{$BAW_MES[58]})", + 'browser_versions' => "{$BAW_MES[21]} (+{$BAW_MES[58]})", + 'referer_hotlinks' => 'Hotlinks', + 'hl_by_domains ' => "Hotlinks per domeinen", + 'hotlinks_proxies' => 'Hotlinks/Proxies', + + // baw_raise_error + 'baw_error' => 'BetterAWstats Fout', + 'datafile' => + "Gegevens bestand is onbetrouwbaar, gegevens konden niet worden gelezen: %s;
'%s' moet zijn BEGIN_...".BR + . "Lees a.u.b. de FAQ (/doc/FAQ.txt)", + 'datafileindex' => + "Gegevens bestand is onbetrouwbaar, gegevens-index kon niet worden gelezen: %s;
'%s' moet zijn BEGIN_...".BR + . "Lees a.u.b. de FAQ (/doc/FAQ.txt)", + 'datafilesdir' => + "De gegevens bestanden konden niet gevonden worden in deze lokatie: %s".BR + . "Controleer a.u.b. uw config.php. De waarde van \$BAW_CONF['path_data'] moet " + . "verwijzen naar de directory waar awstats zijn gegevens bestanden bewaart " + . "(typisch iets als /cgi-bin/awstats/data). Controleer a.u.b. ook " + . "dat php lees-rechten heeft op deze directory.", + 'languagefile' => + "Het taal bestand kon niet gevonden worden in deze lokatie: %s".BR + . "Controleer a.u.b. uw config.php. De waarde van \$BAW_CONF['path_lang'] moet " + . "verwijzen naar de directory waar awstats zijn taal bestand bewaart " + . "(typisch iets als /cgi-bin/awstats/lang). Controleer a.u.b. ook " + . "dat php lees-rechten heeft op deze directory.", + 'libraryfiles' => + "De library bestanden konden niet gevonden worden in deze lokatie: %s".BR + . "Controleer a.u.b. uw config.php. De wwarde van \$BAW_CONF['path_lib'] moet " + . "verwijzen naar de directory waar awstats zijn library bestanden bewaart " + . "(typisch iets als /cgi-bin/awstats/lib). Controleer a.u.b. ook " + . "dat php lees-rechten heeft op deze directory.", + 'configwrite' => + "Het configuratie bestand is niet overschrijfbaar. Controleer a.u.b. dat het script " + . "naar dit bestand kan schrijven of wijzig simpelweg dit bestand direct op de server " + . "in plaats van de configuratie Editor te gebruiken.", + 'configread' => + "Het configuratie bestand kon niet worden geopend voor lees/schrijf toegang", + 'configdisabled' => + "De online configureerder is uitgeschakeld. Zet a.u.b. " + . "\$BAW_CONF['online_config'] = true in uw config.php", + 'libraryeval' => + "Een fout is opgetreden bij het analyseren van het awstats library bestand %s dat wordt gebruikt bij " + . "het ontleden van de variabele %s. Schakel a.u.b. debugging aan in config.php en " + . "zend de getoonde PHP foutboodschappen naar het support forum zodat het probleem verholpen kan worden.", + 'jpgraph_path' => + "De bestanden voor jpgraph konden niet gevonden worden in %s. Schakel dit onderdeel uit in " + . "config.php of corrigeer het pad naar de bestanden.", + 'gd2notavailable' => + "De PHP graphics library GD2 is niet beschikbaar. Schakel a.u.b. de map functie uit of installeer GD2." + . "U kunt meer informatie verkrijgen op http://php.net/manual/en/ref.image.php", + 'mapnotavailable' => + "De afbeeldingen om de Map (%s) te maken zijn niet beschikbaar. Controleer a.u.b. dat u " + . "alle bestanden van de setup heeft en dat deze leesbaar zijn door " + . "de server.", + 'iconpath' => + "De AWSTATS icons konden niet gevonden worden in deze locatie: %s".BR + . "Controlleer a.u.b. uw config.php. De waarde van \$BAW_CONF['icons_url'] moet " + . "wijzen naar de URL waar awstats zijn library bestanden bewaart " + . "(typisch iets als http://awstats.local/awstats/icon).", + 'site_path' => + "Het pad naar awstats is niet goed gezet naar directory: %s".BR + . "Controlleer a.u.b. uw config.php. De waarde van \$BAW_CONF['site_path'] moet " + . "wijzen naar de directory waar BetterAWStats is ge-installeerd " + . "(typisch iets als /home/user/public_html/baw).".BR + . "Het schijnt dat uw script is ge-installeerd in '%s'.", + 'site_url' => + 'De URL naar BetterAWStats is niet goed gezet in uw config.php. Hij staat momenteel ' + . 'op %s, maar dat is niet goed. Het zou kunnen dat de URL %s moet zijn.', + 'password_match' => + 'De ingevoerde wachtwoorden komen niet overeen. Ga a.u.b. terug en probeer opnieuw.', + 'password_change' => + 'U probeert het standaard wachtwoord te gebruiken. Ga a.u.b. terug en wijzig hetnaar een ' + . 'ander wachtwoord.', + 'password_short' => + 'Uw wachtwoord dient minimaal uit 6 tekens te bestaan. Ga a.u.b. terug en ' + . 'kies een langer wachtwoord.', + 'xmldata' => + 'Your AWStats data files are stored in XML format. Unfortunately, BetterAWSTats ' + . 'does not support XML data yet. Please store your datafiles in plain text.', + + // $BAW_LIB['item_groups'] + 'time' => 'Tijd', + 'user_information' => 'Gebruiker informatie', + 'user_actions' => 'Gebruiker akties', + 'user_origin' => 'Gebruiker herkomst', + 'other_access' => 'Andere toegang', + + // debug messages + 'dbg_detect_language' => "Bezig de taal te vinden", + 'dbg_detected_language' => "Gevonden taal %s", + 'dbg_test_writable' => "Bezig te controleren of %s overschrijfbaar is", + 'dbg_test_writable_false' => "IS NIET overschrijfbaar: %s", + 'dbg_test_writable_true' => 'IS overschrijfbaar: %s', + 'dbg_found_dir' => 'Gevonden directory %s', + 'dbg_found_file' => 'Gevonden bestand: %s', + 'dbg_finished_parse_dir' => "Klaar met analyseren directory %s", + 'dbg_start_parse_dir' => "Start analyseren directory %s", + + // config_default.inc.php + 'cfg_enable' => 'Schakel in', + 'cfg_disable' => 'Schakel uit', + 'cfg_show_all' => 'Toon alle', + 'monday' => 'Maandag', + 'sunday' => 'Zondag', + 'cfg_hide' => 'Verberg', + 'cfg_show' => 'Toon', + 'cfg_site_settings' => 'Site instellingen', + 'cfg_path_to_aws_data' => 'Pad naar AWStats gegevens', + 'cfg_path_to_aws_data_hlp' => "Zet deze waarde op de directory waar AWStats " + . "zijn gegevens bestanden in bewaart. ATTENTIE: Als u deze bestanden met " + . "windows leest, maar u heeft ze met Linux aangemaakt of vice versa, let er dan op " + . "dat u ze 'BINARY' overzet. Anders kunnen ze niet goed gelezen worden. " + . "Niet afsluiten met een slash.", + 'cfg_path_to_aws_lib' => 'Pad naar AWStats libraries', + 'cfg_path_to_aws_lib_hlp' => "Zet deze waarde op de directory waar AWStats " + . "zijn library bestanden in bewaart. Niet afsluiten met een slash.", + 'cfg_path_to_aws_lang' => 'Pad naar AWStats taal bestanden', + 'cfg_path_to_aws_lang_hlp' => 'Zet deze waarde op de directory waar AWStats ' + . 'zijn language bestanden in bewaart. Niet afsluiten met een slash.', + 'cfg_script_url' => 'Script URL', + 'cfg_script_url_hlp' => "De url van BetterAWstats' directory, Niet afsluiten met een slash.", + 'cfg_script_path' => 'Script pad', + 'cfg_script_path_hlp' => 'Het pad van BetterAWstats, Niet afsluiten met een slash.', + 'cfg_aws_icons_url' => 'URL naar AWStats icons', + 'cfg_aws_icons_url_hlp' => 'De url naar de awstats icons, moet bevatten de ' + . 'gehele http://..., niet afsluiten met een slash.', + 'cfg_web_config' => 'Web configuratie', + 'cfg_web_config_hlp' => 'De online configuratie editor inschakelen? LET OP: ' + . 'Uw config.php bestand moet schrijfbaar zijn om dit in te schakelen. Het is AF TE RADEN ' + . 'om dit te gebruiken, tenzij de directory wachtwoord-beveiligd is met een ' + . '.htaccess bestand.', + 'cfg_web_config_pw' => 'Wijzig configuratie wachtwoord?', + 'cfg_web_config_pw_hlp' => 'Dit wachtwoord is nodig om toegang tot de online configuratie ' + . 'te krijgen.', + 'cfg_limit_server' => 'Beperken tot server?', + 'cfg_limit_server_hlp' => 'Zet dit naar een enkele server waartoe u zich wilt beperken ' + . 'of "false" om allen te tonen. De server naam moet degene zijn die gebruikt wordt voor awstats.', + 'cfg_layout_settings' => 'Opmaak instellingen', + 'cfg_layout_type' => 'Opmaak type', + 'cfg_layout_type_hlp' => 'Toon page in verticale of horizontale opmaak?', + 'cfg_vertical' => 'Verticaal', + 'cfg_horizontal' => 'Horizontaal', + 'cfg_language' => 'Taal', + 'cfg_language_hlp' => 'Zet uw taal. Zet op "auto" om de browserwaarde te nemen.', + 'cfg_firstweekday' => 'Eerste dag van de week', + 'cfg_firstweekday_hlp' => 'Moet Zondag de eerste dag van de weekzijn of maandag?', + 'cfg_decimalpoint' => 'Decimale punt', + 'cfg_decimalpoint_hlp' => "Decimale punt teken (99.9)", + 'cfg_thous_sep' => 'Duizendtal scheidingsteken', + 'cfg_thous_sep_hlp' => "Duizendtal scheidingsteken (1'000)", + 'cfg_date_form' => 'Datum formaat (2007-31-12)', + 'cfg_date_form_hlp' => 'Hoe moet een datum er uit zien? Voor formattering, raadpleeg ' + . 'a.u.b. http://php.net/manual/en/function.date.php', + 'cfg_date_time_form' => 'Datum & tijd formaat (2007-31-12 23:59)', + 'cfg_date_time_form_hlp' => 'Hoe moet een datum & tijd er uit zien? Voor formattering, raadpleeg ' + . 'a.u.b http://php.net/manual/en/function.date.php', + 'cfg_percent_dec' => 'Percentage decimalen', + 'cfg_percent_dec_hlp' => "Hoeveel decimalen voor percentages? (99.9%)", + 'cfg_field_length' => 'Veld lengte', + 'cfg_field_length_hlp' => 'Wat is de maximale tekstlengte van tabel velden? ' + . "(Alleen van toepassing op links)", + 'cfg_max_lines' => 'Maximaal aantal tabel rijen', + 'cfg_max_lines_hlp' => 'Wat is het maximale aantal rijen dat een tabel kan hebben? ' + . 'Zet op "false" om uit te schakelen. Als een tabel dit aantal rijen bereikt, ' + . 'wordt de rest geaggregeerd in 1 regel. Dit gaat ook op voor de "full list view"' + . ' van een tabel.', + 'cfg_hide_empty' => 'Verberg lege gegevens', + 'cfg_hide_empty_hlp' => 'Volledig verbergen van grafieken met nul-entries? ' + . '(Het menu wordt ook verborgen)', + 'cfg_auto_submit_form' => 'Voer dropdown-wijzigingen meteen uit', + 'cfg_auto_submit_form_hlp' => 'Als dit is ingeschakeld, zullen de site/datum dropdowns geen ' + . '"OK"-button hebben. De pagina wordt aangeroepen zodra u een nieuwe waarde ' + . 'kiest. Niet aanbevolen voor grote sites.', + 'cfg_chart_settings' => 'Grafiek instellingen', + 'cfg_max_scale_visitors' => 'Maximale schaal voor Bezoekers', + 'cfg_max_scale_visitors_hlp' => 'De maximum waarde van de gekozen optie zal ' + . 'de maximum hoogte van de Bezoekers staven in de grafiek bepalen.', + 'cfg_max_scale_visits' => 'Maximale schaal voor Bezoeken', + 'cfg_max_scale_visits_hlp' => 'De maximum waarde van de gekozen optie zal ' + . 'de maximum hoogte van de Bezoeken staven in de grafiek bepalen.', + 'cfg_max_scale_pages' => 'Maximale schaal voor Paginas', + 'cfg_max_scale_pages_hlp' => 'De maximum waarde van de gekozen optie zal ' + . 'de maximum hoogte van de Paginas staven in de grafiek bepalen.', + 'cfg_max_scale_hits' => 'Maximale schaal voor Hits', + 'cfg_max_scale_hits_hlp' => 'De maximum waarde van de gekozen optie zal ' + . 'de maximum hoogte van de Hits staven in de grafiek bepalen.', + 'cfg_max_chart_items' => 'Maximaal aantal grafiek rijen', + 'cfg_max_chart_items_hlp' => 'Wanneer grafieken getoond worden met de volledige lijsten, ' + . 'hoeveel items kunnen dan getoond worden? De rest wordt gesommeerd in "'.$BAW_MES[2].'". ' + . 'Dit wordt zo gedaan om te brede grafieken te voorkomen.', + 'cfg_chart_titles' => 'Grafiek Titels?', + 'cfg_chart_titles_hlp' => 'Indien ingeschakeld, zal er een titel boven iedere grafiek getoond worden.', + 'cfg_jpgraph_settings' => 'JPGraph instellingen', + 'cfg_jpgraph_enable' => 'Schakel JPgraph in?', + 'cfg_jpgraph_enable_hlp' => 'Om JPGraph te gebruiken, zult u dit moeten downloaden van ' + . 'http://www.aditus.nu/jpgraph/jpdownload.php.', + 'cfg_jpgraph_path' => 'Pad naar JPGraph', + 'cfg_jpgraph_path_hlp' => 'Waar staat uw JPGraph installatie? (De directory ' + . 'waar jpgraph.php in staat. Niet afsluiten met een slash.)', + 'cfg_table_settings' => 'Tabel instellingen', + 'cfg_advanced_settings' => 'Geavanceerde instellingen', + 'cfg_version' => 'Versie', + 'cfg_version_hlp' => 'Versie van deze software', + 'cfg_xhtml' => 'XHTML/ HTML', + 'cfg_xhtml_hlp' => 'Wilt u uw output in HTML or XHTML?', + 'cfg_debug' => 'Debug', + 'cfg_debug_hlp' => 'Wilt u debug-output tonen (ZEER gedetaileerd)?', + 'cfg_parser' => 'Analyse statistieken', + 'cfg_parser_hlp' => 'Wilt u log file analyse gegevens tonen onder de statistiek samenvatting?', + 'cfg_module' => 'Module instellingen', + 'cfg_module_hlp' => 'Gebruikt u BetterAWstats als module voor andere ' + . 'software? (Momenteel is alleen Drupal ondersteund)', + 'cfg_type_order' => 'Sorteer volgorde', + 'cfg_type_show' => 'Toon deze gegevens?', + 'cfg_type_collapse' => 'Ingeklapt?', + 'cfg_type_table' => 'Toon gegevens tabel?', + 'cfg_type_sort' => 'Gesorteerd op welke kolom?', + 'cfg_possible_values'=> ' Mogelijke waarden zijn:', + 'cfg_type_sort_dir' => 'Sorteer richting?', + 'cfg_type_sort_dir_opts' => 'SORT_ASC=Oplopend, SORT_DESC=Aflopend', + 'cfg_type_chart' => 'Toon HTML grafiek?', + 'cfg_type_map' => 'Toon landkaart afbeelding?', + 'cfg_type_avg' => 'Toon geniddelden?', + 'cfg_type_total' => 'Toon totalen som?', + 'cfg_type_top_x' => 'Toon hoeveel entries?', + 'cfg_type_assumebot' => 'Verberg visitors waar Hits = Paginas?', + 'cfg_type_showmonths' => 'Toon hoeveel maanden?', + 'cfg_type_favicon' => 'Favicons ophalen voor externe URLs?', + 'cfg_type_domain_lvls' => 'Verkort URL naar hoeveel domein levels? (-1 om uit te schakelen)', + 'cfg_dis_overview' => 'Algemeen overzicht van kentallen en datums', + 'cfg_dis_months' => 'Maandelijkse gegevens', + 'cfg_dis_days' => 'Dagelijkse gegevens', + 'cfg_dis_weekdays' => 'Weekdagen', + 'cfg_dis_hours' => 'Uren van de dag', + 'cfg_dis_domains' => 'Domeinen van bezoekers', + 'cfg_dis_visitors' => 'IP addressen van bezoekers', + 'cfg_dis_logins' => 'Logins voor gebruikersnaam/wachtwoord beschermde paginas', + 'cfg_dis_robots' => 'Spiders, Robots van Zoek machines etc.', + 'cfg_dis_worms' => 'Worms die beveiligingslekken zoeken', + 'cfg_dis_sessions' => 'Hoe lang is men op de site geweest?', + 'cfg_dis_filetype' => 'Welke bestandstypen zijn op de site', + 'cfg_dis_urls' => 'Paginas op de site', + 'cfg_dis_paths_hlp' => 'Bestanden/paden op de site', + 'cfg_dis_paths' => 'Bestanden/paden', + 'cfg_dis_os' => 'Besturingssysteem van gebruikers', + 'cfg_dis_unknownos' => 'Onbekend besturingssysteem', + 'cfg_dis_osversions' => 'Besturingssysteem van gebruikers inklusief versies', + 'cfg_dis_browsers' => 'Gebruikers browser type', + 'cfg_dis_browserversions' => "Gebruikers browser type (+{$BAW_MES[58]})", + 'cfg_dis_unknownbrowser' => 'Onbekende browsers', + 'cfg_dis_unknownbrowser_agent' => 'User agent', + 'cfg_dis_screensizes' => 'Schermafmetingen van gebruikers', + 'cfg_dis_se_referers' => 'Referrals van zoek machines', + 'cfg_dis_referers' => 'Referrals van andere sites', + 'cfg_dis_referer_domains' => 'Referrals van andere sites, gegroepeerd per 2e level domeinen', + 'cfg_dis_hotlinks' => 'Paginas die verwijzen naar afbeeldingen/gegevens op uw site', + 'cfg_dis_hotlink_domains' => 'Domeinen die verwijzen naar afbeeldingen/gegevens op uw site', + 'cfg_dis_searchphrases' => 'Zoek zinnen', + 'cfg_dis_searchwords' => 'Zoek woorden', + 'cfg_dis_misc' => 'Gebruikers systeem kenmerken', + 'cfg_dis_errors' => 'Toegang tot pagina\'s die foutmeldingen afgaven', + + // display_helpers + 'config_not_writable' => 'Configuratie bestand niet overschrijfbaar!', + 'config_editor' => 'Configuratie editor', + 'created_by' => 'gemaakt door %s', + 'config_intro' => "// ATTENTIE:\r\n// BetterAWstats heeft een online config " + . "editor die u kunt gebruiken inplaats van deze file te editen. De " + . "verwijzing naar de online config editor staat onderaan het menu! Om " + . "deze te gebruiken zet u \$BAW_CONF['online_config']= true; en zorgt " + . "u ervoor dat het bestand overschrijfbaar is door de server.\r\n", + 'cfg_name' => 'NAAM: ', + 'cfg_info' => 'INFO: ', + 'cfg_def' => 'DEFAULT:', + 'cfg_display' => 'TOON', + 'cfg_display2' => 'Toon', + 'cfg_logout' => 'Uitloggen', + 'confirm_password' => 'Bevestig Wachtwoord: ', + 'cfg_saved' => "De configuratie is bewaard. Ga verder met " + . "Statistieken of ga terug naar de " + . "" + . "Config editor.", + 'cfg_save' => 'Bewaar alles', + 'cfg_reset' => 'Reset', + 'cfg_exit' => 'Exit', + 'cfg_asc'=> 'Oplopend', + 'cfg_desc' => 'Aflopend', + 'show' => 'Toon', + 'hide' => 'Verberg', + 'all_months' => 'Alle (Maandelijks)', + 'all_days' => 'Alle (Dagelijks)', + 'get_help' => 'Vraag hulp', + 'back' => 'Terug', + 'version_check' => 'Kijk of er updates zijn', + 'version_info' => 'Versie Gegevens', + 'unknown_list' => 'Onbekende Gegevens', + + // config.inc.php + 'require_password' => 'Voer a.u.b. het wachtwoord in en druk op OK.', + 'password_incorrect' => 'Het wachtwoord is onjuist. Probeer a.u.b. opnieuw.', + + // reder_table + 'table_max_hits_exceed' => '(Overstijgende max_hits config beperken tot %s)', + 'records'=> '%s records', + + // section help + 'hlp_overview' => 'Deze sectie toont de algemene gegevens van de huidig ' + . 'geselecteerde maand. Let a.u.b. op dat de hits, veroorzaakt door hotlinks en ' + . 'robots, hacker-scripts etc., op een niet accurate wijze zijn weggelaten. Als u ' + . "\$BAW_CONF['show_parser_stats'] op true zet, kunt u hier statistieken zien over" + . 'de logfile update zoals geanalyseerde records, oude records, nieuwe records, ' + . 'onbetrouwbare en weggelaten regels.', + 'hlp_months' => 'Deze sectie toont de historie van gegevens enkele maanden in het ' + . 'verleden. U kunt de tijdspanne veranderen in de configuratie.', + 'hlp_days' => 'Deze sectie toont de dagelijkse historie van gegevens van de geselecteerde maand. ' + . 'Als de huidige maand nog gaande is, zullen hier de gegevens getoond worden van de ' + . 'verleden maand voor hezelfde aantal dagen dat nog te gaan is in de huidige maand. ', + 'hlp_weekdays' => 'Deze sectie toont de gemiddelden van bezoeken/pagina\'s/hits historie voor ' + .'elke weekdag. Omdat iedere maand een verschillend aantal weekdagen heeft, zou sommering ' + . 'van de gegevens, zoals AWSTATS dat doet, de gegevens vervormen. Daarom toont BetterAWStats ' + . 'alleen de gemiddelden.', + 'hlp_hours' => 'Deze sectie toont de gemiddelden van bezoeken/pagina\'s/hits historie voor ' + .'elk uur van de dag. Als de huidige maand nog gaande is, zou sommering ' + . 'van de gegevens, zoals AWSTATS dat doet, de gegevens vervormen. Daarom toont BetterAWStats ' + . 'alleen de gemiddelden.', + 'hlp_domains' => 'Deze sectie toont de hits per land (indien bekend). Let a.u.b. op dat ' + . 'in de wereldkaartafbeelding de domeinen us, mil, edu, gov en arpa gesommeerd zijn in het "us" domein.', + 'hlp_visitors' => 'Deze sectie toont de statistieken per gebruiker\'s IP adres. ' + . 'Omdat haast alle pagina\'s bestaan uit verschillende bestanden (afbeeldingen, stylesheets etc.), ' + . 'zijn bezoeken met met een lage hits/pagina\'s ratio zeer ' + . 'waarschijnlijk gecreeerd door bots, scripts of andere software maar niet door reguliere gebruikers. ' + . 'Deze zijn hier gesommeerd onder "Veronderstelde Scripts & Bots". Om de ratio te wijzigen ' + . 'die een gebruiker als een script definieert, verandert u de ' + . '$BAW_CONF_DIS[\'visitors\'][\'assumebot\'] waarde in de configuratie.' + . 'Evenzo, gebruikers met alleen hits maar geen pagina\'s zijn hits van proxies of ' + . 'hotlinking gebruikers. Deze zijn gesommeerd onder "Hotlinks/Proxies".' , + 'hlp_logins' => 'Deze sectie toont de hits per ge-autoriseerde gebruiker. Een gebruiker ' + . 'met maar 1 hit is zeer waarschijnlijk het resultaat van een mislukte login poging.', + 'hlp_referer_domains' => 'Deze sectie neemt de gegevens van "Referring sites" ' + . 'en sommeerd dit per domein. AWStats toont deze informatie niet. ' + . 'Als een referer een link naar uw site heeft op al zijn ' + . 'pagina\'s, dan zou het totaal aantal van refer bezoekers zeer hoog zijn, maar de ' + . 'referrer zou nog steeds niet getoond worden in de top 10 van de "Refering Sites". ' + . 'Dit is de reden dat BetterAWStats het domein totaal toont, zodat u de juiste waarde aan ' + . 'refering site kunt hechten.', + 'hlp_hotlinks' => 'Deze sectie toont de referrers van andere sites die bestanden ' + . 'zoals afbeeldingen aanvragen maar geen pagina\'s. Dit houdt in dat de ' + . 'referring site hotlinks naar uw site heeft (en dus gebruik maakt van uw bandbreedte, opslag ' + . 'en afbeelding(en)) terwijl zijn gebruikers het idee gegeven wordt dat de gegevens gehost ' + . 'zijn op de referring site. Deze gegevens zijn gescheiden van "Referring sites" ' + . 'Statistieken door BetterAWStats. AWStats maakt dit onderscheid niet. ', + 'hlp_hotlink_domains' => 'Deze sectie toont de referrers van andere sites die bestanden ' + . 'zoals afbeeldingen aanvragen maar geen pagina\'s. Dit houdt in dat de ' + . 'referring site hotlinks naar uw site heeft (en dus gebruik maakt van uw bandbreedte, opslag ' + . 'en afbeelding(en)) terwijl zijn gebruikers het idee gegeven wordt dat de gegevens gehost ' + . 'zijn op de referring site. Deze gegevens zijn gescheiden van "Referring sites" ' + . 'Statistieken door BetterAWStats. AWStats maakt dit onderscheid niet ' + . 'Bovendien, BetterAWStats sommeert in deze sectie de gegevens per domain om de hits per ' + . 'domein meer inzichtelijk te maken, omdat een domain wellicht dezelfde gegevens ' + . 'van meerdere URLs hotlinkt.', +); + +?> \ No newline at end of file diff --git a/betterawstats/modules/index.html b/betterawstats/modules/index.html new file mode 100644 index 0000000..e69de29 diff --git a/betterawstats/modules/render_htmlchart.inc.php b/betterawstats/modules/render_htmlchart.inc.php new file mode 100644 index 0000000..c0a5dae --- /dev/null +++ b/betterawstats/modules/render_htmlchart.inc.php @@ -0,0 +1,247 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'render_htmlchart.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +function baw_render_htmlchart($chart, $format, $get_avg=false, $top_x=false, $dataformat=false) { + baw_debug("rendering chart"); + global $BAW_CONF, $BAW_LIB, $BAW_MES; + + // FORMATS ----------------------------------------------------------------- + $format_arr = array(); + $itemcount = count($chart); + + // we have time data, $top_x has to work from the back instead of the front + $time_data = false; + if ($top_x < 0) { + $time_data = true; + $top_x = abs($top_x); + } + if ($get_avg) { + $top_x++; + } + + $top_x = min($BAW_CONF['max_chart_items'], $top_x); + $top_x_count = $top_x; + // if its not set, use count of items (day, month etc) + if (!$top_x_count) { + $top_x_count = $itemcount; + } + // find the smaller one to know the resulting lines + if (min($top_x_count, $itemcount) > 12) { + $width = 4; + } else { + $width = 6; + } + // iterate formats for header + $text_fields = 0; + foreach ($format as $cell => $attr) { + // iterate one formats attributes + $format_arr[] = $attr['format']; + // we need the number of textfields so we can prepend them to the averages array. + // otherwise the fields for avg and others are not in the right columns + if ($attr['format'] == 'layout_text') { + $text_fields++; + } + // $title_arr[] = $attr['title']; + } + // Max & averages calculation ---------------------------------------------- + // the max has to be calculated before so the bar height can be calculated + // the sum has to be known for averages + // iterate all the table and count the sums of all numeric data + $max_arr = array(); + $sum_arr = array(); + $avg_arr = array(); + $others = array(); + + $filled_lines = $itemcount; // get the value for substraction + $row_no = 0; + $othercount = 0; + $hasothers = false; + foreach ($chart as $lineid => $row) { + $cell_no = 0; + $rowsum = 0; + $hasothers = false; + foreach ($row as $cell) { + if ($format_arr[$cell_no] != 'layout_text') { // we dont include the text + // max calculation + @$max_arr[$cell_no] = max($max_arr[$cell_no], $cell); + // sum calculation + @$sum_arr[$cell_no] += $cell; + // average calculation + if (is_numeric($cell) && $get_avg) { + $rowsum += $cell; + if ($row_no == ($itemcount-1) && $filled_lines >= 1) { // last line, assume sums are done + if ($rowsum == 0 && $cell_no == 0) { // do once again for last line, dont substract further after first cell + $filled_lines--; + } + $avg_arr[$cell_no] = $sum_arr[$cell_no] / $filled_lines; + } + } else if ($get_avg) { + $avg_arr[$cell_no] = ''; + } + // others calculation + if ((!$time_data && $top_x && ($row_no >= $top_x))) { + // max calculation + @$max_arr[$cell_no] = max($max_arr[$cell_no], $others[$cell_no]); + $hasothers = true; + @$others[$cell_no] += $cell; + } else if ($time_data && $top_x && (($itemcount - $row_no) >= $top_x)){ + $hasothers = true; + // for now, we do not accumulate old data for months/days -- optional? + // risk is that 'others' is so big that it does not make sense + //@$others[$cell_no] += $cell; + //@$max_arr[$cell_no] = max($max_arr[$cell_no], $others[$cell_no]); + } + } + $cell_no ++; + } + // we processes the line, if we are already in the 'others' remove the line + if ($hasothers) { + $othercount ++; + unset($chart[$lineid]); + } + // remove one line from avg-count if data empty + if ($rowsum == 0) { + $filled_lines--; + } + $row_no++; // count to find out if we are ready to do averages + } + // make the array longer to fit, first index is 1 since it comes after the array title + if ($text_fields >= 1) { + $empty_arr = array_pad(array(), $text_fields - 1, ''); + } else { + $empty_arr = array(); + } + // add others to the table + if ($hasothers && !$time_data) { // we got others, add them to the end + $row_no++; + $others = $empty_arr + array($text_fields - 1 => $BAW_MES[2]) + $others; + $chart += array('layout_others' => $others); + } else if ($hasothers && $time_data) { + $row_no++; + $others = $empty_arr + array($text_fields - 1 => $BAW_MES[2]) + $others; + //$temp = array('layout_others' => $others); + //$chart = $temp + $empty_arr + $chart; + } + // add averages to the table + if ($get_avg) { + $row_no++; + $avg_arr = $empty_arr + array($text_fields - 1 => $BAW_MES[96]) + $avg_arr; + $chart += array('layout_avg' => $avg_arr); + } + + $out = "\n\n"; + $out .= " \n"; + // create the title + + if (isset($format[0]['title']) && $BAW_CONF['chart_titles']) { + $count_str = sprintf($BAW_MES['records'], baw_num_format($itemcount)); + $out .=" \n \n \n"; + } + + $l = 0; + $fieldcount = 0; + $legend = array(); + foreach ($chart as $lineid => $row) { + $class = ''; + if (isset($dataformat[$lineid])) { + $class = " {$dataformat[$lineid]}"; + } else if ($lineid === 'layout_others' || $lineid === 'layout_avg') { + $class .= " $lineid"; + } + $out .= " \n"; + if (isset($legend[$l-1][$cell_no]) && isset($cell)) { + if (preg_match('#colspan=\\"(\d+)\\">'. $cell.'#', $legend[$l-1][$cell_no], $number)) { + $number[1]++; + @$legend[$l][$cell_no] =" $cell\n"; + $legend[$l-1][$cell_no] =""; + } + } + } + $cell_no ++; + } + $out .= "\n \n"; + $f = 1; + $l ++; + } + + $out .= " \n"; + // Display legend + $linecount = $l; + // we inverse the order so the ones standing closer to the data in the table + // are on top here + for ($f=$fieldcount; $f>=0; $f--) { + $out .= " \n"; + for ($l=0; $l<$linecount; $l++) { + $out .= $legend[$l][$f]; + } + $out .= " \n"; + } + $out .= "
{$format[0]['title']} ($count_str)
\n"; + $cell_no = 0; + foreach ($row as $cell) { + // only take the numeric values + if ($format_arr[$cell_no] != 'layout_text') { + $tags = ''; + $function = $BAW_LIB['formats'][$format_arr[$cell_no]]['frm']; + $txt = $BAW_LIB['formats'][$format_arr[$cell_no]]['txt']; + $img = $BAW_LIB['formats'][$format_arr[$cell_no]]['img']; + $alt = "{$BAW_MES[$txt]}: ". exec_function($function, $cell); + $max_string = str_replace('layout_', '', $format[$cell_no]['format']); + // scale after what? + $max_key = array_search($BAW_CONF["max_$max_string"], $format_arr); + if ((isset($max_arr[$max_key])) && ($max_arr[$max_key]>0)) { + $height = $cell / ($max_arr[$max_key] / 100); + } else { + $height = 1; + } + if ($height < 1) { + $height = 1; + } + $attr = array( + 'height'=> $height, + 'width' => $width, + 'alt' => $alt, + 'title' => $alt, + 'class' => 'chartimg' + ); + $out .= baw_create_image($BAW_CONF['icons_url'] . "/other/{$img}", $attr); + } else { + // write legend + $fieldcount = max($cell_no, $fieldcount); + @$legend[$l][$cell_no] =" $cell
\n"; + baw_debug("rendering chart finished"); + return $out; +} + +?> \ No newline at end of file diff --git a/betterawstats/modules/render_htmlchart2.inc.php b/betterawstats/modules/render_htmlchart2.inc.php new file mode 100644 index 0000000..d63bd31 --- /dev/null +++ b/betterawstats/modules/render_htmlchart2.inc.php @@ -0,0 +1,202 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'render_htmlchart.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +function baw_render_htmlchart2($chart, $get_avg, $top_x) { + baw_debug("rendering chart"); + global $BAW_CONF, $BAW_LIB, $BAW_MES; + $out = ''; + // in case this is a full list, dont make it too wide + $top_x = min($BAW_CONF['max_chart_items'], $top_x); + // find out max values + $max = array(); + $avg = array(); + $sum = array(); + $other = array(); + $count_val = count($chart); + // take out topx so we can manipulate it for width calculation + $top_x_count = $top_x; + // if its not set, use count of items (day, month etc) + if (!$top_x_count) { + $top_x_count = $count_val; + } + // find the smaller one to know the resulting lines + if (min($top_x_count, $count_val) > 12) { + $width = 4; + } else { + $width = 6; + } + // get maximum values for scaling + $count_up = 0; + $count_val_static = $count_val; + foreach ($chart as $lineid => $row) { // get the first set of data (one month/day/etc) + $rowsum = 0; + $count_val--; // this is used to find the final line + foreach ($row as $cell => $attr) { // iterate through all the different data of one set + $data = $attr['data']; + @$max[$attr['format']] = max(@$max[$attr['format']], $data); + // add others to chart + if ($top_x && $count_up >= $top_x) { + @$other[$attr['format']] += $data; + if ($count_val == 0) { // do this only for the last value + // adding averages to the end of the data + $chart[$BAW_MES[2]][] = array( + 'data'=> $other[$attr['format']], + 'format' => $attr['format'] + ); + // add one more line so that others gets displayed + // get max again for others value + @$max[$attr['format']] = max(@$max[$attr['format']], $other[$attr['format']]); + } + } + if ($get_avg) { + // add avg to charts + @$sum[$attr['format']] += $data; + //if ($count_val >= 0) { // sum all values of this row + $rowsum += $data; + //} + if ($count_val == 0) { // do this only for the last value + @$avg[$attr['format']] = $sum[$attr['format']] / $count_val_static; + // adding averages to the end of the data + $chart[$BAW_MES[96]][] = array( + 'data'=> $avg[$attr['format']], + 'format' => $attr['format'] + ); + } + } + } + if ($top_x && $count_up >= $top_x) { + // remove 'other' data from chart after its processed + unset($chart[$lineid]); + } + if ($rowsum == 0) { // substract line if all values zero + $count_val_static--; + } + $count_up++; + } + // we need extra lines if we have this data + if (isset($chart[$BAW_MES[2]])) { // others + $top_x++; + } + if ($get_avg) { + $top_x++; + } + // create actual chart + $legend = ''; + $out .= "\n\n"; + $out .= " \n"; + $c = 0; + $others = false; + $otherdata = array(); + foreach ($chart as $lineid => $row) { + if (!$top_x or $c < $top_x) { + $out .= " \n"; + $legend_arr = explode("|",$lineid); + if (!isset($legendcount)) { + $legendcount = count($legend_arr); + } + $f = 1; + for ($i=0; $i<$legendcount; $i++) { + if ($i > 0) { + $tags = ''; + } + @$legend[$i][$c] =" {$legend_arr[$i]}\n"; + if (isset($legend[$i][$c-1]) && isset($legend_arr[$i])) { + $f ++; + if (preg_match('#colspan=\\"(\d+)\\">'. $legend_arr[$i].'#', $legend[$i][$c-1], $number)) { + $number[1]++; + @$legend[$i][$c] =" {$legend_arr[$i]}\n"; + $legend[$i][$c-1] =""; + } + } else { + $f = 1; + } + } + } + $c ++; + } + if ($top_x and $c > $top_x) { + $c = $top_x; + } + $out .= " \n"; + // Display legend + if (!isset($legendcount)) { + $legendcount = 0; + } + + for ($i=0; $i<$legendcount; $i++) { + $out .= " \n"; + for ($j=0; $j<$c; $j++) { + $out .= $legend[$i][$j]; + } + $out .= " \n"; + } + $out .= "
\n"; + foreach ($row as $cell => $attr) { + $tags = ''; + // create attributes + foreach ($attr as $name => $value){ + if ($name == 'data') { + $data = $value; + } else if ($name != 'format') { + $tags .= " $name=\"$value\""; + } + } + $format = $BAW_LIB['formats'][$attr['format']]; + $function = $format['frm']; + $alt = "{$BAW_MES[$format['txt']]}: ". exec_function($function, $data); + // insert here the scaling figure + $max_string = str_replace('layout_', '', $attr['format']); + $max_val_field = $BAW_CONF["max_$max_string"]; + if ((isset($max[$max_val_field])) && ($max[$max_val_field]>0)) { + $height = $data / ($max[$max_val_field] / 100); //( / ) * 100; + } else { + $height = 1; + } + if ($height < 1) { + $height = 1; + } + $attr = array( + 'height'=> $height, + 'width' => $width, + 'alt' => $alt, + 'title' => $alt, + 'class' => 'chartimg' + ); + $out .= baw_create_image($BAW_CONF['icons_url'] . "/other/{$format['img']}", $attr); + } + $out .= "\n
\n"; + baw_debug("rendering chart finished"); + return $out; +} +?> \ No newline at end of file diff --git a/betterawstats/modules/render_jpgraph.inc.php b/betterawstats/modules/render_jpgraph.inc.php new file mode 100644 index 0000000..fdc4dd6 --- /dev/null +++ b/betterawstats/modules/render_jpgraph.inc.php @@ -0,0 +1,142 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +// this file can't be used on its own +if (isset($_GET['getgraph'])) { + baw_render_jpgraph_img(); +} else if (strpos ($_SERVER['PHP_SELF'], 'reder_map.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +// $out .= baw_render_jpgraph ($set['name'], $newval, $format, 'pie', false, $set['top_x']); + +function baw_render_jpgraph ($name, $chart, $format, $type='pie', $get_avg=false, $top_x=false, $sort=0) { + global $BAW_CONF, $BAW_MES; + $dir = $BAW_CONF['jpgraph_path'] . '/jpgraph.php'; + + if (!file_exists($dir)) { + return baw_raise_error('jpgraph_path', array($dir)); + } + + $jp_data = array(); + // $jp_legend = array(); + $entries = 0; + if (count($chart) == 0) { + return ""; + } + // calc others + $f = ''; + $d = ''; + $others = 0; + $other_arr = array(); + + foreach ($chart as $id => $data) { + $count = count($data); + if ($entries < $top_x) { + foreach ($format as $fid => $fdata) { + $d .= "&d[$fid][]={$data[$fid]}"; + } + } else { // 'others' + foreach ($format as $fid => $fdata) { + if ($fdata['format'] !== 'layout_text' && + $fdata['format'] !== 'layout_date') { + @$other_arr[$fid] += $data[$fid]; + } else { + if ($fid == 0) { + $other_arr[$fid] = $BAW_MES[2]; + } else { + $other_arr[$fid] = ''; + } + } + } + } + $entries ++; + } + foreach ($other_arr as $oid => $odata) { + $d .= "&d[$oid][$top_x]=$odata"; + } + foreach ($format as $fid => $fdata) { + $f .= "&f[]= {$fdata['title']}"; + } + + // $count = count($jp_data); + + $img_url = $BAW_CONF['site_url'] . "/modules/render_jpgraph.inc.php?getgraph=true&type=$type$d$f"; + $out = "
\"chart:
"; + return $out; +} + +function baw_render_jpgraph_img() { + include_once("../config.php"); + + if (isset($_GET['type'])) { + $type = $_GET['type']; + } else { + return; + } + + $d = $_GET['d']; + $f = $_GET['f']; + + $count = count($d); + $dir = $BAW_CONF['jpgraph_path'] . '/jpgraph.php'; + include_once ($dir); + switch($type){ + case 'bar': + include_once ($BAW_CONF['jpgraph_path'] . '/jpgraph_bar.php'); + break; + case 'pie': + include_once ($BAW_CONF['jpgraph_path'] . "/jpgraph_pie.php"); + $size = 0.17; + $graph = new PieGraph(600,250,"auto"); + for ($i=0; $i<1; $i++) { + $p1 = new PiePlot($d[$i]); + if ($i == 0) { + $p1->SetLegends($d[0]); + } + $p1->title->Set($f[1]); + $p1->SetSize($size); + $vert = 0.15 + (($size + 0.1) * $i); + $p1->SetCenter($vert,0.3); + $p1->SetStartAngle(0); + $p1->SetTheme("sand"); + $graph->Add($p1); + } + $graph->Stroke(); + break; + case 'line': + include_once ($BAW_CONF['jpgraph_path'] . "/jpgraph_line.php"); + break; + } + return $out; +} + + +?> \ No newline at end of file diff --git a/betterawstats/modules/render_map.inc.php b/betterawstats/modules/render_map.inc.php new file mode 100644 index 0000000..51a6a37 --- /dev/null +++ b/betterawstats/modules/render_map.inc.php @@ -0,0 +1,236 @@ + $vars) { + if (($doms >= $top_x) && ($top_x !== false)) { + break; + } + $new_data .= "&c[$country][0]={$vars[3]}&c[$country][1]={$vars[4]}"; + $doms ++; + } + $module = $BAW_CONF['module']; + if ($module == 'drupal') { + $img_url = drupal_get_path('module', 'bawstats'); + } else { + $img_url = $BAW_CONF['site_url']; + } + $img_url .= "/modules/render_map.inc.php?getmap=true$new_data&m=$module"; + $out = "
\"map
"; + baw_debug("rendering map finished"); + return $out; +} + +function baw_render_map_img() { + $data = $_GET['c']; + $module = $_GET['m']; + + // Set headers + header('Expires: Mon, 01 Jan 1997 05:00:00 GMT'); + header('Cache-Control: no-store, no-cache, must-revalidate'); + header('Cache-Control: post-check=0, pre-check=0', false); + header('Pragma: no-cache'); + + header('Content-type: image/png'); + + if ($module == 'drupal') { + $BAW_CONF['site_path'] = drupal_get_path('module', 'bawstats'); + } else { + include_once("./../config.php"); + } + + $im = $BAW_CONF['site_path'] .'/icons/wmap.png'; + if (!file_exists($im)) { + echo "Error!"; + } + $im = imagecreatefrompng($im); + imagealphablending($im, true); + + $mapX = imagesx($im); + $mapY = imagesy($im); + + $dommap = array( + 'uk' => array(266,88), 'au' => array(485,224), 'nz' => array(545,251), + 'be' => array(276,95), 'es' => array(262,116), 'pt' => array(256,117), + 'ad' => array(271,111), 'it' => array(289,111), 'fr' => array(272,103), + 'ie' => array(257,90), 'nl' => array(277,92), 'de' => array(284,94), + 'pl' => array(292,91), 'lu' => array(276,97), 'ch' => array(283,102), + 'at' => array(287,102), 'gr' => array(304,118), 'al' => array(300,114), + 'cs' => array(299,109), 'ba' => array(296,108), 'mk' => array(303,114), + 'bg' => array(307,110), 'ro' => array(309,105), 'hu' => array(300,102), + 'sk' => array(300,99), 'cz' => array(292,97), 'pl' => array(296,91), + 'dk' => array(283,83), 'va' => array(288,112), 'tr' => array(321,117), + 'ua' => array(320,97), 'by' => array(312,88), 'lt' => array(304,86), + 'lv' => array(305,81), 'ee' => array(308,77), 'fi' => array(310,65), + 'se' => array(296,64), 'no' => array(281,72), 'is' => array(241,62), + 'cy' => array(321,125), 'sy' => array(329,125), 'il' => array(325,129), + 'ps' => array(325,130), 'jo' => array(326,132), 'sa' => array(339,142), + 'iq' => array(340,130), 'ir' => array(358,130), 'kw' => array(344,135), + 'bh' => array(348,140), 'qa' => array(350,141), 'ae' => array(355,144), + 'om' => array(358,148), 'ye' => array(345,157), 'eg' => array(316,140), + 'pk' => array(372,135), 'af' => array(368,125), 'tm' => array(364,119), + 'uz' => array(365,111), 'kz' => array(371,97), 'kg' => array(379,112), + 'ti' => array(378,116), 'in' => array(391,152), 'np' => array(402,137), + 'bd' => array(411,143), 'lk' => array(396,171), 'bt' => array(412,137), + 'mm' => array(419,146), 'la' => array(431,151), 'vn' => array(435,149), + 'kh' => array(435,162), 'th' => array(431,159), 'my' => array(430,177), + 'sg' => array(433,180), 'ph' => array(462,162), 'id' => array(459,185), + 'ti' => array(468,197), 'tw' => array(460,144), 'cn' => array(433,120), + 'mm' => array(411,92), 'ru' => array(399,64), 'kr' => array(471,121), + 'kp' => array(469,115), 'jp' => array(490,120), //TODO polynesia + 'gl' => array(204,27), 'ca' => array(103,76), 'us' => array(107,116), + 'bm' => array(160,132), 'mx' => array(108,145), 'cu' => array(145,149), + 'gt' => array(126,156), 'bz' => array(129,155), 'hn' => array(134,160), + 'sv' => array(128,161), 'ni' => array(136,163), 'cr' => array(138,169), + 'pa' => array(145,170), 'co' => array(152,176), 've' => array(165,170), + 'gy' => array(175,174), 'sr' => array(182,177), 'gf' => array(186,177), + 'pe' => array(151,196), 'ec' => array(147,183), 'br' => array(189,197), + 'bo' => array(170,212), 'py' => array(176,218), 'uy' => array(182,235), + 'cl' => array(158,231), 'ar' => array(168,235), 'fk' => array(177,274), + 'ly' => array(293,135), 'tn' => array(284,124), 'dz' => array(174,128), + 'ma' => array(258,130), 'eh' => array(249,139), 'mr' => array(252,152), + 'ml' => array(263,154), 'ne' => array(282,155), 'td' => array(304,158), + 'sd' => array(316,154), 'et' => array(331,165), 'er' => array(330,156), + 'dj' => array(336,162), 'sn' => array(246,159), 'gm' => array(244,160), + 'gw' => array(246,163), 'gn' => array(248,163), 'sl' => array(250,168), + 'lr' => array(255,172), 'ci' => array(260,170), 'gh' => array(267,169), + 'bf' => array(266,163), 'bj' => array(273,176), 'ng' => array(276,167), + 'tg' => array(174,167), 'cm' => array(288,174), 'cf' => array(299,170), + 'so' => array(343,173), 'ke' => array(325,183), 'cd' => array(309,186), + 'ug' => array(319,183), 'rw' => array(319,188), 'bi' => array(319,190), + 'tz' => array(325,194), 'ao' => array(298,200), 'zm' => array(313,204), + 'mz' => array(329,202), 'mw' => array(323,204), 'zw' => array(315,212), + 'bw' => array(305,221), 'na' => array(296,216), 'za' => array(306,230), + 'sz' => array(317,227), 'mg' => array(343,212), 'com' => array(40,158), + 'net' => array(40,188), 'org' => array(40,221), 'info' => array(94,222), + 'ip' => array(94,189), 'mobi'=> array(40,253), 'mobi'=> array(94,253) + ); + + $maxpages = 0; + $maxhits = 0; + $doms = array(); + //var_dump($data); + foreach ($data as $domain => $set) { + $pages = $set[0]; + $hits = $set[1]; + // we use hits here since they are always bigger than pages + if (isset($dommap[$domain]) && ($hits>0)) { + $doms[$domain] = array('pages' => $pages, 'hits' => $hits); + if ($hits > $maxhits) { + $maxhits = $hits; + } + if ($pages > $maxpages) { + $maxpages = $pages; + } + } + } + + $crcblue = $BAW_CONF['site_path'] .'/icons/circ-blue.png'; + $crcblue = @imagecreatefrompng($crcblue); + imagealphablending($crcblue, true); + $crcgreen = $BAW_CONF['site_path'] .'/icons/circ-green.png'; + $crcgreen = @imagecreatefrompng($crcgreen); + imagealphablending($crcgreen, true); + $crcX = imagesx($crcgreen); + $crcY = imagesy($crcgreen); + + $maxcirc = 80; + $mincirc = 2; + + foreach ($doms as $dom => $val) { + $hits = ($val['hits'] / $maxhits); + $scz = $mincirc + ($hits*($maxcirc-$mincirc)); + imagecopyresampled( + $im, + $crcgreen, + $dommap[$dom][0]-1, + $dommap[$dom][1]-($scz/2), + 0, + 0, + $scz/2, + $scz, + $crcX, + $crcY + ); + $pages = ($val['pages'] / $maxpages); + $scz = $mincirc + ($pages*($maxcirc-$mincirc)); + imagecopyresampled( + $im, + $crcblue, + $dommap[$dom][0]-($scz/2), + $dommap[$dom][1]-($scz/2), + 0, + 0, + $scz/2, + $scz, + $crcX, + $crcY + ); + } + //output image to browser + imagepng($im); + imagedestroy($im); +} \ No newline at end of file diff --git a/betterawstats/modules/render_table.inc.php b/betterawstats/modules/render_table.inc.php new file mode 100644 index 0000000..c025bb0 --- /dev/null +++ b/betterawstats/modules/render_table.inc.php @@ -0,0 +1,271 @@ + + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +// this file can't be used on its own +if (strpos ($_SERVER['PHP_SELF'], 'reder_table.inc.php') !== false) { + die ('This file can not be used on its own!'); +} + +// this function generates ratio-calculations for a whole line +// it requires that the format of the data contains +// 'format' => 'layout_ratio', 'ratio' => '2/1' +// it would take the second field and divide it by the first +function baw_calc_ratio($data_set, $ratio_set) { + foreach ($ratio_set as $field => $formula) { + $frm = explode("/", $formula); + $data_set[$field] = $data_set[$frm[0]] / $data_set[$frm[1]]; + } + return $data_set; +} + +// this function does std. processing that this needed in 2 places +function baw_process_cell($cell, $format, $target = null) { + if ($target == null) { + $target = 0; + } + if (is_numeric($cell)) { + if ($format == 'layout_date') { + $target = max($target, $cell); + } else if ($format == 'layout_ratio') { + $target = 0; + } else { + $target += $cell; + } + } else { + $target = ''; + } + return $target; +} + + +function baw_render_table($section_name, $table, $format, $get_avg = false, $get_sum = false, + $top_x = false, $dataformat = false) { + global $BAW_CONF, $BAW_LIB, $BAW_MES, $BAW_CONF_DIS; + baw_debug("rendering table"); + $out = ''; + $theader = "\n\n"; + // HEADER ----------------------------------------------------------------- + $out .= " \n"; + $format_arr = array(); + $column = 0; + $itemcount = count($table); + $ratio_set = array(); + // iterate formats for header + foreach ($format as $cell => $attr) { + $class = ''; + $tags =''; + $percent_header = ''; + // iterate one formats attributes + foreach ($attr as $name => $value){ + if ($name == 'title') { + $data = $value; + } else if ($name == 'format') { + $format_arr[] = $value; + $class_arr[] = $value; + $class = " $value"; + } else if ($name == 'ratio') { + $ratio_set[$cell] = $value; + // percentage header insert ... this could be set per column in the config? + } else if ($name == 'percent' && $value){ + $percent_header = " \n"; + } else if (strlen($value)>0) { + $tags .= " $name=\"$value\""; + } + } + // find out how many items in whole table + if ($column == 0) { // add only to first column + $data = sprintf($BAW_MES['records'], baw_num_format($itemcount)); + } + if (isset($attr['title'])) { + $out .=" \n$percent_header"; + $column ++; + } + } + $out .= " \n"; + + // SUM & averages calculation ---------------------------------------------- + // the sum has to be calculated before so the percentages can be calculated + // iterate all the table and count the sums of all numeric data + $sum_arr = array(0 => $BAW_MES[102]); // we set the text here to make sure its in the right position + $avg_arr = array(0 => $BAW_MES[96]); + $others = array(); + $filled_lines = $itemcount; // get the value for substraction + $row_no = 0; + $othercount = 0; + $hasothers = false; + foreach ($table as $lineid => $row) { + $cell_no = 0; + $rowsum = 0; + foreach ($row as $cell) { + // sum calculation + $sum_arr[$cell_no] = baw_process_cell($cell, @$format_arr[$cell_no] , @$sum_arr[$cell_no]); + // average calculation + if (is_numeric($cell) && $get_avg) { + $rowsum += $cell; + if ($row_no == ($itemcount-1) && $filled_lines >= 1) { // last line, assume sums are done + if ($rowsum == 0 && $cell_no == 0) { // do once again for last line, dont substract further after first cell + $filled_lines--; + } + if ($format_arr[$cell_no] == 'layout_date') { + $avg_arr[$cell_no] = false; // this will prevent formatting, averages on date not possible? + } else { + $avg_arr[$cell_no] = $sum_arr[$cell_no] / $filled_lines; + } + } + } else if ($get_avg) { + $avg_arr[$cell_no] = ''; + } + // others calculation + if ($top_x && ($row_no >= $top_x)) { + $hasothers = true; + $others[$cell_no] = baw_process_cell($cell, @$format_arr[$cell_no] , @$others[$cell_no]); + } + $cell_no ++; + } + // we processes the line, if we are already in the 'others' remove the line + if ($hasothers) { + $othercount ++; + unset($table[$lineid]); + } + // remove one line from avg-count if data empty + if ($rowsum == 0) { + $filled_lines--; + } + $row_no++; // count to find out if we are ready to do averages + } + // add others to the table + if ($hasothers) { // we got others, add them to the end + if ($top_x < $BAW_CONF['maxlines']) { + $text = baw_display_list_link($BAW_MES[2], $BAW_MES[2], $section_name, false, 'full_list') + . " (". baw_num_format($othercount) . ")"; + } else { + $text = $BAW_MES[2] + . " (". baw_num_format($othercount) . ")
" + . sprintf($BAW_MES['table_max_hits_exceed'], baw_num_format($BAW_CONF['maxlines'])); + } + $others = baw_calc_ratio($others, $ratio_set); + $others[0] = $text; + $table += array('layout_others'=> $others); + } + // add averages to the table + if ($get_avg) { + // re-set the value here since it might have been overwritten + $avg_arr[0] = $BAW_MES[96]; + $avg_arr = baw_calc_ratio($avg_arr, $ratio_set); + $table += array('layout_avg' => $avg_arr); + } + // add the sum to the table + if ($get_sum) { + $sum_arr[0] = $BAW_MES[102]; + $sum_arr = baw_calc_ratio($sum_arr, $ratio_set); + $table += array('layout_sum' => $sum_arr); + } + + // these are set later to make sure they are not overwritten in the func before + // this saves one more check + + // DATA -------------------------------------------------------------------- + $lastlineid = ''; + $rowspan = array(); + foreach ($table as $lineid => $row) { + $cell_no = 0; + $class = ''; + // get the class for the whole row + if (isset($dataformat[$lineid])) { + $class = " class=\"{$dataformat[$lineid]}\""; + // for some _STRANGE_ reason, the 403-error lineid is equal to the string here, so use === + } else if ($lineid === 'layout_others' || $lineid === 'layout_avg' || $lineid === 'layout_sum') { + $class = " class=\"$lineid\""; + } + $out .= " \n"; + $iteration = 0; + foreach ($row as $cell) { + $class = ''; // get the class for the column (set by field) + // for some _STRANGE_ reason, the 403-error lineid is equal to the string here, so use === + if ($lineid === 'layout_others' || $lineid === 'layout_avg' || $lineid === 'layout_sum') { + $span = 0; + $attr = ''; + if ($cell_no > $iteration) { + $iteration ++; + continue; + } + if (isset($format[$cell_no]['colspan'])) { + $span = $format[$cell_no]['colspan']; + $class .= " colspan=\"$span\""; + $span --; + $cell_no += $span; + } + $iteration ++; + } else { + $class = ''; + } + // check if the row has data, otherwise remove 1 line for average count + $function = $BAW_LIB['formats'][$format_arr[$cell_no]]['frm']; + $cell_str = exec_function($function, $cell); + if (isset($class_arr[$cell_no]) && strlen($class_arr[$cell_no]) > 0) { + $class .= " class=\"{$class_arr[$cell_no]}\""; + } + // do rowspan + $doline = true; + $rowspan_str = ''; + if (($format_arr[$cell_no] === 'layout_text') && + ($lineid !== 'layout_others' && $lineid !== 'layout_avg' && $lineid !== 'layout_sum')) { + if (isset($table[$lastlineid][$cell_no]) && $cell === $table[$lastlineid][$cell_no]) { + $rowspan[$lineid][$cell_no] = $rowspan[$lastlineid][$cell_no] + 1; + $search = " rowspan=\"{$rowspan[$lastlineid][$cell_no]}\">$cell_str"; + $replace = " rowspan=\"{$rowspan[$lineid][$cell_no]}\">$cell_str"; + // we search the last time we had this data and replace it + $pos = strrpos($out, $search); + $out = substr_replace($out, $replace, $pos, strlen($search)); + $doline = false; + } else { // no match, restart with 1 + $rowspan_str = ' rowspan="1"'; // do =1 always so we can replace later + $rowspan[$lineid][$cell_no] = 1; + } + } + if ($doline) { + $out .= " $cell_str\n"; + } + if (isset($format[$cell_no]['percent']) && + $format[$cell_no]['percent'] == true && + $sum_arr[$cell_no] !== 0) { + $percent = $cell / ($sum_arr[$cell_no] / 100); + $out .=" " . @baw_percent_format($percent) . "\n"; + } + $cell_no ++; + } + $lastlineid = $lineid; + $out .= " \n"; + } + $out .= "
{$BAW_MES[15]}$data
\n"; + baw_debug("rendering table finished"); + return $theader . $out; +} + +?> \ No newline at end of file diff --git a/betterawstats/scripts.js b/betterawstats/scripts.js new file mode 100644 index 0000000..7d9522a --- /dev/null +++ b/betterawstats/scripts.js @@ -0,0 +1,51 @@ +/** + * betterawstats - an alternative display for awstats data + * + * @author Oliver Spiesshofer, support at betterawstats dot com + * @copyright 2008 Oliver Spiesshofer + * @version 1.0 + * @link http://betterawstats.com + + * Based on the GPL AWStats Totals script by: + * Jeroen de Jong + * copyright 2004-2006 Telartis + * version 1.13 (http://www.telartis.nl/xcms/awstats) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +function hideElement(element) { + document.getElementById('box_' + element).style.display = 'none'; + document.getElementById('button_show_' + element).style.display = ''; + document.getElementById('button_hide_' + element).style.display = 'none'; +} + +function showElement(element) { + document.getElementById('box_' + element).style.display = ''; + document.getElementById('button_hide_' + element).style.display = ''; + document.getElementById('button_show_' + element).style.display = 'none'; +} + +function toggleBox(element, group, count, layout) { + for (i=0; iBdm-RXl&;@3^ce z_}j@bxO#iB!cd5+yQ@)Cxd}&{{pf$R89zU99(~q!jCZu)bpIi|I5>hcufL5q`yR({ zdOPv6GcUkl?LhDD@8HB!BdD$@$H}K9j19REIe8wDmtVv2#}DARwHdyi9-KY>L%cCM zh~$73ho5)?V}pm$U9|y6oh~#~SEKayGQ4^2w>T}G#Q44k;p^OkS8VM_3_ga~@o~KV z-5|oFE}R+Y$7@G@P`Lj0oWGoR&Wn!46ZndpKxQW2Ls#XY9XrZr9XV?%c9bsNw3ZGF zEEdZeOKE9sWBI1#6hT^p(wfa1w{246G;^?H$!*y>^4EwUA2m1KwsGZV8p6RBT4rfu z)(Q(FIdllIY~Hv+WojlFn^%g&&oBH@<U>E3#`Qq+O5nw1j1>TK z=~ceS6Yp6wQAddPwh*t_<)@05K?b~DP4USgCMPGUML;Y>C`D6zYHJhDFN2txCGXsI z_-*z6S=-oWk|e*>mv$I0y7u_}^$(N`^u$Ef0-tY7|X$Z0qli%gcX7;SOe4_N1K=_%muv{)wl#g;1 zxznh~&?#5Ey7wmmotFps@npsnp?or#ajtwaBe!Z&XT5Mq_vF+^nI7e`Nl~tBUAQ)* z|9#I*>WO%l%sH5u-oo9~0Eq~+Ho)D~#Bmect<*$-2ofP8OvJ2BaJ05EMp#=BAc91g zm>{A=#7<4bh&a*OYUO9U6>dTz0z^<~_9syyM#LRf^6ZQgb~|Hs1c@jSci53|({?xz zbvrnApvme+lidv~;dZzYa=Q^DB9a?XB2GwdiME6o5e`rj2_onYARq-WL4*PUM2UDX zfTTbuz<3an6ht5p)* zg0zXiL>wU^7>OfHM2SQ^jwF#HrV`{y3B&_LkO(D^5C|s_h$Ik-CXh@dkRqm%B9>%~ zm`EZ?1R~T#Fq$MciAXGo>6GxLxQ`UqoI)tZF_998rw~u1kVw*(qD@Q@(*jc|gyU1> zOkqkOF@<EbQd8s*scC9rdK!v=GL5Neg*M--0^&Wph%e*}#G62zrMxItPoV4G zRVzzcuG-g(9yCx)H*CJft(rbren<;1GjEws73S%ZI)x(#v+2 zZ!9XfQ^XrJQrjTqk>7$7E{{Pydk@)WceGqo4-|Fx3_=9&-5XY>sB*o!m_M4R5x{Wba)O* z@-fY+%`B*@tjVkG?tZLGJ|JmRrv0;ezom0P7`Cxl*VlZ&cfi7Oxlrv>l$kz7W}o6^ z>rCkW%^qb=pK|<#NnQC&pECS;`jj%hi#mz)|9g0s(zr$z`;^5#WwB5B`t?8JHNY3t zVxRIg|D5`4+wT(c*{Ec-l;l8{m2>ZB%&0XOz%SEvg=!D+|E4K1=ri=}7xVJ-m$xoN z_NmQEtwuKry1Dr90tqe~o1+$k-XO~7-$_8Yp>E9R@LwBuG&>mR8&x)?!a1C zH~al~xS>(~s%mIxY+P;3%v+t8nO9P>Vci{fL+Czd03t=BIpsmw7}?(6Z7tSc@qE-KijvgTcn z6L#V6$};FztumPE_q2Qb4HetCg9ep9?{VNcm9OVT&>M1hvi|WStw--KE}CiAuT8M2 zj;?IIL4WJ|%AM^!{+G@^|Kl!m#r-1S6N{ZIYA4S1O`CP2eX4lrl0SnAz%cBOJE~~VD&%W;7{v(zn;~r67ySV8!iOlqJWVuGC)0ORP zs;aB&9`7IT>l1wK?Bt;t7I&j|`RbCovUR$fD@&^C_U`TI>($DqtMUG-9G|vlbu72& zkzL)?)V-^_!{a$9_BAwnnDdTRq_pU;y1J>y)6>y?#Ajndy1Z6z{&RncF|W4cv5vjx zx_B&yw3{-YHpjEShL>BrV%(g1Q|3e$9{RMKvM_0GbauCMor~kI=m}`Qq^Z4-Xoo~k z^abfFg<8FjjGDfr(=>m%6Z53JoQwJcF(+{e7!{g-7EtwDz}7Bc;h%+S zskZ{Pf}hsI>_S2^* Ymojrzec7mKMLDP1it_%9R=z;}AMc~#JOBUy literal 0 HcmV?d00001 diff --git a/httpd.conf b/httpd.conf new file mode 100644 index 0000000..fa70268 --- /dev/null +++ b/httpd.conf @@ -0,0 +1,17 @@ + + ServerName stats.izideal.com + DocumentRoot /home/www/stats/ + Alias /icon/ /usr/share/awstats/icon/ + ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ + Include /home/www/izideal/share/apache/include/auth + Timeout 120 + + Order deny,allow + Deny from all + require group stats + Satisfy any + + + SSLEnable + + diff --git a/index.php b/index.php new file mode 100644 index 0000000..60545c9 --- /dev/null +++ b/index.php @@ -0,0 +1,95 @@ + + + + + <?=$glob['title']?> + + + +'; + exit; +} +echo ''; +if ($glob['page']=='menu') { + menu(); +} +echo ''; +exit; +?> + + '; +if ($glob['config']) { + echo ''; +} else { + echo ''; +} +echo ''; +} + +function menu() { + global $sites,$glob; +?> + Home + + Betterawstats + diff --git a/jawstats-config.php b/jawstats-config.php new file mode 100755 index 0000000..e4efdbb --- /dev/null +++ b/jawstats-config.php @@ -0,0 +1,56 @@ +'; + if(!ereg('^awstats\.(.*)\.conf$',$f,$e)) continue; + #echo $glob['dir_conf']."/$f:".$e[1].'
'; + $content = file_get_contents($glob['dir_conf']."/$f"); + #echo $content; + if (!preg_match('/DirData="([^"]+)/',$content,$data_dir)) continue; $data_dir = $data_dir[1]; + if (!preg_match('/SiteDomain="([^"]+)/',$content,$site)) continue; $site = $site[1]; + if (!file_exists($data_dir)) continue; + #echo $site.":".$data_dir.'
'; + $aConfig[$site] = array( + "statspath" => "$data_dir/", + #"updatepath" => "/path/to/awstats.pl/", + "siteurl" => "http://$site", + "theme" => "default", + "fadespeed" => 250, + #"password" => "my-1st-password", + #"includes" => "" + ); + } +} +return; + + // individual site configuration + $aConfig["site1"] = array( + "statspath" => "/path/to/data/", + "updatepath" => "/path/to/awstats.pl/", + "siteurl" => "http://www.my-1st-domain.com", + "theme" => "default", + "fadespeed" => 250, + "password" => "my-1st-password", + "includes" => "" + ); + + $aConfig["site2"] = array( + "statspath" => "/path/to/data/", + "updatepath" => "/path/to/awstats.pl/", + "siteurl" => "http://www.my-2nd-domain.com", + "theme" => "default", + "fadespeed" => 250, + "password" => "my-2nd-password", + "includes" => "" + ); + +?> diff --git a/jawstats/clsAWStats.php b/jawstats/clsAWStats.php new file mode 100755 index 0000000..e73cf0b --- /dev/null +++ b/jawstats/clsAWStats.php @@ -0,0 +1,631 @@ +iYear = date("Y", $dtDate); + $this->iMonth = date("n", $dtDate); + + // load data + $sFilePath .= "awstats"; + if ($this->iMonth < 10) { + $sFilePath .= "0"; + } + $sFilePath .= ($this->iMonth . $this->iYear . "." . $sStatName . ".txt"); + if (is_readable($sFilePath)) { + $this->sAWStats = htmlspecialchars(file_get_contents($sFilePath)); + $this->bLoaded = true; + } + + // get summary data + $arrData = $this->GetSection("GENERAL"); + $sLastUpdate = $this->GetSummaryElement($arrData, "lastupdate", 1); + $this->dtLastUpdate = strtotime($this->GetSummaryElement($arrData, "lastupdate", 1)); + $this->dtLastUpdate = mktime(abs(substr($sLastUpdate, 8, 2)), + abs(substr($sLastUpdate, 10, 2)), + abs(substr($sLastUpdate, 12, 2)), + abs(substr($sLastUpdate, 4, 2)), + abs(substr($sLastUpdate, 6, 2)), + abs(substr($sLastUpdate, 0, 4))); + $this->iTotalVisits = $this->GetSummaryElement($arrData, "totalvisits", 1); + $this->iTotalUnique = $this->GetSummaryElement($arrData, "totalunique", 1); + + // populate label array + $this->arrLabel["BROWSER"] = array("id", "hits"); + $this->arrLabel["DAY"] = array("date", "pages", "hits", "bw", "visits"); + $this->arrLabel["DOMAIN"] = array("id", "pages", "hits", "bw"); + $this->arrLabel["ERRORS"] = array("id", "hits", "bw"); + $this->arrLabel["FILETYPES"] = array("id", "hits", "bw", "noncompressedbw", "compressedbw"); + $this->arrLabel["KEYWORDS"] = array("word", "freq"); + $this->arrLabel["OS"] = array("id", "hits"); + $this->arrLabel["PAGEREFS"] = array("url", "pages", "hits"); + $this->arrLabel["ROBOT"] = array("id", "hits", "bw", "lastvisit", "robotstxt"); + $this->arrLabel["SEARCHWORDS"] = array("phrase", "freq"); + $this->arrLabel["SEREFERRALS"] = array("id", "pages", "hits"); + $this->arrLabel["SESSION"] = array("range", "freq"); + $this->arrLabel["SIDER"] = array("url", "pages", "bw", "entry", "exit"); + $this->arrLabel["SIDER_404"] = array("url", "hits", "referrer"); + $this->arrLabel["TIME"] = array("hour", "pages", "hits", "bw", "notviewedpages", "notviewedhits", "notviewedbw"); + } + + function CreateJSON($sSection) { + echo json_encode($this->GetSection($sSection)); + } + + function CreatePagesXMLString() { + // produce xml + $aXML = array(); + $aData = $this->GetSection("SIDER"); + + // count totals + $iTotalPages = 0; + $iTotalBW = 0; + $iTotalEntry = 0; + $iTotalExit = 0; + for ($iIndexItem = 0; $iIndexItem < count($aData); $iIndexItem++) { + $aData[$iIndexItem][1] = abs($aData[$iIndexItem][1]); + $aData[$iIndexItem][2] = abs($aData[$iIndexItem][2]); + $aData[$iIndexItem][3] = abs($aData[$iIndexItem][3]); + $aData[$iIndexItem][4] = abs($aData[$iIndexItem][4]); + + $iTotalPages += $aData[$iIndexItem][1]; + $iTotalBW += $aData[$iIndexItem][2]; + $iTotalEntry += $aData[$iIndexItem][3]; + $iTotalExit += $aData[$iIndexItem][4]; + } + + // define size + $iSize = 50; + + // last update and totals + $aXML[] = ("dtLastUpdate . "\" />\n" . + "\n"); + + // sort by page views + usort($aData, "Sort1"); + $aXML[] = ""; + for ($iIndexItem = 0; $iIndexItem < count($aData); $iIndexItem++) { + $sTemp = ""; + for ($iIndexAttr = 0; $iIndexAttr < count($aData[$iIndexItem]); $iIndexAttr++) { + $sTemp .= $this->arrLabel["SIDER"][$iIndexAttr] . "=\"" . trim($aData[$iIndexItem][$iIndexAttr]) . "\" "; + } + $aXML[] = ("\n"); + if ($iIndexItem > $iSize) { + break; + } + } + $aXML[] = "\n"; + + // sort by bandwidth + usort($aData, "Sort2"); + $aXML[] = ""; + for ($iIndexItem = 0; $iIndexItem < count($aData); $iIndexItem++) { + $sTemp = ""; + for ($iIndexAttr = 0; $iIndexAttr < count($aData[$iIndexItem]); $iIndexAttr++) { + $sTemp .= $this->arrLabel["SIDER"][$iIndexAttr] . "=\"" . trim($aData[$iIndexItem][$iIndexAttr]) . "\" "; + } + $aXML[] = ("\n"); + if ($iIndexItem > $iSize) { + break; + } + } + $aXML[] = "\n"; + + // sort by bandwidth + usort($aData, "Sort3"); + $aXML[] = ""; + for ($iIndexItem = 0; $iIndexItem < count($aData); $iIndexItem++) { + $sTemp = ""; + for ($iIndexAttr = 0; $iIndexAttr < count($aData[$iIndexItem]); $iIndexAttr++) { + $sTemp .= $this->arrLabel["SIDER"][$iIndexAttr] . "=\"" . trim($aData[$iIndexItem][$iIndexAttr]) . "\" "; + } + $aXML[] = ("\n"); + if ($iIndexItem > $iSize) { + break; + } + } + $aXML[] = "\n"; + + // sort by bandwidth + usort($aData, "Sort4"); + $aXML[] = ""; + for ($iIndexItem = 0; $iIndexItem < count($aData); $iIndexItem++) { + $sTemp = ""; + for ($iIndexAttr = 0; $iIndexAttr < count($aData[$iIndexItem]); $iIndexAttr++) { + $sTemp .= $this->arrLabel["SIDER"][$iIndexAttr] . "=\"" . trim($aData[$iIndexItem][$iIndexAttr]) . "\" "; + } + $aXML[] = ("\n"); + if ($iIndexItem > $iSize) { + break; + } + } + $aXML[] = "\n"; + + // return + return implode($aXML, ""); + } + + function CreateXMLString($sSection) { + // produce xml + $aXML = array(); + $arrData = $this->GetSection($sSection); + $aXML[] = "dtLastUpdate . "\" />\n\n"; + for ($iIndexItem = 0; $iIndexItem < count($arrData); $iIndexItem++) { + $sTemp = ""; + for ($iIndexAttr = 0; $iIndexAttr < count($arrData[$iIndexItem]); $iIndexAttr++) { + $sTemp .= $this->arrLabel[$sSection][$iIndexAttr] . "=\"" . htmlspecialchars(urldecode(trim($arrData[$iIndexItem][$iIndexAttr]))) . "\" "; + } + $aXML[] = ("\n"); + } + $aXML[] = "\n"; + return implode("", $aXML); + } + + function GetSection($sSection) { + $iStartPos = strpos($this->sAWStats, ("\nBEGIN_" . $sSection . " ")); + $iEndPos = strpos($this->sAWStats, ("\nEND_" . $sSection), $iStartPos); + $arrStat = explode("\n", substr($this->sAWStats, ($iStartPos + 1), ($iEndPos - $iStartPos - 1))); + for ($iIndex = 1; $iIndex < count($arrStat); $iIndex++) { + $arrData[] = split(' ', $arrStat[$iIndex]); + } + return $arrData; + } + + function GetSummaryElement($arrData, $sLabel, $iElementID) { + for ($iIndex = 1; $iIndex < count($arrData); $iIndex++) { + if (strtolower($arrData[$iIndex][0]) == $sLabel) { + return $arrData[$iIndex][$iElementID]; + } + } + } + + function OutputXML($sXML) { + header("content-type: text/xml"); + echo "\n" . + "\n" . $sXML . ""; + } + } + + function DrawFooter() { + $aString = explode("_", str_replace("]", "]_", str_replace("[", "_[", Lang("Powered by [AWSTART]AWStats[END]. Made beautiful by [JAWSTART]JAWStats Web Statistics and Analytics[END].")))); + for ($i = 0; $i 0) && (substr($aString[$i], 0, 1) != "[") && (substr($aString[$i + 1], 0, 5) != "[END]")) { + $aString[$i] = ("" . $aString[$i] . ""); + } else { + switch ($aString[$i]) { + case "[AWSTART]": + $aString[$i] = ""; + break; + case "[END]": + $aString[$i] = ""; + break; + case "[JAWSTART]": + $aString[$i] = ""; + break; + } + } + } + return implode($aString); + } + + function DrawHeader($dtDate) { + $aString = explode("_", str_replace("]", "]_", str_replace("[", "_[", Lang("Statistics for [SITE] in [MONTH] [YEAR]")))); + for ($i = 0; $i 0) && (substr($aString[$i], 0, 1) != "[")) { + $aString[$i] = ("" . $aString[$i] . ""); + } else { + switch ($aString[$i]) { + case "[MONTH]": + $aString[$i] = Lang(date("F", $dtDate)); + break; + case "[SITE]": + $aString[$i] = (GetSiteName() . ""); + break; + case "[YEAR]": + $aString[$i] = date("Y", $dtDate); + break; + } + } + } + return ("

" . implode($aString) . "

"); + } + + function ElapsedTime($iSeconds) { + if ($GLOBALS["g_iThisLog"] == 0) { + if ($iSeconds < 60) { + return (" (<" . Lang("1 min ago") . ")"); + } + $iMinutes = floor($iSeconds / 60); + if ($iMinutes < 60) { + if ($iMinutes == 1) { + return (" (" . Lang("1 min ago") . ")"); + } else { + return (" (" . str_replace("[MINUTES]", $iMinutes, Lang("[MINUTES] mins ago")) . ")"); + } + } + $iHours = floor($iMinutes / 60); + if ($iHours < 24) { + $iMinutes = ($iMinutes - ($iHours * 60)); + return (" (" . str_replace("[HOURS]", $iHours, str_replace("[MINUTES]", $iMinutes, Lang("[HOURS]h [MINUTES]m ago"))) . ")"); + } + $iDays = floor($iHours / 24); + if ($iDays == 1) { + return (" (" . Lang("1 day ago") . ")"); + } else { + return (" (" . str_replace("[DAYS]", $iDays, Lang("[DAYS] days ago")) . ")"); + } + } + } + + function GetConfig() { + // check config(s) exists + if (count($GLOBALS["aConfig"]) < 1) { + Error("BadConfigNoSites"); + } + + // check this site config exists + if ((isset($_GET["config"]) == true) && (isset($GLOBALS["aConfig"][$_GET["config"]]) == true)) { + $sConfig = $_GET["config"]; + } else { + $sConfig = key($GLOBALS["aConfig"]); + } + + // validate settings + if ((isset($GLOBALS["aConfig"][$sConfig]["staticxml"]) != true) || (is_bool($GLOBALS["aConfig"][$sConfig]["staticxml"]) != true)) { + $GLOBALS["aConfig"][$sConfig]["staticxml"] = false; + } + + // return + return $sConfig; + } + + function GetLogList($sStatsName, $sFilePath) { + if ($oDir = opendir($sFilePath)) { + // load available dates into array and sort by date + while (($oItem = readdir($oDir)) !== false) { + if ((substr($oItem, 0, 7) == "awstats") && + (substr($oItem, 14) == ($sStatsName . ".txt"))) { + $aTemp[] = mktime(0, 0, 0, intval(substr($oItem, 7, 2)), 1, intval(substr($oItem, 9, 4))); + } + } + if (count($aTemp) < 1) { + Error("NoLogsFound", $GLOBALS["g_sConfig"]); + } + if (count($aTemp) > 1) { + rsort($aTemp); + } + + // find first & last dates + $dtLatest = $aTemp[0]; + $dtEarliest = $aTemp[count($aTemp) - 1]; + + // create full array of all potential dates + $aMonths = array(); + $dtLoop = $dtLatest; + while ($dtLoop >= $dtEarliest) { + $bFound = false; + for ($iIndex = 0; $iIndex < count($aTemp); $iIndex++) { + if ($aTemp[$iIndex] == $dtLoop) { + $bFound = true; + array_splice($aTemp, $iIndex, 1); + break; + } + } + array_push($aMonths, array($dtLoop, $bFound)); + $dtLoop = mktime(0, 0, 0, (date("n", $dtLoop) - 1), 1, date("Y", $dtLoop)); + } + } else { + Error("CannotOpenLog"); + } + return $aMonths; + } + + function GetSiteName() { + if ((isset($GLOBALS["g_aConfig"]["sitename"]) == true) && (strlen($GLOBALS["g_aConfig"]["sitename"]) > 0)) { + return $GLOBALS["g_aConfig"]["sitename"]; + } else { + return $GLOBALS["g_aConfig"]["siteurl"]; + } + } + + function SetTranslation() { + function FindTranslation($sCode) { + $sCode = strtolower($sCode); + if ($sCode == "en-gb") { + return true; + } + for ($i = 0; $i < count($GLOBALS["g_aTranslation"]); $i++) { + if (strtolower($GLOBALS["g_aTranslation"][$i]["code"]) == $sCode) { + $GLOBALS["g_aCurrentTranslation"] = $GLOBALS["g_aTranslation"][$i]["translations"]; + return true; + } + } + return false; + } + + // check for existence of querystring + if ((isset($_GET["lang"]) == true) && (FindTranslation($_GET["lang"]) == true)) { + return $_GET["lang"]; + } + // check for existence of site config + if ((isset($GLOBALS["g_aConfig"]["language"]) == true) && (FindTranslation($GLOBALS["g_aConfig"]["language"]) == true)) { + return $GLOBALS["g_aConfig"]["language"]; + } + // check for existence of global config + if ((isset($GLOBALS["sDefaultLanguage"]) == true) && (FindTranslation($GLOBALS["sDefaultLanguage"]) == true)) { + return $GLOBALS["sDefaultLanguage"]; + } + return "en-gb"; + } + + function Sort1($a, $b) { + if ($a[1] == $b[1]) { return 0; } + return ($a[1] > $b[1]) ? -1 : 1; + } + + function Sort2($a, $b) { + if ($a[2] == $b[2]) { return 0; } + return ($a[2] > $b[2]) ? -1 : 1; + } + + function Sort3($a, $b) { + if ($a[3] == $b[3]) { return 0; } + return ($a[3] > $b[3]) ? -1 : 1; + } + + function Sort4($a, $b) { + if ($a[4] == $b[4]) { return 0; } + return ($a[4] > $b[4]) ? -1 : 1; + } + + function ToolChangeLanguage() { + if (count($GLOBALS["g_aTranslation"]) < 1) { + return ""; + } + + function LanguageSort($a, $b) { + return ($a["name"] < $b["name"]) ? -1 : 1; + } + + // create html + $aHTML = array(); + $aHTML[] = "
\n
"; + $aHTML[] = "

" . Lang("Please select your language") . "(" . Lang("Cancel") . ")

"; + $aHTML[] = "\n\n\n\n
    "; + + // copy array + array_push($GLOBALS["g_aTranslation"], array("code" => "en-gb", "name" => "English", "translations" => array())); + usort($GLOBALS["g_aTranslation"], "LanguageSort"); + + // loop through sites + $iColA = ceil(count($GLOBALS["g_aTranslation"]) / 3); + $iColB = ceil((count($GLOBALS["g_aTranslation"]) - $iColA) / 2) + $iColA; + for ($i = 0; $i < count($GLOBALS["g_aTranslation"]); $i++) { + $sCSS = ""; + if ($GLOBALS["g_aTranslation"][$i]["code"] == $GLOBALS["sLanguageCode"]) { + $sCSS = " class=\"selected\""; + } + $aHTML[] = "" . $GLOBALS["g_aTranslation"][$i]["name"] . ""; + if ((($i + 1) == $iColA) || (($i + 1) == $iColB)) { + $aHTML[] = "
\n
    "; + if (count($GLOBALS["g_aTranslation"]) == $i) { + $aHTML[] = "
  •  
  • "; + } + } + } + + // close html + $aHTML[] = "
\n
"; + $aHTML[] = "
"; + + return implode($aHTML, "\n"); + } + + function ToolChangeMonth() { + $aHTML = array(); + $aHTML[] = "
\n
"; + $aHTML[] = "

" . Lang("Please select the month you wish to view") . "(" . Lang("Cancel") . ")

"; + $aHTML[] = ""; + + //loop through years + for ($iYear = date("Y", $GLOBALS["g_aLogFiles"][0][0]); $iYear >= date("Y", $GLOBALS["g_aLogFiles"][count($GLOBALS["g_aLogFiles"]) - 1][0]); $iYear--) { + $aHTML[] = "\n"; + + // loop through months + for ($iMonth = 1; $iMonth < 13; $iMonth++) { + $dtTemp = mktime(0, 0, 0, $iMonth, 1, $iYear); + $bExists = false; + foreach ($GLOBALS["g_aLogFiles"] as $aLog) { + if (($aLog[0] == $dtTemp) && ($aLog[1] == true)) { + $bExists = true; + break; + } + } + if ($bExists == true) { + $sCSS = ""; + if ((date("n", $GLOBALS["g_aLogFiles"][$GLOBALS["g_iThisLog"]][0]) == $iMonth) && (date("Y", $GLOBALS["g_aLogFiles"][$GLOBALS["g_iThisLog"]][0]) == $iYear)) { + $sCSS .= " selected"; + } + $aHTML[] = ""; + } else { + if ($dtTemp > time()) { + $aHTML[] = ""; + } else { + $aHTML[] = ""; + } + } + } + $aHTML[] = ""; + } + $aHTML[] = "
" . $iYear . ":" . Lang(date("F", $dtTemp)) . " " . Lang(date("F", $dtTemp)) . "
"; + $aHTML[] = "
"; + + return implode($aHTML, "\n"); + } + + function ToolChangeSite() { + if (($GLOBALS["bConfigChangeSites"] != true) || (count($GLOBALS["aConfig"]) < 2)) { + return ""; + } + + // create html + $aHTML = array(); + $aHTML[] = "
\n
"; + $aHTML[] = "

" . Lang("Please select the site you wish to view") . "(" . Lang("Cancel") . ")

"; + $aHTML[] = "\n\n\n\n
    "; + + // loop through sites + $i = 0; + $iColA = ceil(count($GLOBALS["aConfig"]) / 3); + $iColB = ceil((count($GLOBALS["aConfig"]) - $iColA) / 2) + $iColA; + foreach ($GLOBALS["aConfig"] as $sSiteCode => $aSite) { + $sCSS = ""; + if ($GLOBALS["g_sConfig"] == $sSiteCode) { + $sCSS = " class=\"selected\""; + } + $aHTML[] = "" . + (((isset($aSite["sitename"]) == true) && (strlen(trim($aSite["sitename"])) > 0)) ? $aSite["sitename"] : $aSite["siteurl"]) . ""; + $i++; + if (($i == $iColA) || ($i == $iColB)) { + $aHTML[] = "
\n
    "; + if (count($GLOBALS["aConfig"]) == 2) { + $aHTML[] = "
  •  
  • "; + } + } + } + + // close html + $aHTML[] = "
\n
"; + $aHTML[] = "
"; + + return implode($aHTML, "\n"); + } + + function ToolUpdateSite() { + if ($GLOBALS["bConfigUpdateSites"] != true) { + return ""; + } + + // create html + $aHTML = array(); + $aHTML[] = "
\n
"; + $aHTML[] = "

" . Lang("Please enter the password to update this site") . "(" . Lang("Cancel") . ")

\n
"; + $aHTML[] = ""; + $aHTML[] = ""; + $aHTML[] = "
\n
\n
"; + return implode($aHTML, "\n"); + } + + function ValidateConfig() { + // core values + if (ValidateView($GLOBALS["sConfigDefaultView"]) != true) { + Error("BadConfig", "sConfigDefaultView"); + } + if (is_bool($GLOBALS["bConfigChangeSites"]) != true) { + Error("BadConfig", "bConfigChangeSites"); + } + if (is_bool($GLOBALS["bConfigUpdateSites"]) != true) { + Error("BadConfig", "bConfigUpdateSites"); + } + } + + function ValidateDate($iYear, $iMonth) { + $iYear = intval($iYear); + $iMonth = intval($iMonth); + if (($iYear < 2000) || ($iYear > date("Y"))) { + $iYear = intval(date("Y")); + } + if (($iMonth < 1) || ($iMonth > 12)) { + $iMonth = intval(date("n")); + } + return mktime(0, 0, 0, $iMonth, 1, $iYear); + } + + function ValidateView($sView) { + $bValid = false; + switch ($sView) { + case "allmonths.all": + case "browser.all": + case "browser.family": + case "country.Africa": + case "country.all": + case "country.Asia": + case "country.continent": + case "country.Europe": + case "country.North America": + case "country.Oceania": + case "country.Other": + case "country.South America": + case "filetypes": + case "os.all": + case "os.family": + case "pagerefs.all": + case "pagerefs.domains": + case "pagerefs.se": + case "pagerefs.top10": + case "pagerefs.top50": + case "pages.topPages": + case "pages.topBW": + case "pages.topEntry": + case "pages.topExit": + case "robots": + case "searches.keywordcloud": + case "searches.keywords": + case "searches.keyphrasecloud": + case "searches.keyphrases": + case "session": + case "status": + case "status.404": + case "thismonth.all"; + case "thismonth.bandwidth": + case "thismonth.hits": + case "thismonth.pages": + case "thismonth.visits": + case "time"; + $bValid = true; + break; + } + return $bValid; + } + +?> \ No newline at end of file diff --git a/jawstats/config.dist.php b/jawstats/config.dist.php new file mode 100755 index 0000000..a9bcc84 --- /dev/null +++ b/jawstats/config.dist.php @@ -0,0 +1,35 @@ + "/path/to/data/", + "updatepath" => "/path/to/awstats.pl/", + "siteurl" => "http://www.my-1st-domain.com", + "sitename" => "", + "theme" => "default", + "fadespeed" => 250, + "password" => "my-1st-password", + "includes" => "", + "language" => "en-gb" + ); + + $aConfig["site2"] = array( + "statspath" => "/path/to/data/", + "updatepath" => "/path/to/awstats.pl/", + "siteurl" => "http://www.my-2nd-domain.com", + "sitename" => "", + "theme" => "default", + "fadespeed" => 250, + "password" => "my-2nd-password", + "includes" => "", + "language" => "en-gb" + ); + +?> diff --git a/jawstats/config.php b/jawstats/config.php new file mode 120000 index 0000000..665b9bc --- /dev/null +++ b/jawstats/config.php @@ -0,0 +1 @@ +../jawstats-config.php \ No newline at end of file diff --git a/jawstats/index.php b/jawstats/index.php new file mode 100755 index 0000000..418684d --- /dev/null +++ b/jawstats/index.php @@ -0,0 +1,362 @@ + 0)) { + $aIncludes = explode(",", $g_aConfig["includes"]); + foreach ($aIncludes as $sInclude) { + include $sInclude; + } + } + + // get date range and valid log file + $g_dtStatsMonth = ValidateDate($_GET["year"], $_GET["month"]); + $g_aLogFiles = GetLogList($g_sConfig, $g_aConfig["statspath"]); + $g_iThisLog = -1; + for ($iIndex = 0; $iIndex < count($g_aLogFiles); $iIndex++) { + if (($g_dtStatsMonth == $g_aLogFiles[$iIndex][0]) && ($g_aLogFiles[$iIndex][1] == true)) { + $g_iThisLog = $iIndex; + break; + } + } + if ($g_iThisLog < 0) { + if (count($g_aLogFiles) > 0) { + $g_iThisLog = 0; + } else { + Error("NoLogsFound"); + } + } + + // validate current view + if (ValidateView($_GET["view"]) == true) { + $sCurrentView = $_GET["view"]; + } else { + $sCurrentView = $sConfigDefaultView; + } + + // create class + $clsAWStats = new clsAWStats($g_sConfig, + $g_aConfig["statspath"], + date("Y", $g_aLogFiles[$g_iThisLog][0]), + date("n", $g_aLogFiles[$g_iThisLog][0])); + if ($clsAWStats->bLoaded != true) { + Error("CannotOpenLog"); + } + + // days in month + if (($clsAWStats->iYear == date("Y")) && ($clsAWStats->iMonth == date("n"))) { + $iDaysInMonth = abs(date("s", $clsAWStats->dtLastUpdate)); + $iDaysInMonth += (abs(date("i", $clsAWStats->dtLastUpdate)) * 60); + $iDaysInMonth += (abs(date("H", $clsAWStats->dtLastUpdate)) * 60 * 60); + $iDaysInMonth = abs(date("j", $clsAWStats->dtLastUpdate) - 1) + ($iDaysInMonth / (60 * 60 * 24)); + } else { + $iDaysInMonth = date("d", mktime (0, 0, 0, date("n", $clsAWStats->dtLastUpdate), 0, date("Y", $clsAWStats->dtLastUpdate))); + } + + // start of the month + $dtStartOfMonth = mktime(0, 0, 0, $clsAWStats->iMonth, 1, $clsAWStats->iYear); + $iDailyVisitAvg = ($clsAWStats->iTotalVisits / $iDaysInMonth); + $iDailyUniqueAvg = ($clsAWStats->iTotalUnique / $iDaysInMonth); + +?> + + + + + <?php echo str_replace("[SITE]", GetSiteName(), str_replace("[MONTH]", Lang(date("F", $g_aLogFiles[$g_iThisLog][0])), str_replace("[YEAR]", date("Y", $g_aLogFiles[$g_iThisLog][0]), Lang("Statistics for [SITE] in [MONTH] [YEAR]")))) ?> + + /style.css" type="text/css" /> + + + + + + + + +\n"; + } +?> + + + + + +
+ +
+ +
+
+"; + if ($g_iThisLog < (count($g_aLogFiles) - 1)) { + echo "" . + ""; + } else { + echo "" . + ""; + } + echo "" . Lang("Change Month") . ""; + if ($g_iThisLog > 0) { + echo "" . + " "; + } else { + echo "" . + ""; + } + echo "\n"; + + // change site (if available) + if (($bConfigChangeSites == true) && (count($aConfig) > 1)) { + echo "" . Lang("Change Site") . "\n"; + } + + // update site (if available) + if ($bConfigUpdateSites == true) { + echo "" . Lang("Update Site") . "\n"; + } + + // change language + echo "" . Lang("Change Language") . + "\n"; + +?> +
+
+ + +
+
+
 
+ +
+
+ + + + +" . $sReason; + switch ($sReason) { + case "BadConfig": + $sProblem = str_replace("[FILENAME]", "\"config.php\"", Lang("There is an error in [FILENAME]")); + $sResolution = "

" . str_replace("[VARIABLE]", ("" . $sExtra . ""), Lang("The variable [VARIABLE] is missing or invalid.")) . "

"; + break; + case "BadConfigNoSites": + $sProblem = str_replace("[FILENAME]", "\"config.php\"", Lang("There is an error in [FILENAME]")); + $sResolution = "

" . Lang("No individual AWStats configurations have been defined.") . "

"; + break; + case "CannotLoadClass": + $sProblem = str_replace("[FILENAME]", "\"clsAWStats.php\"", Lang("Cannot find required file [FILENAME]")); + $sResolution = "

" . Lang("At least one file required by JAWStats has been deleted, renamed or corrupted.") . "

"; + break; + case "CannotLoadConfig": + $sProblem = str_replace("[FILENAME]", "\"config.php\"", Lang("Cannot find required file [FILENAME]")); + $sResolution = "

" . str_replace("[CONFIGDIST]", "config.dist.php", str_replace("[CONFIG]", "config.php", Lang("JAWStats cannot find it's configuration file, [CONFIG]. Did you successfully copy and rename the [CONFIGDIST] file?"))) . "

"; + break; + case "CannotLoadLanguage": + $sProblem = str_replace("[FILENAME]", "\"languages/translations.php\"", Lang("Cannot find required file [FILENAME]")); + $sResolution = "

" . Lang("At least one file required by JAWStats has been deleted, renamed or corrupted.") . "

"; + break; + case "CannotOpenLog": + $sStatsPath = $GLOBALS["aConfig"][$GLOBALS["g_sConfig"]]["statspath"]; + $sProblem = Lang("JAWStats could not open an AWStats log file"); + $sResolution = "

" . Lang("Is the specified AWStats log file directory correct? Does it have a trailing slash?") . "
" . + str_replace("[VARIABLE]", "\"statspath\"", str_replace("[CONFIG]", "config.php", Lang("The problem may be the variable [VARIABLE] in your [CONFIG] file."))) . "

" . + "

" . str_replace("[FOLDER]", "" . $sStatsPath . "\n", str_replace("[FILE]", "awstats" . date("Yn") . "." . $GLOBALS["g_sConfig"] . ".txt", Lang("The data file being looked for is [FILE] in folder [FOLDER]"))); + if (substr($sStatsPath, -1) != "/") { + $sResolution .= "
" . str_replace("[FOLDER]", "" . $sStatsPath . "", Lang("Try changing the folder to [FOLDER]")); + } + $sResolution .= "

"; + break; + case "NoLogsFound": + $sStatsPath = $GLOBALS["aConfig"][$GLOBALS["g_sConfig"]]["statspath"]; + $sProblem = Lang("No AWStats Log Files Found"); + $sResolution = "

JAWStats cannot find any AWStats log files in the specified directory: " . $sStatsPath . "
" . + "Is this the correct folder? Is your config name, " . $GLOBALS["g_sConfig"] . ", correct?

\n"; + break; + case "Unknown": + $sProblem = ""; + $sResolution = "

" . $sExtra . "

\n"; + break; + } + echo "\n" . + "\n" . + "\n" . + "JAWStats\n" . + "\n" . + "\n\n" . + "

" . Lang("An error has occured") . ":
" . $sProblem . "

\n" . $sResolution . + "

" . str_replace("[LINKSTART]", "", str_replace("[LINKEND]", "", Lang("Please refer to the [LINKSTART]installation instructions[LINKEND] for more information."))) . "

\n" . + "\n"; + exit; + } + + // error handler + function ErrorHandler ($errno, $errstr, $errfile, $errline, $errcontext) { + if (strpos($errfile, "index.php") != false) { + switch ($errline) { + case 39: + Error("CannotLoadClass"); + break; + case 40: + Error("CannotLoadLanguage"); + break; + case 41: + Error("CannotLoadConfig"); + break; + default: + //Error("Unknown", ("Line #" . $errline . "
" . $errstr)); + } + } + } + + // translator + function Lang($sString) { + if (isset($GLOBALS["g_aCurrentTranslation"][$sString]) == true) { + return $GLOBALS["g_aCurrentTranslation"][$sString]; + } else { + return $sString; + } + } + +?> \ No newline at end of file diff --git a/jawstats/js/constants.js b/jawstats/js/constants.js new file mode 100755 index 0000000..5ceaf58 --- /dev/null +++ b/jawstats/js/constants.js @@ -0,0 +1,697 @@ +/* + * JAWStats 0.7 Web Statistics + * + * Copyright (c) 2009 Jon Combe (jawstats.com) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +// JAWStats constants +var g_iMajorVersion = 0; +var g_iMinorVersion = 7; +var oSubMenu = {}; +oSubMenu.AllMonths = { "Visitors each Month" : "allmonths.all", + "Visitors each Year" : "allmonths.year" }; +oSubMenu.Browser = { "Browser Families" : "browser.family", + "All Browsers" : "browser.all" }; +oSubMenu.Country = { "Countries" : "country.all", + "Continents" : "country.continent", + "Africa" : "country.Africa", + "Asia" : "country.Asia", + "Europe" : "country.Europe", + "North America" : "country.North America", + "Oceania" : "country.Oceania", + "South America" : "country.South America", + "Other" : "country.Other" }; +oSubMenu.OS = { "Operating System Families" : "os.family", + "All Operating Systems" : "os.all" }; +oSubMenu.PageRefs = { "Search Engines" : "pagerefs.se", + "Top 10 Referrers" : "pagerefs.top10", + "Top 50 Referrers" : "pagerefs.top50", + "All Referrers" : "pagerefs.all", + "Referring Domains" : "pagerefs.domains" }; +oSubMenu.Pages = { "Top Page Views" : "pages.topPages", + "Top Bandwidth" : "pages.topBW", + "Top Entry Pages" : "pages.topEntry", + "Top Exit Pages" : "pages.topExit" }; +oSubMenu.Searches = { "Keywords" : "searches.keywords", + "Keyphrases" : "searches.keyphrases", + "Keywords Tag Cloud" : "searches.keywordcloud", + "Keyphrases Tag Cloud" : "searches.keyphrasecloud" }; +oSubMenu.Status = { "Status Codes" : "status", + "File Not Found URLs" : "status.404" }; +oSubMenu.ThisMonth = { "Overview" : "thismonth.all", + "Calendar of Visitors" : "thismonth.visits", + "Calendar of Page Views" : "thismonth.pages", + "Calendar of Hits" : "thismonth.hits", + "Calendar of Bandwidth Usage" : "thismonth.bandwidth" }; + +// data constants +var gc_aContinents = { "Africa":0, "Asia":0, "Europe":0, "North America":0, "Oceania":0, "South America":0 }; +var gc_aBrowserFamily = [ { sBrowser:"camino", iHits:0, sImage:"unknown" }, + { sBrowser:"firefox", iHits:0, sImage:"unknown" }, + { sBrowser:"icab", iHits:0, sImage:"unknown" }, + { sBrowser:"konqueror", iHits:0, sImage:"unknown" }, + { sBrowser:"libwww", iHits:0, sImage:"unknown" }, + { sBrowser:"lotus\\-notes", iHits:0, sImage:"unknown" }, + { sBrowser:"mozilla", iHits:0, sImage:"unknown" }, + { sBrowser:"msie", iHits:0, sImage:"unknown" }, + { sBrowser:"netscape", iHits:0, sImage:"unknown" }, + { sBrowser:"omniweb", iHits:0, sImage:"unknown" }, + { sBrowser:"opera", iHits:0, sImage:"unknown" }, + { sBrowser:"safari", iHits:0, sImage:"unknown" }, + { sBrowser:"wget", iHits:0, sImage:"unknown" }, + { sBrowser:"Unknown", iHits:0, sImage:"unknown" }, + { sBrowser:"Other Browsers", iHits:0, sImage:"unknown" } ] +var gc_aBrowserFamilyCaption = { "camino":"Camino", "firefox":"Firefox", "icab":"iCab", "konqueror":"Konqueror", "libwww":"Libwww", "lotus\\-notes":"Lotus Notes", "mozilla":"Mozilla", "msie":"Internet Explorer", "netscape":"Netscape", "omniweb":"OmniWeb", "opera":"Opera", "safari":"Safari", "wget":"GNU Wget", "Unknown":"Unknown", "Other Browsers":"Other Browsers" } + +// http://en.wikipedia.org/wiki/List_of_countries_by_continent +var gc_aCountryContinent = { + "af":"Asia", + "ax":"Europe", + "al":"Europe", + "dz":"Africa", + "as":"Oceania", + "ad":"Europe", + "ao":"Africa", + "ai":"North America", + "aq":"Antarctica", + "ag":"North America", + "ar":"South America", + "am":"Europe", + "aw":"North America", + "au":"Oceania", + "at":"Europe", + "az":"Asia", + "bs":"North America", + "bh":"Asia", + "bd":"Asia", + "bb":"North America", + "by":"Europe", + "be":"Europe", + "bz":"North America", + "bj":"Africa", + "bm":"North America", + "bt":"Asia", + "bo":"South America", + "ba":"Europe", + "bw":"Africa", + "bv":"Antarctica", + "br":"South America", + "io":"Asia", + "bn":"Asia", + "bg":"Europe", + "bf":"Africa", + "bi":"Africa", + "kh":"Asia", + "cm":"Africa", + "ca":"North America", + "cv":"Africa", + "ky":"North America", + "cf":"Africa", + "td":"Africa", + "cl":"South America", + "cn":"Asia", + "cx":"Asia", + "cc":"Asia", + "co":"South America", + "km":"Africa", + "cg":"Africa", + "cd":"Africa", + "ck":"Oceania", + "cr":"North America", + "ci":"Africa", + "hr":"Europe", + "cu":"North America", + "cy":"Europe", + "cz":"Europe", + "dk":"Europe", + "dj":"Africa", + "dm":"North America", + "do":"North America", + "ec":"South America", + "eg":"Africa", + "sv":"North America", + "gq":"Africa", + "er":"Africa", + "ee":"Europe", + "et":"Africa", + "fk":"South America", + "fo":"Europe", + "fj":"Oceania", + "fi":"Europe", + "fr":"Europe", + "gf":"South America", + "pf":"Oceania", + "tf":"Antartica", + "ga":"Africa", + "gm":"Africa", + "ge":"Europe", + "de":"Europe", + "gh":"Africa", + "gi":"Europe", + "gr":"Europe", + "gl":"North America", + "gd":"North America", + "gp":"North America", + "gu":"Oceania", + "gt":"North America", + "gg":"Europe", + "gn":"Africa", + "gw":"Africa", + "gy":"South America", + "ht":"North America", + "hm":"Antarctica", + "hn":"North America", + "hk":"Asia", + "hu":"Europe", + "is":"Europe", + "in":"Asia", + "id":"Asia", + "ir":"Asia", + "iq":"Asia", + "ie":"Europe", + "im":"Europe", + "il":"Asia", + "it":"Europe", + "jm":"North America", + "jp":"Asia", + "je":"Europe", + "jo":"Asia", + "kz":"Asia", + "ke":"Africa", + "ki":"Oceania", + "kp":"Asia", + "kr":"Asia", + "kw":"Asia", + "kg":"Asia", + "la":"Asia", + "lv":"Europe", + "lb":"Asia", + "ls":"Africa", + "lr":"Africa", + "ly":"Africa", + "li":"Europe", + "lt":"Europe", + "lu":"Europe", + "mo":"Asia", + "mk":"Europe", + "mg":"Africa", + "mw":"Africa", + "my":"Asia", + "mv":"Asia", + "ml":"Africa", + "mt":"Europe", + "mh":"Oceania", + "mq":"North America", + "mr":"Africa", + "mu":"Africa", + "yt":"Africa", + "mx":"South America", + "fm":"Oceania", + "md":"Europe", + "mc":"Europe", + "mn":"Asia", + "me":"Europe", + "ms":"North America", + "ma":"Africa", + "mz":"Africa", + "mm":"Asia", + "na":"Africa", + "nr":"Oceania", + "np":"Asia", + "nl":"Europe", + "an":"North America", + "nc":"Oceania", + "nz":"Oceania", + "ni":"North America", + "ne":"Africa", + "ng":"Africa", + "nu":"Oceania", + "nf":"Oceania", + "mp":"Oceania", + "no":"Europe", + "om":"Asia", + "pk":"Asia", + "pw":"Oceania", + "ps":"Asia", + "pa":"North America", + "pg":"Oceania", + "py":"South America", + "pe":"South America", + "ph":"Asia", + "pn":"Oceania", + "pl":"Europe", + "pt":"Europe", + "pr":"North America", + "qa":"Asia", + "re":"Africa", + "ro":"Europe", + "ru":"Asia", + "rw":"Africa", + "bl":"North America", + "sh":"Africa", + "kn":"North America", + "lc":"North America", + "mf":"North America", + "pm":"North America", + "vc":"North America", + "ws":"Oceania", + "sm":"Europe", + "st":"Africa", + "sa":"Asia", + "sn":"Africa", + "rs":"Europe", + "sc":"Africa", + "sl":"Africa", + "sg":"Asia", + "sk":"Europe", + "si":"Europe", + "sb":"Oceania", + "so":"Africa", + "za":"Africa", + "gs":"Antarctica", + "es":"Europe", + "lk":"Asia", + "sd":"Africa", + "sr":"South America", + "sj":"Europe", + "sz":"Africa", + "se":"Europe", + "ch":"Europe", + "sy":"Asia", + "tw":"Asia", + "tj":"Asia", + "tz":"Africa", + "th":"Asia", + "tl":"Oceania", + "tg":"Africa", + "tk":"Oceania", + "to":"Oceania", + "tt":"North America", + "tn":"Africa", + "tr":"Asia", + "tm":"Asia", + "tc":"North America", + "tv":"Oceania", + "ug":"Africa", + "ua":"Europe", + "ae":"Asia", + "gb":"Europe", + "uk":"Europe", + "um":"Oceania", + "us":"North America", + "uy":"South America", + "uz":"Asia", + "vu":"Oceania", + "va":"Europe", + "ve":"South America", + "vn":"Asia", + "vg":"North America", + "vi":"North America", + "wf":"Oceania", + "eh":"Africa", + "ye":"Asia", + "zm":"Africa", + "zw":"Africa", + + "eu":"Europe" +} + +var gc_aCountryName = { + "af":"Afghanistan", + "ax":"Aland Islands", + "al":"Albania", + "dz":"Algeria", + "as":"American Samoa", + "ad":"Andorra", + "ao":"Angola", + "ai":"Anguilla", + "aq":"Antarctica", + "ag":"Antigua and Barbuda", + "ar":"Argentina", + "am":"Armenia", + "aw":"Aruba", + "au":"Australia", + "at":"Austria", + "az":"Azerbaijan", + "bs":"Bahamas", + "bh":"Bahrain", + "bd":"Bangladesh", + "bb":"Barbados", + "by":"Belarus", + "be":"Belgium", + "bz":"Belize", + "bj":"Benin", + "bm":"Bermuda", + "bt":"Bhutan", + "bo":"Bolivia", + "ba":"Bosnia and Herzegovina", + "bw":"Botswana", + "bv":"Bouvet Island", + "br":"Brazil", + "io":"British Indian Ocean Territory", + "bn":"Brunei Darussalam", + "bg":"Bulgaria", + "bf":"Burkina Faso", + "bi":"Burundi", + "kh":"Cambodia", + "cm":"Cameroon", + "ca":"Canada", + "cv":"Cape Verde", + "ky":"Cayman Islands", + "cf":"Central African Republic", + "td":"Chad", + "cl":"Chile", + "cn":"China", + "cx":"Christmas Island", + "cc":"Cocos (Keeling) Islands", + "co":"Colombia", + "km":"Comoros", + "cg":"Congo (Brazzaville)", + "cd":"Congo (Kinshasa)", + "ck":"Cook Islands", + "cr":"Costa Rica", + "ci":"Cote d'Ivoire", + "hr":"Croatia", + "cu":"Cuba", + "cy":"Cyprus", + "cz":"Czech Republic", + "dk":"Denmark", + "dj":"Djibouti", + "dm":"Dominica", + "do":"Dominican Republic", + "ec":"Ecuador", + "eg":"Egypt", + "sv":"El Salvador", + "gq":"Equatorial Guinea", + "er":"Eritrea", + "ee":"Estonia", + "et":"Ethiopia", + "fk":"Falkland Islands", + "fo":"Faroe Islands", + "fj":"Fiji", + "fi":"Finland", + "fr":"France", + "gf":"French Guiana", + "pf":"French Polynesia", + "tf":"French Southern Lands", + "ga":"Gabon", + "gm":"Gambia", + "ge":"Georgia", + "de":"Germany", + "gh":"Ghana", + "gi":"Gibraltar", + "gr":"Greece", + "gl":"Greenland", + "gd":"Grenada", + "gp":"Guadeloupe", + "gu":"Guam", + "gt":"Guatemala", + "gg":"Guernsey", + "gn":"Guinea", + "gw":"Guinea-Bissau", + "gy":"Guyana", + "ht":"Haiti", + "hm":"Heard and McDonald Islands", + "hn":"Honduras", + "hk":"Hong Kong", + "hu":"Hungary", + "is":"Iceland", + "in":"India", + "id":"Indonesia", + "ir":"Iran", + "iq":"Iraq", + "ie":"Ireland", + "im":"Isle of Man", + "il":"Israel", + "it":"Italy", + "jm":"Jamaica", + "jp":"Japan", + "je":"Jersey", + "jo":"Jordan", + "kz":"Kazakhstan", + "ke":"Kenya", + "ki":"Kiribati", + "kp":"Korea, North", + "kr":"Korea, South", + "kw":"Kuwait", + "kg":"Kyrgyzstan", + "la":"Laos", + "lv":"Latvia", + "lb":"Lebanon", + "ls":"Lesotho", + "lr":"Liberia", + "ly":"Libya", + "li":"Liechtenstein", + "lt":"Lithuania", + "lu":"Luxembourg", + "mo":"Macau", + "mk":"Macedonia", + "mg":"Madagascar", + "mw":"Malawi", + "my":"Malaysia", + "mv":"Maldives", + "ml":"Mali", + "mt":"Malta", + "mh":"Marshall Islands", + "mq":"Martinique", + "mr":"Mauritania", + "mu":"Mauritius", + "yt":"Mayotte", + "mx":"Mexico", + "fm":"Micronesia", + "md":"Moldova", + "mc":"Monaco", + "mn":"Mongolia", + "me":"Montenegro", + "ms":"Montserrat", + "ma":"Morocco", + "mz":"Mozambique", + "mm":"Myanmar", + "na":"Namibia", + "nr":"Nauru", + "np":"Nepal", + "nl":"Netherlands", + "an":"Netherlands Antilles", + "nc":"New Caledonia", + "nz":"New Zealand", + "ni":"Nicaragua", + "ne":"Niger", + "ng":"Nigeria", + "nu":"Niue", + "nf":"Norfolk Island", + "mp":"Northern Mariana Islands", + "no":"Norway", + "om":"Oman", + "pk":"Pakistan", + "pw":"Palau", + "ps":"Palestine", + "pa":"Panama", + "pg":"Papua New Guinea", + "py":"Paraguay", + "pe":"Peru", + "ph":"Philippines", + "pn":"Pitcairn", + "pl":"Poland", + "pt":"Portugal", + "pr":"Puerto Rico", + "qa":"Qatar", + "re":"Reunion", + "ro":"Romania", + "ru":"Russian Federation", + "rw":"Rwanda", + "bl":"Saint Barthelemy", + "sh":"Saint Helena", + "kn":"Saint Kitts and Nevis", + "lc":"Saint Lucia", + "mf":"Saint Martin (French part)", + "pm":"Saint Pierre and Miquelon", + "vc":"Saint Vincent and the Grenadines", + "ws":"Samoa", + "sm":"San Marino", + "st":"Sao Tome and Principe", + "sa":"Saudi Arabia", + "sn":"Senegal", + "rs":"Serbia", + "sc":"Seychelles", + "sl":"Sierra Leone", + "sg":"Singapore", + "sk":"Slovakia", + "si":"Slovenia", + "sb":"Solomon Islands", + "so":"Somalia", + "za":"South Africa", + "gs":"South Georgia and South Sandwich Islands", + "es":"Spain", + "lk":"Sri Lanka", + "sd":"Sudan", + "sr":"Suriname", + "sj":"Svalbard and Jan Mayen Islands", + "sz":"Swaziland", + "se":"Sweden", + "ch":"Switzerland", + "sy":"Syria", + "tw":"Taiwan", + "tj":"Tajikistan", + "tz":"Tanzania", + "th":"Thailand", + "tl":"Timor-Leste", + "tg":"Togo", + "tk":"Tokelau", + "to":"Tonga", + "tt":"Trinidad and Tobago", + "tn":"Tunisia", + "tr":"Turkey", + "tm":"Turkmenistan", + "tc":"Turks and Caicos Islands", + "tv":"Tuvalu", + "ug":"Uganda", + "ua":"Ukraine", + "ae":"United Arab Emirates", + "gb":"United Kingdom", + "uk":"United Kingdom", + "um":"United States Minor Outlying Islands", + "us":"United States of America", + "uy":"Uruguay", + "uz":"Uzbekistan", + "vu":"Vanuatu", + "va":"Vatican City", + "ve":"Venezuela", + "vn":"Vietnam", + "vg":"Virgin Islands, British", + "vi":"Virgin Islands, U.S.", + "wf":"Wallis and Futuna Islands", + "eh":"Western Sahara", + "ye":"Yemen", + "zm":"Zambia", + "zw":"Zimbabwe", + + "a1":"Unknown", + "a2":"Satellite Provider", + "eu":"European Union", + "i0":"Local Network Host", + "localhost":"Localhost", + + "aero":"Aero/Travel domains", + "arpa":"Old style Arpanet", + "com" :"Commercial", + "edu" :"USA Educational", + "info":"Info Domains", + "mil" :"USA Military", + "name":"Name domains", + "nato":"NATO", + "net" :"Network", + "org" :"Non-Profit Organisations" +} + +var gc_aFiletypeDesc = { "asp" : "Active Server Page", + "cfm" : "Coldfusion script", + "cgi" : "CGI script", + "css" : "Cascading Style Sheet", + "flv" : "Flash Video file", + "gif" : "Image", + "gz" : "File Archive", + "htm" : "HTML or XML static page", + "html" : "HTML or XML static page", + "ico" : "Icon", + "jpeg" : "Image", + "jpg" : "Image", + "js" : "JavaScript File", + "jsp" : "JavaServer Page", + "m4a" : "MPEG-4 Audio File", + "mov" : "QuickTime Movie", + "mp3" : "MPEG-1 Audio Layer 3 file", + "pdf" : "Adobe Portable Document Format file", + "php" : "PHP script", + "pl" : "Perl script", + "png" : "Image", + "ppt" : "Microsoft PowerPoint file", + "swf" : "Adobe Flash file", + "tar" : "File Archive", + "txt" : "Text file", + "wav" : "Waveform Audio file", + "xml" : "XML file", + "zip" : "File Archive" }; + +var gc_aOSFamily = [ { sOperatingSystem:"bsd", iHits:0 }, + { sOperatingSystem:"linux", iHits:0 }, + { sOperatingSystem:"mac", iHits:0 }, + { sOperatingSystem:"psp", iHits:0 }, + { sOperatingSystem:"sun", iHits:0 }, + { sOperatingSystem:"symbian", iHits:0 }, + { sOperatingSystem:"win", iHits:0 }, + { sOperatingSystem:"Unknown", iHits:0 }, + { sOperatingSystem:"Other OS", iHits:0 } ] +var gc_aOSFamilyCaption = { "bsd":"BSD", "linux":"Linux", "mac":"Apple", "psp":"PSP", "sun":"Sun", "symbian":"Symbian", "win":"Windows", "Unknown":"Unknown", "Other OS":"Other OS" } +var gc_aSearchEngines = [ { sCode:"alexa", sName:"Alexa", sImage:"alexa", sURL:"Alexa" }, + { sCode:"aliceit", sName:"Alice", sImage:"alice", sURL:"Alice" }, + { sCode:"alltheweb", sName:"All The Web", sImage:"alltheweb", sURL:"All The Web" }, + { sCode:"altavista", sName:"AltaVista", sImage:"altavista", sURL:"AltaVista" }, + { sCode:"aol", sName:"AOL", sImage:"aol", sURL:"AOL" }, + { sCode:"ask", sName:"Ask", sImage:"ask", sURL:"Ask" }, + { sCode:"att", sName:"AT&T", sImage:"yahoo", sURL:"AT&T" }, + { sCode:"avantfind", sName:"AvantFind", sImage:"avantfind", sURL:"AvantFind" }, + { sCode:"blingo", sName:"Blingo", sImage:"blingo", sURL:"Blingo" }, + { sCode:"bluewin", sName:"Bluewin", sImage:"bluewin", sURL:"Bluewin" }, + { sCode:"clusty", sName:"Clusty", sImage:"clusty", sURL:"Clusty" }, + { sCode:"delicious", sName:"del.icio.us", sImage:"delicious", sURL:"del.icio.us" }, + { sCode:"enirose", sName:"Eniro", sImage:"eniro", sURL:"Eniro" }, + { sCode:"dogpile", sName:"Dogpile", sImage:"dogpile", sURL:"Dogpile" }, + { sCode:"earthlink", sName:"EarthLink", sImage:"earthlink", sURL:"EarthLink" }, + { sCode:"excite", sName:"Excite", sImage:"excite", sURL:"Excite" }, + { sCode:"goodsearch", sName:"GoodSearch", sImage:"goodsearch", sURL:"GoodSearch" }, + { sCode:"google", sName:"Google", sImage:"google", sURL:"Google" }, + { sCode:"google_cache", sName:"Google Cache", sImage:"google", sURL:"Google Cache" }, + { sCode:"google_image", sName:"Google Images", sImage:"google", sURL:"Google Images" }, + { sCode:"infospace", sName:"InfoSpace", sImage:"infospace", sURL:"InfoSpace" }, + { sCode:"kvasir", sName:"Kvasir", sImage:"kvasir", sURL:"Kvasir" }, + { sCode:"live", sName:"Windows Live", sImage:"live", sURL:"Windows Live" }, + { sCode:"lycos", sName:"Lycos", sImage:"lycos", sURL:"Lycos" }, + { sCode:"mamma", sName:"Mamma", sImage:"mamma", sURL:"Mamma" }, + { sCode:"msn", sName:"MSN", sImage:"msn", sURL:"MSN" }, + { sCode:"mywebsearch", sName:"My Web Search", sImage:"mywebsearch", sURL:"My Web Search" }, + { sCode:"netscape", sName:"Netscape", sImage:"aol", sURL:"Netscape" }, + { sCode:"sapo", sName:"Sapo", sImage:"sapo", sURL:"Sapo" }, + { sCode:"search", sName:"Search.com", sImage:"search", sURL:"Search.com" }, + { sCode:"search.com", sName:"Search.com", sImage:"search", sURL:"Search.com" }, + { sCode:"seznam", sName:"Seznam", sImage:"seznam", sURL:"Seznam" }, + { sCode:"steadysearch", sName:"SteadySearch", sImage:"steadysearch", sURL:"SteadySearch" }, + { sCode:"stumbleupon", sName:"StumbleUpon", sImage:"stumbleupon", sURL:"StumbleUpon" }, + { sCode:"tiscali", sName:"Tiscali", sImage:"tiscali", sURL:"Tiscali" }, + { sCode:"vivisimo", sName:"Vivisimo", sImage:"vivisimo", sURL:"Vivisimo" }, + { sCode:"voila", sName:"Voila", sImage:"voila", sURL:"Voila" }, + { sCode:"webcrawler", sName:"WebCrawler", sImage:"webcrawler", sURL:"WebCrawler" }, + { sCode:"webde", sName:"Web.de", sImage:"webde", sURL:"Web.de" }, + { sCode:"yahoo", sName:"Yahoo!", sImage:"yahoo", sURL:"Yahoo!" } ]; + +var gc_aHTTPStatus = { "206" : "Partial Content", + "301" : "Moved Permanently (redirect)", + "307" : "Moved Temporarily (redirect)", + "400" : "Bad Request", + "401" : "Unauthorized", + "403" : "Forbidden", + "404" : "File Not Found", + "503" : "Service Unavailable" }; + +var gc_aDayName = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]; +var gc_aMonthName = ["January","February","March","April","May","June","July","August","September","October","November","December"]; \ No newline at end of file diff --git a/jawstats/js/jawstats.js b/jawstats/js/jawstats.js new file mode 100755 index 0000000..27156dc --- /dev/null +++ b/jawstats/js/jawstats.js @@ -0,0 +1,3759 @@ +/* + * JAWStats 0.7 Web Statistics + * + * Copyright (c) 2009 Jon Combe (jawstats.com) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +var oTranslation = {}; +var oStatistics = {}; +var dtLastUpdate = 0; +var sToolID; +var oPaging = { + oKeywords:{ iCurrPage:0, iRowCount:0, iRowsPerPage:15, sSort:"freqDESC" }, + oKeyphrases:{ iCurrPage:0, iRowCount:0, iRowsPerPage:15, sSort:"freqDESC" } +}; + +// jQuery methods +$(document).ready(function() { + var aCurrentView = g_sCurrentView.split("."); + $("#menu").children("ul:eq(0)").children("li").addClass("off"); + $("#tab" + aCurrentView[0]).removeClass("off"); + DrawPage(g_sCurrentView); + + // change language mouseover + $("#toolLanguageButton").mouseover(function() { + $("#toolLanguageButton img").attr("src", "themes/" + sThemeDir + "/images/change_language_on.gif"); + }); + $("#toolLanguageButton").mouseout(function() { + $("#toolLanguageButton img").attr("src", "themes/" + sThemeDir + "/images/change_language.gif"); + }); +}); + +function AddLeadingZero(vValue, iLength) { + sValue = vValue.toString(); + while (sValue.length < iLength) { + sValue = ("0" + sValue); + } + return sValue; +} + +function ChangeLanguage(sLanguage) { + $("#loading").show(); + self.location.href = ("?config=" + g_sConfig + "&year=" + g_iYear + "&month=" + g_iMonth + "&view=" + g_sCurrentView + "&lang=" + sLanguage); +} + +function ChangeMonth(iYear, iMonth) { + $("#loading").show(); + self.location.href = ("?config=" + g_sConfig + "&year=" + iYear + "&month=" + iMonth + "&view=" + g_sCurrentView + "&lang=" + g_sLanguage); +} + +function ChangeSite(sConfig) { + $("#loading").show(); + self.location.href = ("?config=" + sConfig + "&year=" + g_iYear + "&month=" + g_iMonth + "&view=" + g_sCurrentView + "&lang=" + g_sLanguage); +} + +function ChangeTab(oSpan, sPage) { + $("#menu").children("ul:eq(0)").children("li").addClass("off"); + $(oSpan).parent().removeClass("off"); + DrawPage(sPage); +} + +function CheckLastUpdate(oXML) { + if (parseInt($(oXML).find('info').attr("lastupdate")) != g_dtLastUpdate) { + var sURL = "?config=" + g_sConfig + "&year=" + g_iYear + "&month=" + g_iMonth + "&view=" + g_sCurrentView; + self.location.href = sURL; + } +} + +function DisplayBandwidth(iBW) { + iVal = iBW; + + iBW = (iBW / 1024); + if (iBW < 1024) { + return NumberFormat(iBW, 1) + "k"; + } + iBW = (iBW / 1024); + if (iBW < 1024) { + return NumberFormat(iBW, 1) + "M"; + } + iBW = (iBW / 1024); + return NumberFormat(iBW, 1) + "G"; +} + +function DrawGraph(aItem, aValue, aInitial, sStyle) { + var oGraph = new SWFObject("swf/" + sStyle + "_graph.swf", "SWFgraph", "100%", "100%", "8", "#ffffff"); + oGraph.addParam("wmode", "transparent"); + oGraph.addVariable("sItem", aItem.join(",")); + oGraph.addVariable("sValue", aValue.join(",")); + oGraph.addVariable("sInitial", aInitial.join(",")); + oGraph.addVariable("sColor", g_sColor); + oGraph.addVariable("sShadowColor", g_sShadowColor); + oGraph.write("graph"); +} + +function DrawGraph_AllMonths() { + var aItem = []; + var aValue = []; + for (var iIndex in oStatistics.oAllMonths.aData) { + aItem.push(Lang(gc_aMonthName[oStatistics.oAllMonths.aData[iIndex].dtDate.getMonth()].substr(0,3)) + " '" + + (oStatistics.oAllMonths.aData[iIndex].dtDate.getFullYear()).toString().substr(2)); + aValue.push(oStatistics.oAllMonths.aData[iIndex].iVisits); + } + DrawGraph(aItem, aValue, [], "line"); +} + +function DrawGraph_ThisMonth() { + var aItem = []; + var aValue = []; + var aInitial = []; + + // populate days + var iDaysInMonth = (new Date(g_iYear, g_iMonth, 0)).getDate(); + var iDayOfWeek = (new Date(g_iYear, (g_iMonth - 1), 1)).getDay(); + for (var iDay = 0; iDay < iDaysInMonth; iDay++) { + aItem.push(Lang((iDay + 1) + DateSuffix(iDay + 1))); + aValue.push(0); + aInitial.push(Lang(gc_aDayName[iDayOfWeek].substr(0, 3))); + + // day of week + iDayOfWeek++; + if (iDayOfWeek > 6) { + iDayOfWeek = 0; + } + } + + // update values we know about + for (var iIndex in oStatistics.oThisMonth.aData) { + iDay = (oStatistics.oThisMonth.aData[iIndex].dtDate.getDate() - 1); + aValue[iDay] = oStatistics.oThisMonth.aData[iIndex].iVisits; + } + DrawGraph(aItem, aValue, aInitial, "bar"); +} + +function DrawGraph_Time() { + var aItem = []; + var aValue = []; + for (var iRow in oStatistics.oTime.aData) { + oRow = oStatistics.oTime.aData[iRow]; + sHour = oRow.iHour; + if (oRow.iHour < 10) { + sHour = ("0" + sHour) + } + aItem.push(sHour); + aValue.push(oRow.iPages); + } + DrawGraph(aItem, aValue, [], "line"); +} + +function DrawPage(sPage) { + $("#content").fadeOut(g_iFadeSpeed, function() { + g_sCurrentView = sPage; + var aPage = sPage.split("."); + switch (aPage[0]) { + case "allmonths": + if (typeof oStatistics.oAllMonths == "undefined") { + PopulateData_AllMonths(sPage); + return false; + } + PageLayout_AllMonths(aPage[1]); + break; + case "browser": + if (typeof oStatistics.oBrowser == "undefined") { + PopulateData_Browser(sPage); + return false; + } + PageLayout_Browser(aPage[1]); + break; + case "country": + if (typeof oStatistics.oCountry == "undefined") { + PopulateData_Country(sPage); + return false; + } + PageLayout_Country(aPage[1]); + break; + case "filetypes": + if (typeof oStatistics.oFiletypes == "undefined") { + PopulateData_Filetypes(sPage); + return false; + } + PageLayout_Filetypes(); + break; + case "keyphrases": + if (typeof oStatistics.oKeyphrases == "undefined") { + PopulateData_Keyphrases(sPage); + return false; + } + PageLayout_Keyphrases(aPage[1]); + break; + case "keywords": + if (typeof oStatistics.oKeywords == "undefined") { + PopulateData_Keywords(sPage); + return false; + } + PageLayout_Keywords(aPage[1]); + break; + case "os": + if (typeof oStatistics.oOperatingSystems == "undefined") { + PopulateData_OperatingSystems(sPage); + return false; + } + PageLayout_OperatingSystems(aPage[1]); + break; + case "pagerefs": + if (aPage[1] == "se") { + if (typeof oStatistics.oPageRefsSE == "undefined") { + PopulateData_PageRefsSE(); + return false; + } + PageLayout_PageRefsSE(); + } else { + if (typeof oStatistics.oPageRefs == "undefined") { + PopulateData_PageRefs(sPage, false); + return false; + } + PageLayout_PageRefs(aPage[1]); + } + break; + case "pages": + if (typeof oStatistics.oPages == "undefined") { + PopulateData_Pages(sPage); + return false; + } + PageLayout_Pages(aPage[1]); + break; + case "robots": + if (typeof oStatistics.oRobots == "undefined") { + PopulateData_Robots(sPage); + return false; + } + PageLayout_Robots(); + break; +case "searches": + switch (aPage[1]) { + case "keyphrasecloud": + if (typeof oStatistics.oKeyphrases == "undefined") { + PopulateData_Keyphrases(sPage); + return false; + } + PageLayout_Searches(aPage[1]); + break; + case "keyphrases": + if (typeof oStatistics.oKeyphrases == "undefined") { + PopulateData_Keyphrases(sPage); + return false; + } + PageLayout_Searches(aPage[1]); + break; + case "keywordcloud": + if (typeof oStatistics.oKeywords == "undefined") { + PopulateData_Keywords(sPage); + return false; + } + PageLayout_Searches(aPage[1]); + break; + case "keywords": + if (typeof oStatistics.oKeywords == "undefined") { + PopulateData_Keywords(sPage); + return false; + } + PageLayout_Searches(aPage[1]); + break; + } + break; + case "session": + if (typeof oStatistics.oSession == "undefined") { + PopulateData_Session(); + return false; + } + PageLayout_Session(); + break; + case "status": + if (aPage[1] == "404") { + if (typeof oStatistics.oStatus404 == "undefined") { + PopulateData_Status404(sPage); + return false; + } + } else { + if (typeof oStatistics.oStatus == "undefined") { + PopulateData_Status(sPage); + return false; + } + } + PageLayout_Status(aPage[1]); + break; + case "thismonth": + if (typeof oStatistics.oThisMonth == "undefined") { + PopulateData_ThisMonth(sPage); + return false; + } + PageLayout_ThisMonth(aPage[1]); + break; + case "time": + if (typeof oStatistics.oTime == "undefined") { + PopulateData_Time(sPage); + return false; + } + PageLayout_Time(); + break; + } + }); +} + +function DrawPie(iTotal, aItem, aValue) { + var oPie = new SWFObject("swf/pie.swf", "SWFpie", "100%", "100%", "8", "#ffffff"); + oPie.addParam("wmode", "transparent"); + oPie.addVariable("sTotal", iTotal); + oPie.addVariable("sItem", encodeURIComponent(aItem.join(","))); + oPie.addVariable("sValue", encodeURIComponent(aValue.join(","))); + oPie.addVariable("sColor", g_sColor); + oPie.addVariable("sShadowColor", g_sShadowColor); + oPie.write("pie"); +} + +function DrawPie_Browser(sPage) { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + + switch (sPage) { + case "all": + for (var iRow in oStatistics.oBrowser.aData) { + if (iCount < 6) { + aItem.push(oStatistics.oBrowser.aData[iRow].sBrowser); + aValue.push(oStatistics.oBrowser.aData[iRow].iHits); + iRunningTotal += oStatistics.oBrowser.aData[iRow].iHits; + iCount++; + } + } + if (oStatistics.oBrowser.iTotalHits > iRunningTotal) { + aItem.push(Lang("Other Browsers")); + aValue.push(oStatistics.oBrowser.iTotalHits - iRunningTotal); + } + DrawPie(oStatistics.oBrowser.iTotalHits, aItem, aValue); + break; + case "family": + for (var iRow in oStatistics.oBrowser.aFamily) { + if (iCount < 6) { + if (oStatistics.oBrowser.aFamily[iRow].iHits > 0) { + aItem.push(gc_aBrowserFamilyCaption[oStatistics.oBrowser.aFamily[iRow].sBrowser]); + aValue.push(oStatistics.oBrowser.aFamily[iRow].iHits); + iRunningTotal += oStatistics.oBrowser.aFamily[iRow].iHits; + iCount++; + } + } + } + if (oStatistics.oBrowser.iTotalHits > iRunningTotal) { + aItem.push(Lang("Other Browsers")); + aValue.push(oStatistics.oBrowser.iTotalHits - iRunningTotal); + } + DrawPie(oStatistics.oBrowser.iTotalHits, aItem, aValue); + break; + default: + // find family totals + for (var iRow in aFamily) { + if (aFamily[iRow].sBrowser == sPage) { + iFamilyTotalHits = aFamily[iRow].iHits; + break; + } + } + + // extract data + for (var iRow in oStatistics.oBrowser.aData) { + if ((iCount < 6) && (oStatistics.oBrowser.aData[iRow].sFamily == sPage)) { + aItem.push(oStatistics.oBrowser.aData[iRow].sBrowser); + aValue.push(oStatistics.oBrowser.aData[iRow].iHits); + iRunningTotal += oStatistics.oBrowser.aData[iRow].iHits; + iCount++; + } + } + if (iFamilyTotalHits > iRunningTotal) { + aItem.push(Lang("Other Versions")); + aValue.push(iFamilyTotalHits - iRunningTotal); + } + DrawPie(iFamilyTotalHits, aItem, aValue); + break; + } +} + +function DrawPie_Country(sContinent) { + // get values + if (typeof sContinent == "undefined") { + iTotalPages = oStatistics.oCountry.iTotalPages; + } else { + iTotalPages = oStatistics.oCountry.oContinent[sContinent].iTotalPages; + } + aData = oStatistics.oCountry.aData; + + // build arrays + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + for (var iIndex in aData) { + if (iCount < 6) { + if ((typeof sContinent == "undefined") || (aData[iIndex].sContinent == sContinent)) { + aItem.push(Lang(aData[iIndex].sCountryName)); + aValue.push(aData[iIndex].iPages); + iRunningTotal += aData[iIndex].iPages; + iCount++; + } + } + } + if (iTotalPages > iRunningTotal) { + aItem.push(Lang("Other Countries")); + aValue.push(iTotalPages - iRunningTotal); + } + DrawPie(iTotalPages, aItem, aValue); +} + +function DrawPie_CountryContinent() { + // this section is an anomaly whereby the continents need to be sorted by size before being passsed to the flash + // thankfully there are only 6 (we are interested in) + var aTemp = []; + for (var sContinent in gc_aContinents) { + aTemp.push({ "sContinent" : sContinent, + "iPages" : oStatistics.oCountry.oContinent[sContinent].iTotalPages }); + } + aTemp.sort(Sort_Pages); + + // pass across to simpler array format + var iTotalPages = oStatistics.oCountry.iTotalPages; + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + for (var iIndex in aTemp) { + aItem.push(Lang(aTemp[iIndex].sContinent)); + aValue.push(aTemp[iIndex].iPages); + iRunningTotal += aTemp[iIndex].iPages; + } + if (iTotalPages > iRunningTotal) { + aItem.push(Lang("Other")); + aValue.push(iTotalPages - iRunningTotal); + } + DrawPie(iTotalPages, aItem, aValue); +} + +function DrawPie_Filetypes() { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + for (var iIndex in oStatistics.oFiletypes.aData) { + if (iCount < 6) { + if (oStatistics.oFiletypes.aData[iIndex].sFiletype != " ") { + aItem.push(oStatistics.oFiletypes.aData[iIndex].sFiletype.toUpperCase() + ": " + + Lang(oStatistics.oFiletypes.aData[iIndex].sDescription)); + } else { + aItem.push(Lang(oStatistics.oFiletypes.aData[iIndex].sDescription)); + } + aValue.push(oStatistics.oFiletypes.aData[iIndex].iHits); + iRunningTotal += oStatistics.oFiletypes.aData[iIndex].iHits; + } + iCount++; + } + if (oStatistics.oFiletypes.iTotalHits > iRunningTotal) { + aItem.push(Lang("Other Filetypes")); + aValue.push(oStatistics.oFiletypes.iTotalHits - iRunningTotal); + } + DrawPie(oStatistics.oFiletypes.iTotalHits, aItem, aValue); +} + +function DrawPie_Keyphrases() { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + for (var iIndex in oStatistics.oKeyphrases.aData) { + if (iCount < 6) { + aItem.push(oStatistics.oKeyphrases.aData[iIndex].sPhrase); + aValue.push(oStatistics.oKeyphrases.aData[iIndex].iFreq); + iRunningTotal += oStatistics.oKeyphrases.aData[iIndex].iFreq; + } + iCount++; + } + if (oStatistics.oKeyphrases.iTotalFreq > iRunningTotal) { + aItem.push(Lang("Other Keyphrases")); + aValue.push(oStatistics.oKeyphrases.iTotalFreq - iRunningTotal); + } + DrawPie(oStatistics.oKeyphrases.iTotalFreq, aItem, aValue); +} + +function DrawPie_Keywords() { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + for (var iIndex in oStatistics.oKeywords.aData) { + if (iCount < 6) { + aItem.push(oStatistics.oKeywords.aData[iIndex].sWord); + aValue.push(oStatistics.oKeywords.aData[iIndex].iFreq); + iRunningTotal += oStatistics.oKeywords.aData[iIndex].iFreq; + } + iCount++; + } + if (oStatistics.oKeywords.iTotalFreq > iRunningTotal) { + aItem.push(Lang("Other Keywords")); + aValue.push(oStatistics.oKeywords.iTotalFreq - iRunningTotal); + } + DrawPie(oStatistics.oKeywords.iTotalFreq, aItem, aValue); +} + +function DrawPie_OperatingSystems(sPage) { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + + switch (sPage) { + case "all": + for (var iRow in oStatistics.oOperatingSystems.aData) { + if (iCount < 6) { + aItem.push(oStatistics.oOperatingSystems.aData[iRow].sOperatingSystem); + aValue.push(oStatistics.oOperatingSystems.aData[iRow].iHits); + iRunningTotal += oStatistics.oOperatingSystems.aData[iRow].iHits; + iCount++; + } + } + if (oStatistics.oOperatingSystems.iTotalHits > iRunningTotal) { + aItem.push(Lang("Other Operating Systems")); + aValue.push(oStatistics.oOperatingSystems.iTotalHits - iRunningTotal); + } + DrawPie(oStatistics.oOperatingSystems.iTotalHits, aItem, aValue); + break; + case "family": + for (var iRow in oStatistics.oOperatingSystems.aFamily) { + if (iCount < 6) { + if (oStatistics.oOperatingSystems.aFamily[iRow].iHits > 0) { + aItem.push(gc_aOSFamilyCaption[oStatistics.oOperatingSystems.aFamily[iRow].sOperatingSystem]); + aValue.push(oStatistics.oOperatingSystems.aFamily[iRow].iHits); + iRunningTotal += oStatistics.oOperatingSystems.aFamily[iRow].iHits; + iCount++; + } + } + } + if (oStatistics.oOperatingSystems.iTotalHits > iRunningTotal) { + aItem.push(Lang("Other Operating Systems")); + aValue.push(oStatistics.oOperatingSystems.iTotalHits - iRunningTotal); + } + DrawPie(oStatistics.oOperatingSystems.iTotalHits, aItem, aValue); + break; + default: + // find family totals + for (var iRow in oStatistics.oOperatingSystems.aFamily) { + if (oStatistics.oOperatingSystems.aFamily[iRow].sBrowser == sPage) { + iFamilyTotalHits = oStatistics.oOperatingSystems.aFamily[iRow].iHits; + break; + } + } + + // extract data + for (var iRow in oStatistics.oOperatingSystems.aData) { + if ((iCount < 6) && (oStatistics.oOperatingSystems.aData[iRow].sFamily == sPage)) { + aItem.push(oStatistics.oOperatingSystems.aData[iRow].sOperatingSystem); + aValue.push(oStatistics.oOperatingSystems.aData[iRow].iHits); + iRunningTotal += oStatistics.oOperatingSystems.aData[iRow].iHits; + iCount++; + } + } + if (iFamilyTotalHits > iRunningTotal) { + aItem.push(Lang("Other Versions")); + aValue.push(iFamilyTotalHits - iRunningTotal); + } + DrawPie(iFamilyTotalHits, aItem, aValue); + break; + } +} + +function DrawPie_PageRefs(sPage) { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + + // switch view + switch (sPage) { + case "all": + case "top10": + case "top50": + var aData = oStatistics.oPageRefs.aData; + var sVarName = "sURL"; + break; + case "domains": + var aData = oStatistics.oPageRefs.aDataDomain; + var sVarName = "sVisibleURL"; + break; + } + + // loop through data + for (var iIndex in aData) { + if (iCount < 6) { + aItem.push(aData[iIndex][sVarName]); + aValue.push(aData[iIndex].iPages); + iRunningTotal += aData[iIndex].iPages; + } + iCount++; + } + if (oStatistics.oPageRefs.iTotalPages > iRunningTotal) { + aItem.push(Lang("Other Referrers")); + aValue.push(oStatistics.oPageRefs.iTotalPages - iRunningTotal); + } + DrawPie(oStatistics.oPageRefs.iTotalPages, aItem, aValue); +} + +function DrawPie_PageRefsSE(sPage) { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + var aData = oStatistics.oPageRefsSE.aData; + + // loop through data + for (var iIndex in aData) { + if (iCount < 6) { + aItem.push(aData[iIndex].sReferrer); + aValue.push(aData[iIndex].iPages); + iRunningTotal += aData[iIndex].iPages; + } + iCount++; + } + if (oStatistics.oPageRefsSE.iTotalPages > iRunningTotal) { + aItem.push(Lang("Other Search Engines")); + aValue.push(oStatistics.oPageRefsSE.iTotalPages - iRunningTotal); + } + DrawPie(oStatistics.oPageRefsSE.iTotalPages, aItem, aValue); +} + +function DrawPie_Pages(aData, iTotal, sItemName) { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + for (var iIndex in aData) { + if (iCount < 6) { + aItem.push(aData[iIndex].sURL); + aValue.push(aData[iIndex][sItemName]); + iRunningTotal += aData[iIndex][sItemName]; + } + iCount++; + } + if (iTotal > iRunningTotal) { + aItem.push(Lang("Other URLs")); + aValue.push(iTotal - iRunningTotal); + } + DrawPie(iTotal, aItem, aValue); +} + +function DrawPie_Robots() { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + for (var iIndex in oStatistics.oRobots.aData) { + if (iCount < 6) { + aItem.push(oStatistics.oRobots.aData[iIndex].sRobot); + aValue.push(oStatistics.oRobots.aData[iIndex].iHits); + iRunningTotal += oStatistics.oRobots.aData[iIndex].iHits; + } + iCount++; + } + if (oStatistics.oRobots.iTotalHits > iRunningTotal) { + aItem.push(Lang("Other Spiders")); + aValue.push(oStatistics.oRobots.iTotalHits - iRunningTotal); + } + DrawPie(oStatistics.oRobots.iTotalHits, aItem, aValue); +} + +function DrawPie_Session() { + var aItem = [Lang("0 seconds - 30 seconds"), Lang("30 seconds - 2 minutes"), Lang("2 minutes - 5 minutes"), Lang("5 minutes - 15 minutes"), Lang("15 minutes - 30 minutes"), Lang("30 minutes - 1 hour"), Lang("More than 1 hour")]; + var aValue = [oStatistics.oSession.aData.s0s30s, + oStatistics.oSession.aData.s30s2mn, + oStatistics.oSession.aData.s2mn5mn, + oStatistics.oSession.aData.s5mn15mn, + oStatistics.oSession.aData.s15mn30mn, + oStatistics.oSession.aData.s30mn1h, + oStatistics.oSession.aData.s1h]; + DrawPie(oStatistics.oSession.iTotalFreq, aItem, aValue); +} + +function DrawPie_Status() { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + for (var iIndex in oStatistics.oStatus.aData) { + if (iCount < 6) { + if (oStatistics.oStatus.aData[iIndex].sDescription != " ") { + aItem.push(oStatistics.oStatus.aData[iIndex].sCode + ": " + + Lang(oStatistics.oStatus.aData[iIndex].sDescription)); + } else { + aItem.push(oStatistics.oStatus.aData[iIndex].sCode); + } + aValue.push(oStatistics.oStatus.aData[iIndex].iHits); + iRunningTotal += oStatistics.oStatus.aData[iIndex].iHits; + } + iCount++; + } + if (oStatistics.oStatus.iTotalHits > iRunningTotal) { + aItem.push(Lang("Other Status Codes")); + aValue.push(oStatistics.oStatus.iTotalHits - iRunningTotal); + } + DrawPie(oStatistics.oStatus.iTotalHits, aItem, aValue); +} + +function DrawPie_Status404() { + var aItem = []; + var aValue = []; + var iRunningTotal = 0; + var iCount = 0; + for (var iIndex in oStatistics.oStatus404.aData) { + if (iCount < 6) { + aItem.push(oStatistics.oStatus404.aData[iIndex].sURL.replace(/​/g, "")); + aValue.push(oStatistics.oStatus404.aData[iIndex].iHits); + iRunningTotal += oStatistics.oStatus404.aData[iIndex].iHits; + } + iCount++; + } + if (oStatistics.oStatus404.iTotalHits > iRunningTotal) { + aItem.push("Other URLs"); + aValue.push(oStatistics.oStatus404.iTotalHits - iRunningTotal); + } + DrawPie(oStatistics.oStatus404.iTotalHits, aItem, aValue); +} + +function DrawSubMenu(sMenu, sSelected) { + // choose object + switch (sMenu) { + case "allmonths": + oMenu = oSubMenu["AllMonths"]; + break; + case "browser": + oMenu = oSubMenu["Browser"]; + break; + case "country": + oMenu = oSubMenu["Country"]; + break; + case "keyphrases": + oMenu = oSubMenu["Keyphrases"]; + break; + case "keywords": + oMenu = oSubMenu["Keywords"]; + break; + case "os": + oMenu = oSubMenu["OS"]; + break; + case "pagerefs": + oMenu = oSubMenu["PageRefs"]; + break; + case "pages": + oMenu = oSubMenu["Pages"]; + break; + case "searches": + oMenu = oSubMenu["Searches"]; + break; + case "status": + oMenu = oSubMenu["Status"]; + break; + case "thismonth": + oMenu = oSubMenu["ThisMonth"]; + break; + default: + return "Bad SubMenu Name"; + } + + // create menu + var aMenu = []; + for (sLabel in oMenu) { + if (sSelected == sLabel) { + aMenu.push("" + Lang(sLabel) + ""); + } else { + aMenu.push("" + Lang(sLabel) + ""); + } + } + return ("
" + aMenu.join(" | ") + "
"); +} + +function DrawTable_AllMonths(sPage) { + // create header + var sHTML = "\n" + + ""; + if (sPage == "all") { + sHTML += ""; + } else { + sHTML += ""; + } + sHTML += "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + var iTotalVisits = 0; + var iTotalUniques = 0; + var iTotalPages = 0; + var iTotalHits = 0; + var iTotalBW = 0; + var iAnnualVisits = 0; + var iAnnualUniques = 0; + var iAnnualPages = 0; + var iAnnualHits = 0; + var iAnnualBW = 0; + var iCurrentYear = oStatistics.oAllMonths.aData[0].iYear; + + for (var iRow in oStatistics.oAllMonths.aData) { + oRow = oStatistics.oAllMonths.aData[iRow]; + + // create single values + var iVisits = parseInt(oRow.iVisits); + var iUniques = parseInt(oRow.iUniques); + var iPages = parseInt(oRow.iPages); + var iHits = parseInt(oRow.iHits); + var iBW = parseInt(oRow.iBW); + var iDaysInMonth = parseFloat(oRow.iDaysInMonth); + + // sum totals + iTotalVisits += iVisits; + iTotalUniques += iUniques; + iTotalPages += iPages; + iTotalHits += iHits; + iTotalBW += iBW; + iAnnualVisits += iVisits; + iAnnualUniques += iUniques; + iAnnualPages += iPages; + iAnnualHits += iHits; + iAnnualBW += iBW; + iCurrentYear = oRow.iYear; + + // create table + switch (sPage) { + case "all": + if ((g_iMonth == oRow.iMonth) && (g_iYear == oRow.iYear)) { + var sHTMLRow = ""; + } else { + var sHTMLRow = ""; + } + sHTMLRow += "" + + "" + + "" + + ""; + if (iVisits > 0) { + sHTMLRow += ""; + } else { + sHTMLRow += ""; + } + sHTMLRow += "" + + "" + + "" + + "\n"; + aHTML.push(sHTMLRow); + break; + case "year": + //if ((iCurrentYear != oRow.iYear) || (iRow == (oStatistics.oAllMonths.aData.length - 1))) { + if ((oRow.iMonth == 12) || (iRow == (oStatistics.oAllMonths.aData.length - 1))) { + var sHTMLRow = "" + + "" + + "" + + "" + + ""; + if (iAnnualVisits > 0) { + sHTMLRow += ""; + } else { + sHTMLRow += ""; + } + sHTMLRow += "" + + "" + + "" + + "\n"; + aHTML.push(sHTMLRow); + + // reset values + iAnnualVisits = 0; + iAnnualUniques = 0; + iAnnualPages = 0; + iAnnualHits = 0; + iAnnualBW = 0; + } + break; + } + } + + // output + if (aHTML.length > 0) { + sHTML = (sHTML + aHTML.join("\n") + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "
" + Lang("Month") + "" + Lang("Year") + "" + Lang("Total Visitors") + "" + Lang("Visitors per Day") + "" + Lang("Unique Visitors") + "" + Lang("Unique Ratio") + "" + Lang("Pages") + "" + Lang("Hits") + "" + Lang("BW") + "
" + oRow.dtDate.valueOf() + "" + Lang(gc_aMonthName[oRow.iMonth - 1]) + " " + oRow.iYear + "" + NumberFormat(iVisits, 0) + "" + NumberFormat((iVisits / iDaysInMonth), 1) + "" + NumberFormat(iUniques) + "" + NumberFormat(((iUniques / iVisits) * 100), 0) + "%0%" + NumberFormat(iPages, 0) + "" + NumberFormat(iHits, 0) + "" + DisplayBandwidth(iBW) + "
" + iCurrentYear + "" + NumberFormat(iAnnualVisits) + "" + NumberFormat((iAnnualVisits / oStatistics.oAllMonths.aYearDayCount[iCurrentYear]), 1) + "" + NumberFormat(iAnnualUniques, 0) + "" + NumberFormat(((iAnnualUniques / iAnnualVisits) * 100), 0) + "%0%" + NumberFormat(iAnnualPages, 0) + "" + NumberFormat(iAnnualHits, 0) + "" + DisplayBandwidth(iAnnualBW) + "
 " + NumberFormat(iTotalVisits, 0) + " " + NumberFormat(iTotalUniques, 0) + " " + NumberFormat(iTotalPages, 0) + "" + NumberFormat(iTotalHits, 0) + "" + DisplayBandwidth(iTotalBW) + "
") + return ( [ true, sHTML ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_Browser(sPage) { + // get values + iTotalHits = oStatistics.oBrowser.iTotalHits; + aData = oStatistics.oBrowser.aData; + aFamily = oStatistics.oBrowser.aFamily; + + // create table body + aHTML = new Array(); + switch (sPage) { + case "all": + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create output + for (var iRow in aData) { + iPercent = ((aData[iRow].iHits / iTotalHits) * 100); + aHTML.push("" + + "" + + "" + + "" + + "" + + "\n"); + } + break; + case "family": + // create header + var sHTML = "
 " + Lang("Browser") + "" + Lang("Hits") + " 
\""" + aData[iRow].sBrowser + "" + NumberFormat(aData[iRow].iHits, 0) + "" + iPercent.toFixed(1) + "%
\n" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create output + for (var iRow in aFamily) { + if (aFamily[iRow].iHits > 0) { + iPercent = ((aFamily[iRow].iHits / iTotalHits) * 100); + aHTML.push("" + + "" + + "" + + "" + + "" + + "\n"); + } + } + break; + default: + // create header + var sHTML = "
 " + Lang("Browser Family") + "" + Lang("Hits") + " 
\""" + gc_aBrowserFamilyCaption[aFamily[iRow].sBrowser] + "  »" + "" + NumberFormat(aFamily[iRow].iHits, 0) + "" + iPercent.toFixed(1) + "%
\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // find family totals + for (var iRow in aFamily) { + if (aFamily[iRow].sBrowser == sPage) { + iFamilyTotalHits = aFamily[iRow].iHits; + break; + } + } + + // create output + for (var iRow in aData) { + if (aData[iRow].sFamily == sPage) { + iTotalPercent = ((aData[iRow].iHits / iTotalHits) * 100); + iFamilyPercent = ((aData[iRow].iHits / iFamilyTotalHits) * 100); + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + } + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
 " + Lang("Browser") + "" + Lang("Hits") + "% " + Lang("within Family") + "% " + Lang("Overall") + "
\""" + aData[iRow].sBrowser + "" + NumberFormat(aData[iRow].iHits, 0) + "" + iFamilyPercent.toFixed(1) + "%" + iTotalPercent.toFixed(1) + "%
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_Country(sContinent) { + // get values + if (typeof sContinent == "undefined") { + iTotalPages = oStatistics.oCountry.iTotalPages; + iTotalHits = oStatistics.oCountry.iTotalHits; + iTotalBW = oStatistics.oCountry.iTotalBW; + } else { + iTotalPages = oStatistics.oCountry.oContinent[sContinent].iTotalPages; + iTotalHits = oStatistics.oCountry.oContinent[sContinent].iTotalHits; + iTotalBW = oStatistics.oCountry.oContinent[sContinent].iTotalBW; + } + aData = oStatistics.oCountry.aData; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + var aHTML = new Array(); + for (var iRow in aData) { + if (aData[iRow].sContinent == "Other") { + aData[iRow].sCountryCode = "trans"; + } + if ((typeof sContinent == "undefined") || (aData[iRow].sContinent == sContinent)) { + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""); + } + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
 " + Lang("Country") + "" + Lang("Pages") + "%" + Lang("Hits") + "%" + Lang("Bandwidth") + "%
\""" + Lang(aData[iRow].sCountryName) + "" + NumberFormat(aData[iRow].iPages, 0) + "" + (SafeDivide(aData[iRow].iPages, iTotalPages) * 100).toFixed(1) + "%" + NumberFormat(aData[iRow].iHits, 0) + "" + ((aData[iRow].iHits / iTotalHits) * 100).toFixed(1) + "%" + DisplayBandwidth(aData[iRow].iBW) + "" + ((aData[iRow].iBW / iTotalBW) * 100).toFixed(1) + "%
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_CountryContinent() { + // get values + var iTotalPages = oStatistics.oCountry.iTotalPages; + var iTotalHits = oStatistics.oCountry.iTotalHits; + var iTotalBW = oStatistics.oCountry.iTotalBW; + var iOtherPages = iTotalPages; + var iOtherHits = iTotalHits; + var iOtherBW = iTotalBW; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + for (var sContinent in gc_aContinents) { + oC = oStatistics.oCountry.oContinent[sContinent]; + iOtherPages -= oC.iTotalPages; + iOtherHits -= oC.iTotalHits; + iOtherBW -= oC.iTotalBW; + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + + // add "other" row + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + + // output + return (sHTML + aHTML.join("\n") + "
" + Lang("Continent") + "" + Lang("Pages") + "%" + Lang("Hits") + "%" + Lang("Bandwidth") + "%
" + Lang(sContinent) + "  »" + NumberFormat(oC.iTotalPages, 0) + "" + ((oC.iTotalPages / iTotalPages) * 100).toFixed(1) + "%" + NumberFormat(oC.iTotalHits, 0) + "" + ((oC.iTotalHits / iTotalHits) * 100).toFixed(1) + "%" + DisplayBandwidth(oC.iTotalBW) + "" + ((oC.iTotalBW / iTotalBW) * 100).toFixed(1) + "%
" + Lang("Other") + " »" + NumberFormat(iOtherPages, 0) + "" + ((iOtherPages / iTotalPages) * 100).toFixed(1) + "%" + NumberFormat(iOtherHits, 0) + "" + ((iOtherHits / iTotalHits) * 100).toFixed(1) + "%" + DisplayBandwidth(iOtherBW) + "" + ((iOtherBW / iTotalBW) * 100).toFixed(1) + "%
"); +} + +function DrawTable_Filetypes() { + // get values + iTotalHits = oStatistics.oFiletypes.iTotalHits; + iTotalBW = oStatistics.oFiletypes.iTotalBW; + iTotalNonCompBW = oStatistics.oFiletypes.iTotalNonCompBW; + iTotalCompBW = oStatistics.oFiletypes.iTotalCompBW; + aData = oStatistics.oFiletypes.aData; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + for (var iRow in aData) { + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
" + Lang("Filetype") + "" + Lang("Description") + "" + Lang("Hits") + " " + Lang("Bandwidth") + " " + Lang("Average Size") + "
" + oStatistics.oFiletypes.aData[iRow].sFiletype + "" + Lang(oStatistics.oFiletypes.aData[iRow].sDescription) + "" + NumberFormat(oStatistics.oFiletypes.aData[iRow].iHits, 0) + "" + ((oStatistics.oFiletypes.aData[iRow].iHits / iTotalHits) * 100).toFixed(1) + "%" + DisplayBandwidth(oStatistics.oFiletypes.aData[iRow].iBW) + "" + ((oStatistics.oFiletypes.aData[iRow].iBW / iTotalBW) * 100).toFixed(1) + "%" + DisplayBandwidth(oStatistics.oFiletypes.aData[iRow].iBW / oStatistics.oFiletypes.aData[iRow].iHits) + "
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_OperatingSystems(sPage) { + // get values + var iTotalHits = oStatistics.oOperatingSystems.iTotalHits; + var aData = oStatistics.oOperatingSystems.aData; + var aFamily = oStatistics.oOperatingSystems.aFamily; + + // create table body + var aHTML = []; + switch (sPage) { + case "all": + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create output + for (var iRow in aData) { + var iPercent = ((aData[iRow].iHits / iTotalHits) * 100); + aHTML.push("" + + "" + + "" + + "" + + "" + + "\n"); + } + break; + case "family": + // create header + var sHTML = "
 " + Lang("Operating System") + "" + Lang("Hits") + " 
\""" + aData[iRow].sOperatingSystem + "" + NumberFormat(aData[iRow].iHits, 0) + "" + iPercent.toFixed(1) + "%
\n" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create output + for (var iRow in aFamily) { + if (aFamily[iRow].iHits > 0) { + var iPercent = ((aFamily[iRow].iHits / iTotalHits) * 100); + aHTML.push("" + + "" + + "" + + "" + + "" + + "\n"); + } + } + break; + default: + // create header + var sHTML = "
 " + Lang("Operating System Family") + "" + Lang("Hits") + " 
\""" + gc_aOSFamilyCaption[aFamily[iRow].sOperatingSystem] + "  »" + "" + NumberFormat(aFamily[iRow].iHits, 0) + "" + iPercent.toFixed(1) + "%
\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // find family totals + for (var iRow in aFamily) { + if (aFamily[iRow].sOperatingSystem == sPage) { + iFamilyTotalHits = aFamily[iRow].iHits; + break; + } + } + + // create output + for (var iRow in aData) { + if (aData[iRow].sFamily == sPage) { + iTotalPercent = ((aData[iRow].iHits / iTotalHits) * 100); + iFamilyPercent = ((aData[iRow].iHits / iFamilyTotalHits) * 100); + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + } + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
 " + Lang("Operating System") + "" + Lang("Hits") + "% " + (Lang("within Family")).replace(" ", " ") + "% " + Lang("Overall") + "
\""" + aData[iRow].sOperatingSystem + "" + NumberFormat(aData[iRow].iHits, 0) + "" + iFamilyPercent.toFixed(1) + "%" + iTotalPercent.toFixed(1) + "%
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_PageRefs(sPage) { + // get values + iTotalPages = oStatistics.oPageRefs.iTotalPages; + iTotalHits = oStatistics.oPageRefs.iTotalHits; + switch (sPage) { + case "domains": + aData = oStatistics.oPageRefs.aDataDomain; + break; + default: + aData = oStatistics.oPageRefs.aData; + break; + } + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + for (var iRow in aData) { + switch (sPage) { + case "all": + case "top10": + case "top50": + sReferrer = "" + aData[iRow].sVisibleURL + ""; + break; + case "domains": + sReferrer = "" + aData[iRow].sVisibleURL + ""; + break; + default: + sReferrer = aData[iRow].sURL; + } + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "\n"); + if ((sPage == "top10") && (iRow > 9)) { + break; + } + if ((sPage == "top50") && (iRow > 49)) { + break; + } + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
" + Lang("Referrer") + "" + Lang("Pages") + " " + Lang("Hits") + " 
" + sReferrer + "" + NumberFormat(aData[iRow].iPages, 0) + "" + (SafeDivide(aData[iRow].iPages, iTotalPages) * 100).toFixed(1) + "%" + NumberFormat(aData[iRow].iHits, 0) + "" + ((aData[iRow].iHits / iTotalHits) * 100).toFixed(1) + "%
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_PageRefsSE(sPage) { + // get values + iTotalPages = oStatistics.oPageRefsSE.iTotalPages; + iTotalHits = oStatistics.oPageRefsSE.iTotalHits; + aData = oStatistics.oPageRefsSE.aData; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + for (var iRow in aData) { + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
 " + Lang("Search Engine") + "" + Lang("Pages") + " " + Lang("Hits") + " 
" + aData[iRow].sImage + "" + aData[iRow].sURL + "" + NumberFormat(aData[iRow].iPages, 0) + "" + (SafeDivide(aData[iRow].iPages, iTotalPages) * 100).toFixed(1) + "%" + NumberFormat(aData[iRow].iHits, 0) + "" + ((aData[iRow].iHits / iTotalHits) * 100).toFixed(1) + "%
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_Pages(aData) { + // get values + var iTotalPages = oStatistics.oPages.iTotalPages; + var iTotalBW = oStatistics.oPages.iTotalBW; + var iTotalEntry = oStatistics.oPages.iTotalEntry; + var iTotalExit = oStatistics.oPages.iTotalExit; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + var aHTML = []; + for (var iRow in aData) { + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
" + Lang("URL") + "" + Lang("Pages") + " " + Lang("Bandwidth") + " " + Lang("Entry") + " " + Lang("Exit") + " 
" + aData[iRow].sURL + "" + NumberFormat(aData[iRow].iPages, 0) + "" + NumberFormat(SafeDivide(aData[iRow].iPages, iTotalPages) * 100, 1) + "%" + DisplayBandwidth(aData[iRow].iBW) + "" + NumberFormat(SafeDivide(aData[iRow].iBW, iTotalBW) * 100, 1) + "%" + NumberFormat(aData[iRow].iEntry, 0) + "" + NumberFormat(SafeDivide(aData[iRow].iEntry, iTotalEntry) * 100, 1) + "%" + NumberFormat(aData[iRow].iExit, 0) + "" + NumberFormat(SafeDivide(aData[iRow].iExit, iTotalExit) * 100, 1) + "%
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_Robots() { + // get values + iTotalHits = oStatistics.oRobots.iTotalHits; + iTotalBW = oStatistics.oRobots.iTotalBW; + iTotalRobotsTXT = oStatistics.oRobots.iTotalRobotsTXT; + aData = oStatistics.oRobots.aData; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + for (var iRow in aData) { + sDate = oStatistics.oRobots.aData[iRow].dtLastVisit.toString(); + dtDate = new Date(sDate.substr(0,4), + (parseInt(StripLeadingZeroes(sDate.substr(4,2))) - 1), + sDate.substr(6,2), + sDate.substr(8,2), + sDate.substr(10,2), + sDate.substr(12,2)); + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
" + Lang("Spider") + "" + Lang("Hits") + " " + Lang("Bandwidth") + " " + Lang("Last Visit") + "Robots.txt 
" + oStatistics.oRobots.aData[iRow].sRobot + "" + NumberFormat(oStatistics.oRobots.aData[iRow].iHits, 0) + "" + ((oStatistics.oRobots.aData[iRow].iHits / iTotalHits) * 100).toFixed(1) + "%" + DisplayBandwidth(oStatistics.oRobots.aData[iRow].iBW) + "" + ((oStatistics.oRobots.aData[iRow].iBW / iTotalBW) * 100).toFixed(1) + "%" + sDate + "" + dtDate.getDate() + " " + Lang(gc_aMonthName[dtDate.getMonth()].substr(0,3)) + " '" + dtDate.getFullYear().toString().substr(2) + " " + AddLeadingZero(dtDate.getHours(), 2) + ":" + AddLeadingZero(dtDate.getMinutes(), 2) + "" + NumberFormat(oStatistics.oRobots.aData[iRow].iRobotsTXT, 0) + "" + (SafeDivide(oStatistics.oRobots.aData[iRow].iRobotsTXT, iTotalRobotsTXT) * 100).toFixed(1) + "%
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_Session() { + // get values + var iTotalFreq = oStatistics.oSession.iTotalFreq; + var aData = oStatistics.oSession.aData; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + aHTML.push("" + + "" + + "" + + "" + + "\n"); + aHTML.push("" + + "" + + "" + + "" + + "\n"); + aHTML.push("" + + "" + + "" + + "" + + "\n"); + aHTML.push("" + + "" + + "" + + "" + + "\n"); + aHTML.push("" + + "" + + "" + + "" + + "\n"); + aHTML.push("" + + "" + + "" + + "" + + "\n"); + aHTML.push("" + + "" + + "" + + "" + + "\n"); + + // output + return ( [ true, (sHTML + aHTML.join("\n") + "
" + Lang("Session Length") + "" + Lang("Frequency") + " 
" + Lang("0 seconds - 30 seconds") + "" + NumberFormat(aData.s0s30s, 0) + "" + NumberFormat(SafeDivide(aData.s0s30s, iTotalFreq) * 100, 1) + "%
" + Lang("30 seconds - 2 minutes") + "" + NumberFormat(aData.s30s2mn, 0) + "" + NumberFormat(SafeDivide(aData.s30s2mn, iTotalFreq) * 100, 1) + "%
" + Lang("2 minutes - 5 minutes") + "" + NumberFormat(aData.s2mn5mn, 0) + "" + NumberFormat(SafeDivide(aData.s2mn5mn, iTotalFreq) * 100, 1) + "%
" + Lang("5 minutes - 15 minutes") + "" + NumberFormat(aData.s5mn15mn, 0) + "" + NumberFormat(SafeDivide(aData.s5mn15mn, iTotalFreq) * 100, 1) + "%
" + Lang("15 minutes - 30 minutes") + "" + NumberFormat(aData.s15mn30mn, 0) + "" + NumberFormat(SafeDivide(aData.s15mn30mn, iTotalFreq) * 100, 1) + "%
" + Lang("30 minutes - 1 hour") + "" + NumberFormat(aData.s30mn1h, 0) + "" + NumberFormat(SafeDivide(aData.s30mn1h, iTotalFreq) * 100, 1) + "%
" + Lang("More than 1 hour") + "" + NumberFormat(aData.s1h, 0) + "" + NumberFormat(SafeDivide(aData.s1h, iTotalFreq) * 100, 1) + "%
") ] ); +} + +function DrawTable_Status() { + // get values + iTotalHits = oStatistics.oStatus.iTotalHits; + iTotalBW = oStatistics.oStatus.iTotalBW; + aData = oStatistics.oStatus.aData; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + for (var iRow in aData) { + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
" + Lang("Code") + "" + Lang("Description") + "" + Lang("Hits") + " " + Lang("Bandwidth") + " " + Lang("Average Size") + "
" + oStatistics.oStatus.aData[iRow].sCode + "" + Lang(oStatistics.oStatus.aData[iRow].sDescription) + "" + NumberFormat(oStatistics.oStatus.aData[iRow].iHits, 0) + "" + ((oStatistics.oStatus.aData[iRow].iHits / iTotalHits) * 100).toFixed(1) + "%" + DisplayBandwidth(oStatistics.oStatus.aData[iRow].iBW) + "" + ((oStatistics.oStatus.aData[iRow].iBW / iTotalBW) * 100).toFixed(1) + "%" + DisplayBandwidth(oStatistics.oStatus.aData[iRow].iBW / oStatistics.oStatus.aData[iRow].iHits) + "
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_Status404() { + // get values + iTotalHits = oStatistics.oStatus404.iTotalHits; + aData = oStatistics.oStatus404.aData; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + var sReferrer = ""; + for (var iRow in aData) { + if (oStatistics.oStatus404.aData[iRow].sReferrer == "-") { + sReferrer = " "; + } else { + sReferrer = ("" + oStatistics.oStatus404.aData[iRow].sReferrerVisible + ""); + } + aHTML.push("" + + "" + + "" + + "" + + "\n"); + } + + // output + if (aHTML.length > 0) { + return ( [ true, (sHTML + aHTML.join("\n") + "
" + Lang("URL") + "" + Lang("Hits") + "" + Lang("Referrer") + "
" + oStatistics.oStatus404.aData[iRow].sURL + "" + NumberFormat(oStatistics.oStatus404.aData[iRow].iHits, 0) + "" + sReferrer + "
") ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_ThisMonth() { + // get values + iTotalVisits = oStatistics.oThisMonth.iTotalVisits; + iTotalPages = oStatistics.oThisMonth.iTotalPages; + iTotalHits = oStatistics.oThisMonth.iTotalHits; + iTotalBW = oStatistics.oThisMonth.iTotalBW; + aData = oStatistics.oThisMonth.aData; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + for (var iRow in aData) { + oRow = oStatistics.oThisMonth.aData[iRow]; + sVisibleDate = (oRow.dtDate.getDate() + " " + + Lang(gc_aMonthName[oRow.dtDate.getMonth()].substr(0,3)) + " '" + + oRow.dtDate.getFullYear().toString().substr(2)); + if (oRow.dtDate.getDay() == 0) { + sRowStyle = " class=\"sunday\""; + } else if (oRow.dtDate.getDay() == 6) { + sRowStyle = " class=\"saturday\""; + } else { + sRowStyle = ""; + } + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + + // output + if (aHTML.length > 0) { + sHTML = (sHTML + aHTML.join("\n") + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "
" + Lang("Day") + "" + Lang("Date") + "" + Lang("Visits") + "" + Lang("Pages") + "" + Lang("per Visit") + "" + Lang("Hits") + "" + Lang("per Visit") + "" + Lang("BW") + "" + Lang("per Visit") + "
" + oRow.dtDate.getDay() + "" + Lang(gc_aDayName[oRow.dtDate.getDay()]) + "" + oRow.dtDate.valueOf() + "" + sVisibleDate + "" + NumberFormat(oRow.iVisits, 0) + "" + NumberFormat(oRow.iPages, 0) + "" + NumberFormat((SafeDivide(oRow.iPages, oRow.iVisits)), 1) + "" + NumberFormat(oRow.iHits, 0) + "" + NumberFormat(SafeDivide(oRow.iHits, oRow.iVisits), 1) + "" + DisplayBandwidth(oRow.iBW) + "" + DisplayBandwidth(SafeDivide(oRow.iBW, oRow.iVisits)) + "
" + NumberFormat(iTotalVisits, 0) + "" + NumberFormat(iTotalPages, 0) + "" + NumberFormat(SafeDivide(iTotalPages, iTotalVisits), 1) + "" + NumberFormat(iTotalHits) + "" + NumberFormat(SafeDivide(iTotalHits, iTotalVisits), 2) + "" + DisplayBandwidth(iTotalBW) + "" + DisplayBandwidth(SafeDivide(iTotalBW, iTotalVisits)) + "
") + return ( [ true, sHTML ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } +} + +function DrawTable_Time() { + // get values + var iTotalPages = oStatistics.oTime.iTotalPages; + var iTotalHits = oStatistics.oTime.iTotalHits; + var iTotalBW = oStatistics.oTime.iTotalBW; + var iTotalNVPages = oStatistics.oTime.iTotalNVPages; + var iTotalNVHits = oStatistics.oTime.iTotalNVHits; + var iTotalNVBW = oStatistics.oTime.iTotalNVBW; + + // create header + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + var aHTML = []; + var iAvgPages = (iTotalPages / 24); + var iAvgHits = (iTotalHits / 24); + var iAvgBW = (iTotalBW / 24); + for (var iRow in oStatistics.oTime.aData) { + var oRow = oStatistics.oTime.aData[iRow]; + var sHour = oRow.iHour; + if (oRow.iHour < 10) { + sHour = ("0" + sHour) + } + + // +/- values + var sPagesDiff = Difference(oRow.iPages, iAvgPages); + var sHitsDiff = Difference(oRow.iHits, iAvgHits); + var sBWDiff = Difference(oRow.iBW, iAvgBW); + + // create table + aHTML.push("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "\n"); + } + + // output + if (aHTML.length > 0) { + sHTML = (sHTML + aHTML.join("\n") + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "
" + Lang("Hour") + "" + Lang("Pages") + "%+/-" + Lang("Hits") + "%+/-" + Lang("BW") + "%+/-" + (Lang("Not Viewed")).replace(" ", " ") + "
" + Lang("Pages") + "
" + (Lang("Not Viewed")).replace(" ", " ") + "
" + Lang("Hits") + "
" + (Lang("Not Viewed")).replace(" ", " ") + "
" + Lang("BW") + "
" + sHour + "" + NumberFormat(oRow.iPages, 0) + "" + NumberFormat((SafeDivide(oRow.iPages, iTotalPages) * 100), 1) + "%" + sPagesDiff + "" + NumberFormat(oRow.iHits, 0) + "" + NumberFormat((SafeDivide(oRow.iHits, iTotalHits) * 100), 1) + "%" + sHitsDiff + "" + DisplayBandwidth(oRow.iBW) + "" + NumberFormat((SafeDivide(oRow.iBW, iTotalBW) * 100), 1) + "%" + sBWDiff + "" + NumberFormat(oRow.iNVPages, 0) + "" + NumberFormat(oRow.iNVHits, 0) + "" + DisplayBandwidth(oRow.iNVBW) + "
 " + NumberFormat(iTotalPages, 0) + "  " + NumberFormat(iTotalHits, 0) + "  " + DisplayBandwidth(iTotalBW) + "  " + NumberFormat(iTotalNVPages, 0) + "" + NumberFormat(iTotalNVHits, 0) + "" + DisplayBandwidth(iTotalNVBW) + "
") + return ( [ true, sHTML ] ); + } else { + return ( [ false, (sHTML + "" + Lang("There is no data to display") + "") ] ); + } + + function Difference(iValue, iAverage) { + if (iValue == iAverage) { + return "-"; + } else { + if (iValue > iAverage) { + return ("+" + NumberFormat((SafeDivide((iValue - iAverage), iAverage) * 100), 1) + "%"); + } else { + return ("-" + NumberFormat((SafeDivide((iAverage - iValue), iAverage) * 100), 1) + "%"); + } + } + } +} + +function Lang(sPhrase) { + return (oTranslation[sPhrase] || sPhrase); +} + +function Misc_ThisMonthCalendar(sHeadline, sSubMenu, sDataItem) { + // create sum arrays + var aWeek = []; + var aDay = []; + for (var iIndex = 0; iIndex < 7; iIndex++) { + aDay[iIndex] = { iCount:0, iTotal:0 }; + } + var iTotal = 0; + + // calculate dates + var iFirstWeek = getWeekNr(oStatistics.oThisMonth.aData[0].dtDate); + var dtLastDayOfMonth = new Date(oStatistics.oThisMonth.aData[0].dtDate.getFullYear(), + (oStatistics.oThisMonth.aData[0].dtDate.getMonth() + 1), + 0); + var iLastWeek = getWeekNr(dtLastDayOfMonth); + + // create table + var sHTML = "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + for (var iIndex = iFirstWeek; iIndex <= iLastWeek; iIndex++) { + aWeek[iIndex] = { iCount:0, iTotal:0 }; + sHTML += "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + } + sHTML += "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + sHTML += "
 " + Lang("Monday") + "" + Lang("Tuesday") + "" + Lang("Wednesday") + "" + Lang("Thursday") + "" + Lang("Friday") + "" + Lang("Saturday") + "" + Lang("Sunday") + " " + Lang("Week Total") + "" + Lang("Daily Average") + "
" + Lang("Week") + ": " + iIndex + "          
   
" + Lang("Day of Week Total") + "         
" + Lang("Day of Week Average") + "         
"; + + // apply content + $("#content").html("

" + Lang(sHeadline) + "

" + + DrawSubMenu("thismonth", sSubMenu) + + "
" + sHTML + "
"); + + // populate daily values + for (var iRow in oStatistics.oThisMonth.aData) { + var oRow = oStatistics.oThisMonth.aData[iRow]; + var iWeekNumber = getWeekNr(oRow.dtDate); + var iDayNumber = oRow.dtDate.getDay(); + + // increment counters + aWeek[iWeekNumber].iCount++; + aWeek[iWeekNumber].iTotal += oRow[sDataItem]; + aDay[iDayNumber].iCount++; + aDay[iDayNumber].iTotal += oRow[sDataItem]; + iTotal += oRow[sDataItem]; + + // modify table + if (sDataItem == "iBW") { + sHTML = ("
" + oRow.dtDate.getDate() + "
" + DisplayBandwidth(oRow[sDataItem]) + "
"); + } else { + sHTML = ("
" + oRow.dtDate.getDate() + "
" + NumberFormat(oRow[sDataItem], 0) + "
"); + } + $("#calDay" + iDayNumber + "-" + iWeekNumber).html(sHTML).addClass("calDayPopulated"); + } + + // populate week totals + for (var iIndex = iFirstWeek; iIndex <= iLastWeek; iIndex++) { + if (aWeek[iIndex].iCount > 0) { + if (sDataItem == "iBW") { + $("#calTotWk" + iIndex).html("
" + DisplayBandwidth(aWeek[iIndex].iTotal) + "
"); + $("#calAvgWk" + iIndex).html("
" + DisplayBandwidth(aWeek[iIndex].iTotal / aWeek[iIndex].iCount) + "
"); + } else { + $("#calTotWk" + iIndex).html("
" + NumberFormat(aWeek[iIndex].iTotal, 0) + "
"); + $("#calAvgWk" + iIndex).html("
" + NumberFormat((aWeek[iIndex].iTotal / aWeek[iIndex].iCount), 1) + "
"); + } + } + } + + // populate day totals + for (var iIndex = 0; iIndex < 7; iIndex++) { + if (aDay[iIndex].iCount > 0) { + if (sDataItem == "iBW") { + $("#calTotDay" + iIndex).html("
" + DisplayBandwidth(aDay[iIndex].iTotal) + "
"); + $("#calAvgDay" + iIndex).html("
" + DisplayBandwidth(aDay[iIndex].iTotal / aDay[iIndex].iCount) + "
"); + } else { + $("#calTotDay" + iIndex).html("
" + NumberFormat(aDay[iIndex].iTotal, 0) + "
"); + $("#calAvgDay" + iIndex).html("
" + NumberFormat((aDay[iIndex].iTotal / aDay[iIndex].iCount), 1) + "
"); + } + } + } + + // fill in any remaining empty days + var dtThisDate = new Date(oRow.dtDate.getFullYear(), oRow.dtDate.getMonth(), (oRow.dtDate.getDate() + 1)); + while (dtThisDate.getMonth() == dtLastDayOfMonth.getMonth()) { + $("#calDay" + dtThisDate.getDay() + "-" + getWeekNr(dtThisDate)).html("
" + dtThisDate.getDate() + "
").addClass("calDay"); + dtThisDate.setDate(dtThisDate.getDate() + 1); + } + + // populate month totals + if (sDataItem == "iBW") { + $("#calTotMonth").html("
" + Lang("Total") + ": " + DisplayBandwidth(iTotal) + "
"); + $("#calAvgMonth").html("
" + Lang("Average") + ": " + DisplayBandwidth(iTotal / oRow.dtDate.getDate()) + "
"); + } else { + $("#calTotMonth").html("
" + Lang("Total") + ": " + NumberFormat(iTotal, 0) + "
"); + $("#calAvgMonth").html("
" + Lang("Average") + ": " + NumberFormat((iTotal / oRow.dtDate.getDate()), 1) + "
"); + } + + // draw graph + var aGraphItem = [Lang("Monday"), Lang("Tuesday"), Lang("Wednesday"), Lang("Thursday"), Lang("Friday"), Lang("Saturday"), Lang("Sunday")]; + var aGraphValue = [SafeDivide(aDay[1].iTotal, aDay[1].iCount), + SafeDivide(aDay[2].iTotal, aDay[2].iCount), + SafeDivide(aDay[3].iTotal, aDay[3].iCount), + SafeDivide(aDay[4].iTotal, aDay[4].iCount), + SafeDivide(aDay[5].iTotal, aDay[5].iCount), + SafeDivide(aDay[6].iTotal, aDay[6].iCount), + SafeDivide(aDay[0].iTotal, aDay[0].iCount)]; + DrawGraph(["","","","","","",""], aGraphValue, aGraphItem, "bar"); +} + +function PageLayout_AllMonths(sPage) { + var aTable = DrawTable_AllMonths(sPage); + switch (sPage) { + case "all": + var sHTML = "

" + Lang("Visitors each Month") + "

" + + DrawSubMenu("allmonths", "Visitors each Month") + + "
 
"; + break; + case "year": + var sHTML = "

" + Lang("Visitors each Year") + "

" + + DrawSubMenu("allmonths", "Visitors each Year"); + break; + } + sHTML += "
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers:{1:{sorter:"commaNumber"},2:{sorter:"commaNumber"},3:{sorter:"commaNumber"},5:{sorter:"commaNumber"},6:{sorter:"commaNumber"},7:{sorter:'bandwidth'}},sortList: [[0,0]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + if (sPage == "all") { + DrawGraph_AllMonths(); + } + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Browser(sPage) { + var aTable = DrawTable_Browser(sPage); + switch (sPage) { + case "family": + var sHTML = "

" + Lang("Browser Families") + "

" + + DrawSubMenu("browser", "Browser Families") + + "
 
" + aTable[1] + "
"; + break; + case "all": + var sHTML = "

" + Lang("All Browsers") + "

" + + DrawSubMenu("browser", "All Browsers") + + "
 
" + aTable[1] + "
"; + break; + default: + var sHTML = "

" + Lang("Browser Family") + ": " + gc_aBrowserFamilyCaption[sPage] + "

" + + DrawSubMenu("browser", "") + + "
 
" + aTable[1] + "
"; + } + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 0: { sorter: false }, 2:{sorter:"commaNumber"}, 3: { sorter: false } }, sortList: [[2,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_Browser(sPage); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Country(sPage) { + switch (sPage) { + case "all": + var aTable = DrawTable_Country(); + var sHTML = "

" + Lang("Visitors by Country") + "

" + + DrawSubMenu("country", "Countries") + + "
 
" + + aTable[1] + + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter( { headers: { 0:{sorter:false},2:{sorter:"commaNumber"},3:{sorter:false},4:{sorter:"commaNumber"},5:{sorter:false},6:{sorter:'bandwidth'},7:{sorter:false} }, sortList: [[2,1]], textExtraction:function(node){return node.innerHTML.replace(',','');}, widgets: ['zebra'] } ); + } + DrawPie_Country(); + break; + case "continent": + var sHTML = "

" + Lang("Visitors by Continent") + "

" + + DrawSubMenu("country", "Continents") + + "
 
" + + DrawTable_CountryContinent() + + "
"; + $("#content").html(sHTML); + $(".tablesorter").tablesorter( { headers: { 1:{sorter:"commaNumber"}, 2: { sorter: false }, 3:{sorter:"commaNumber"}, 4: { sorter: false },5:{sorter:'bandwidth'}, 6: { sorter: false } }, sortList: [[1,1]], textExtraction: function(node) { return node.innerHTML.replace(',', '');}, widgets: ['zebra'] } ); + DrawPie_CountryContinent(); + break; + default: + if (sPage == "Other") { + var sHTML = "

" + Lang("Other Visitors") + "

"; + } else { + var sHTML = "

" + Lang("Visitors from " + sPage) + "

"; + } + var aTable = DrawTable_Country(sPage); + sHTML += DrawSubMenu("country", sPage) + + "
 
" + + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter( { headers: { 0:{sorter:false},2:{sorter:"commaNumber"},3:{sorter:false},4:{sorter:"commaNumber"},5:{sorter:false},6:{sorter:'bandwidth'},7:{sorter:false } }, sortList: [[2,1]], textExtraction: function(node) { return node.innerHTML.replace(',', '');}, widgets: ['zebra'] } ); + } + DrawPie_Country(sPage); + break; + } + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Filetypes() { + var aTable = DrawTable_Filetypes(); + var sHTML = "

" + Lang("Filetypes") + "

 
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 2:{sorter:"commaNumber"}, 3: { sorter: false }, 4:{sorter:'bandwidth'}, 5: { sorter: false }, 6:{sorter:'bandwidth'} }, sortList: [[2,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_Filetypes(); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_OperatingSystems(sPage) { + var aTable = DrawTable_OperatingSystems(sPage); + switch (sPage) { + case "family": + var sHTML = "

" + Lang("Operating System Families") + "

" + + DrawSubMenu("os", "Operating System Families") + + "
 
" + aTable[1] + "
"; + break; + case "all": + var sHTML = "

" + Lang("Operating Systems") + "

" + + DrawSubMenu("os", "All Operating Systems") + + "
 
" + aTable[1] + "
"; + break; + default: + var sHTML = "

" + Lang("Operating System Family") + ": " + gc_aOSFamilyCaption[sPage] + "

" + + DrawSubMenu("os", "") + + "
 
" + aTable[1] + "
"; + } + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 0: { sorter: false }, 2: { sorter: "commaNumber" }, 3: { sorter: false }, 4: { sorter: false } }, sortList: [[2,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_OperatingSystems(sPage); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_PageRefs(sPage) { + switch (sPage) { + case "all": + var aTable = DrawTable_PageRefs("all"); + var sHTML = "

" + Lang("Referring Pages") + "

" + + DrawSubMenu("pagerefs", "All Referrers") + + "
 
" + aTable[1] + "
"; + break; + case "domains": + var aTable = DrawTable_PageRefs("domains"); + var sHTML = "

" + Lang("Referring Domains") + "

" + + DrawSubMenu("pagerefs", "Referring Domains") + + "
 
" + aTable[1] + "
"; + break; + case "top10": + var aTable = DrawTable_PageRefs("top10"); + var sHTML = "

" + Lang("Referring Pages") + "

" + + DrawSubMenu("pagerefs", "Top 10 Referrers") + + "
 
" + aTable[1] + "
"; + break; + case "top50": + var aTable = DrawTable_PageRefs("top50"); + var sHTML = "

" + Lang("Referring Pages") + "

" + + DrawSubMenu("pagerefs", "Top 50 Referrers") + + "
 
" + aTable[1] + "
"; + break; + } + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 1:{sorter:"commaNumber"}, 2: { sorter: false }, 3:{sorter:"commaNumber"}, 4: { sorter: false } }, sortList: [[1,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_PageRefs(sPage); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_PageRefsSE() { + var aTable = DrawTable_PageRefsSE(); + var sHTML = "

" + Lang("Referring Search Engines") + "

" + + DrawSubMenu("pagerefs", "Search Engines") + + "
 
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 0: { sorter: false }, 2:{sorter:"commaNumber"}, 3: { sorter: false }, 4:{sorter:"commaNumber"}, 5: { sorter: false } }, sortList: [[2,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_PageRefsSE(); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Pages(sPage) { + // select data + switch (sPage) { + case "topBW": + var aData = oStatistics.oPages.aDataBW; + var aSort = [3,1]; + var sSubMenu = "Top Bandwidth"; + var iPieTotal = oStatistics.oPages.iTotalBW; + var sPieItem = "iBW"; + break; + case "topEntry": + var aData = oStatistics.oPages.aDataEntry; + var aSort = [5,1]; + var sSubMenu = "Top Entry Pages"; + var iPieTotal = oStatistics.oPages.iTotalEntry; + var sPieItem = "iEntry"; + break; + case "topExit": + var aData = oStatistics.oPages.aDataExit; + var aSort = [7,1]; + var sSubMenu = "Top Exit Pages"; + var iPieTotal = oStatistics.oPages.iTotalExit; + var sPieItem = "iExit"; + break; + case "topPages": + var aData = oStatistics.oPages.aDataPages; + var aSort = [1,1]; + var sSubMenu = "Top Page Views"; + var iPieTotal = oStatistics.oPages.iTotalPages; + var sPieItem = "iPages"; + break; + } + + // create html + var aTable = DrawTable_Pages(aData); + var sHTML = "

" + Lang("Page Views") + "

" + + DrawSubMenu("pages", sSubMenu) + + "
 
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 2: { sorter: false }, 3:{sorter:'bandwidth'}, 4: { sorter: false }, 6: { sorter: false }, 8: { sorter: false } }, sortList: [aSort],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_Pages(aData, iPieTotal, sPieItem); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Robots() { + var aTable = DrawTable_Robots(); + var sHTML = "

" + Lang("Visiting Spiders") + "

 
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 1:{sorter:"commaNumber"}, 2: { sorter: false }, 3:{sorter:'bandwidth'}, 4: { sorter: false }, 6:{sorter:"commaNumber"}, 7: { sorter: false } }, sortList: [[1,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_Robots(); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Searches(sPage) { + switch (sPage) { + case "keyphrasecloud": + var sHTML = "

" + Lang("Keyphrases Tag Cloud") + "

" + + DrawSubMenu("searches", "Keyphrases Tag Cloud") + + "
" + TagCloud("sPhrase", oStatistics.oKeyphrases, 75) + "
"; + $("#content").html(sHTML); + break; + case "keyphrases": + var sHTML = "

" + Lang("Keyphrases") + "

" + + DrawSubMenu("searches", "Keyphrases") + + "
 
" + Paging_Keyphrases() + "
"; + $("#content").html(sHTML); + DrawPie_Keyphrases(); + break; + case "keywordcloud": + var sHTML = "

" + Lang("Keywords Tag Cloud") + "

" + + DrawSubMenu("searches", "Keywords Tag Cloud") + + "
" + TagCloud("sWord", oStatistics.oKeywords, 150) + "
"; + $("#content").html(sHTML); + break; + case "keywords": + var sHTML = "

" + Lang("Keywords") + "

" + + DrawSubMenu("searches", "Keywords") + + "
 
" + Paging_Keywords() + "
"; + $("#content").html(sHTML); + DrawPie_Keywords(); + break; + } + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Session() { + var aTable = DrawTable_Session(); + var sHTML = "

" + Lang("Session Duration") + "

 
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + //$(".tablesorter").tablesorter({ headers: { 0: { sorter: false }, 1:{sorter:"commaNumber"}, 2: { sorter: false } }, sortList: [[1,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + $(".tablesorter").tablesorter({ headers: { 1:{sorter:"commaNumber"}, 2: { sorter: false } }, sortList: [[0,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_Session(); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Status(sPage) { + switch (sPage) { + case "404": + var aTable = DrawTable_Status404(); + var sHTML = "

" + Lang("HTTP Status Codes") + ": 404s

" + + DrawSubMenu("status", "File Not Found URLs") + + "
 
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 1: { sorter: "commaNumber" } }, sortList: [[1,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_Status404(sPage); + break; + default: + var aTable = DrawTable_Status(); + var sHTML = "

" + Lang("HTTP Status Codes") + "

" + + DrawSubMenu("status", "Status Codes") + + "
 
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers: { 2: { sorter: "commaNumber" }, 3:{ sorter: false }, 4: { sorter: "bandwidth" }, 5: { sorter: false } }, sortList: [[2,1]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawPie_Status(sPage); + } + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_ThisMonth(sPage) { + switch (sPage) { + case "all": + var aTable = DrawTable_ThisMonth(); + var sHTML = "

" + Lang("Visitors this Month") + "

" + + DrawSubMenu("thismonth", "Overview") + + "
 
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers:{ 2:{sorter:"commaNumber"},3:{sorter:"commaNumber"},5:{sorter:"commaNumber"},7:{sorter:"bandwidth"},8:{sorter:"bandwidth"}},sortList:[[1,0]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawGraph_ThisMonth(); + break; + case "bandwidth": + Misc_ThisMonthCalendar("Calendar of Bandwidth Usage this Month", "Calendar of Bandwidth Usage", "iBW"); + break; + case "hits": + Misc_ThisMonthCalendar("Calendar of Hits this Month", "Calendar of Hits", "iHits"); + break; + case "pages": + Misc_ThisMonthCalendar("Calendar of Page Views this Month", "Calendar of Page Views", "iPages"); + break; + case "visits": + Misc_ThisMonthCalendar("Calendar of Visitors this Month", "Calendar of Visitors", "iVisits"); + break; + } + $("#content").fadeIn(g_iFadeSpeed); +} + +function PageLayout_Time(sPage) { + var aTable = DrawTable_Time(sPage); + var sHTML = "

" + Lang("Visitors over 24 Hours") + "

" + + "
 
" + + "
" + aTable[1] + "
"; + $("#content").html(sHTML); + if (aTable[0] == true) { + $(".tablesorter").tablesorter({ headers:{1:{sorter:"commaNumber"},2:{sorter:false},3:{sorter:false},4:{sorter:"commaNumber"},5:{sorter:false},6:{sorter:false},7:{sorter:'bandwidth'},8:{sorter:false},9:{sorter:false},10:{sorter:"commaNumber"},11:{sorter:"commaNumber"},12:{sorter:'bandwidth'}},sortList: [[0,0]],textExtraction:function(node){return node.innerHTML.replace(',', '');}, widgets: ['zebra'] }); + } + DrawGraph_Time(); + $("#content").fadeIn(g_iFadeSpeed); +} + +function PagingInputNumber(oEvent, oInput, sType) { + var iCode = (oEvent.charCode || oEvent.keyCode); + if (iCode == 13) { + var iValue = parseFloat($(oInput).val()); + if (isNaN(iValue) == true) { return false; } + if (iValue < 1) { return false; } + if (iValue != Math.round(iValue)) { return false; } + switch (sType) { + case "keyphrases": + if (iValue > (Math.floor((oStatistics.oKeyphrases.aData.length - 1) / oPaging.oKeyphrases.iRowsPerPage) + 1)) { return false; } + RedrawTable_Keyphrases("iCurrPage", (iValue - 1)); + break; + case "keywords": + if (iValue > (Math.floor((oStatistics.oKeywords.aData.length - 1) / oPaging.oKeywords.iRowsPerPage) + 1)) { return false; } + RedrawTable_Keywords("iCurrPage", (iValue - 1)); + break; + } + } + if ((iCode == 8) || (iCode == 9) || ((iCode > 34) && (iCode < 38)) || (iCode == 39) || (iCode == 46) || ((iCode > 47) && (iCode < 58))) { + return true; + } else { + return false; + } +} + +function Paging_Keyphrases() { + // get values + iTotalFreq = oStatistics.oKeyphrases.iTotalFreq; + switch (oPaging.oKeyphrases.sSort) { + case "freqASC": + var sKeyphraseClass = ""; + var sFrequencyClass = " headerSortDown"; + var sKeyphraseSort = "wordDESC"; + var sFrequencySort = "freqDESC"; + var aData = oStatistics.oKeyphrases.aData; + var iDisplayOrder = -1; + break; + case "freqDESC": + var sKeyphraseClass = ""; + var sFrequencyClass = " headerSortUp"; + var sKeyphraseSort = "wordDESC"; + var sFrequencySort = "freqASC"; + var aData = oStatistics.oKeyphrases.aData; + var iDisplayOrder = 1; + break; + case "wordASC": + var sKeyphraseClass = " headerSortDown"; + var sFrequencyClass = ""; + var sKeyphraseSort = "wordDESC"; + var sFrequencySort = "freqDESC"; + var aData = oStatistics.oKeyphrasesAlphabetical.aData; + var iDisplayOrder = -1; + break; + case "wordDESC": + var sKeyphraseClass = " headerSortUp"; + var sFrequencyClass = ""; + var sKeyphraseSort = "wordASC"; + var sFrequencySort = "freqDESC"; + var aData = oStatistics.oKeyphrasesAlphabetical.aData; + var iDisplayOrder = 1; + break; + } + + // create header + var sDesc = (Lang("Showing [START] to [END] of [TOTAL] keyphrases")).replace("[TOTAL]", aData.length); + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + if (iDisplayOrder == 1) { + var iStart = (oPaging.oKeyphrases.iCurrPage * oPaging.oKeyphrases.iRowsPerPage); + var iEnd = (iStart + oPaging.oKeyphrases.iRowsPerPage); + if (iEnd > aData.length) { + iEnd = aData.length; + } + sDesc = sDesc.replace("[START]", iStart + 1).replace("[END]", iEnd); + for (var i = iStart; i < iEnd; i++) { + aHTML.push(((i % 2 == 0) ? "" : "") + + "" + + "" + + "" + + "\n"); + } + } else { + if (aData.length > 0) { + var iStart = (aData.length - 1) - (oPaging.oKeyphrases.iCurrPage * oPaging.oKeyphrases.iRowsPerPage); + var iEnd = (iStart - oPaging.oKeyphrases.iRowsPerPage); + if (iEnd < -1) { + iEnd = -1; + } + sDesc = sDesc.replace("[START]", iStart + 1).replace("[END]", iEnd + 2); + for (var i = iStart; i > iEnd; i--) { + aHTML.push(((i % 2 == 0) ? "" : "") + + "" + + "" + + "" + + "\n"); + } + } + } + + // output + if (aHTML.length > 0) { + var iMaxPage = Math.floor((aData.length - 1) / oPaging.oKeyphrases.iRowsPerPage); + var sNavigation = "
" + sDesc + ""; + if (oPaging.oKeyphrases.iCurrPage > 0) { + sNavigation += "" + + ""; + } else { + sNavigation += "" + + ""; + } + sNavigation += "" + " / " + (iMaxPage + 1) + ""; + if (oPaging.oKeyphrases.iCurrPage < iMaxPage) { + sNavigation += "" + + ""; + } else { + sNavigation += "" + + ""; + } + sNavigation += "
"; + return (sHTML + aHTML.join("\n") + "
" + Lang("Keyphrase") + "" + Lang("Frequency") + " 
" + aData[i].sPhrase + "" + NumberFormat(aData[i].iFreq, 0) + "" + ((aData[i].iFreq / iTotalFreq) * 100).toFixed(1) + "%
" + aData[i].sPhrase + "" + NumberFormat(aData[i].iFreq, 0) + "" + ((aData[i].iFreq / iTotalFreq) * 100).toFixed(1) + "%
" + sNavigation); + } else { + return (sHTML + "" + Lang("There is no data to display") + ""); + } +} + +function Paging_Keywords() { + // get values + iTotalFreq = oStatistics.oKeywords.iTotalFreq; + switch (oPaging.oKeywords.sSort) { + case "freqASC": + var sKeywordClass = ""; + var sFrequencyClass = " headerSortDown"; + var sKeywordSort = "wordDESC"; + var sFrequencySort = "freqDESC"; + var aData = oStatistics.oKeywords.aData; + var iDisplayOrder = -1; + break; + case "freqDESC": + var sKeywordClass = ""; + var sFrequencyClass = " headerSortUp"; + var sKeywordSort = "wordDESC"; + var sFrequencySort = "freqASC"; + var aData = oStatistics.oKeywords.aData; + var iDisplayOrder = 1; + break; + case "wordASC": + var sKeywordClass = " headerSortDown"; + var sFrequencyClass = ""; + var sKeywordSort = "wordDESC"; + var sFrequencySort = "freqDESC"; + var aData = oStatistics.oKeywordsAlphabetical.aData; + var iDisplayOrder = -1; + break; + case "wordDESC": + var sKeywordClass = " headerSortUp"; + var sFrequencyClass = ""; + var sKeywordSort = "wordASC"; + var sFrequencySort = "freqDESC"; + var aData = oStatistics.oKeywordsAlphabetical.aData; + var iDisplayOrder = 1; + break; + } + + // create header + var sDesc = (Lang("Showing [START] to [END] of [TOTAL] keywords")).replace("[TOTAL]", aData.length); + var sHTML = "\n" + + "" + + "" + + "" + + "" + + "\n" + + ""; + + // create table body + aHTML = new Array(); + if (iDisplayOrder == 1) { + var iStart = (oPaging.oKeywords.iCurrPage * oPaging.oKeywords.iRowsPerPage); + var iEnd = (iStart + oPaging.oKeywords.iRowsPerPage); + if (iEnd > aData.length) { + iEnd = aData.length; + } + sDesc = sDesc.replace("[START]", iStart + 1).replace("[END]", iEnd); + for (var i = iStart; i < iEnd; i++) { + aHTML.push(((i % 2 == 0) ? "" : "") + + "" + + "" + + "" + + "\n"); + } + } else { + if (aData.length > 0) { + var iStart = (aData.length - 1) - (oPaging.oKeywords.iCurrPage * oPaging.oKeywords.iRowsPerPage); + var iEnd = (iStart - oPaging.oKeywords.iRowsPerPage); + if (iEnd < -1) { + iEnd = -1; + } + sDesc = sDesc.replace("[START]", iStart + 1).replace("[END]", iEnd + 2); + for (var i = iStart; i > iEnd; i--) { + aHTML.push(((i % 2 == 0) ? "" : "") + + "" + + "" + + "" + + "\n"); + } + } + } + + // output + if (aHTML.length > 0) { + var iMaxPage = Math.floor((aData.length - 1) / oPaging.oKeywords.iRowsPerPage); + var sNavigation = "
" + sDesc + ""; + if (oPaging.oKeywords.iCurrPage > 0) { + sNavigation += "" + + ""; + } else { + sNavigation += "" + + ""; + } + sNavigation += "" + " / " + (iMaxPage + 1) + ""; + if (oPaging.oKeywords.iCurrPage < iMaxPage) { + sNavigation += "" + + ""; + } else { + sNavigation += "" + + ""; + } + sNavigation += "
"; + return (sHTML + aHTML.join("\n") + "
" + Lang("Keyword") + "" + Lang("Frequency") + " 
" + aData[i].sWord + "" + NumberFormat(aData[i].iFreq, 0) + "" + ((aData[i].iFreq / iTotalFreq) * 100).toFixed(1) + "%
" + aData[i].sWord + "" + NumberFormat(aData[i].iFreq, 0) + "" + ((aData[i].iFreq / iTotalFreq) * 100).toFixed(1) + "%
" + sNavigation); + } else { + return (sHTML + "" + Lang("There is no data to display") + ""); + } +} + +function PopulateData_AllMonths(sPage) { + $("#loading").show(); + + // create data objects + var oAM = { "aData":[], "aYearDayCount":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("ALLMONTHS"), + success: function(oXML){ + // CheckLastUpdate(oXML); disabled until update problem is fixed. only affects this call. + + var aTemp = []; + var iCurrentYear = 0; + $(oXML).find('month').each(function() { + dtTemp = new Date(parseInt($(this).attr("year")), (parseInt($(this).attr("month")) - 1), 1); + + // days in month + iDaysInMonth = parseFloat($(this).attr("daysinmonth")); + + // push items onto array + aTemp.push({ "dtDate" : new Date(dtTemp.getFullYear(), dtTemp.getMonth(), 1), + "iMonth" : $(this).attr("month"), + "iYear" : $(this).attr("year"), + "iDaysInMonth" : iDaysInMonth, + "iVisits" : $(this).attr("visits"), + "iUniques" : $(this).attr("uniques"), + "iPages" : $(this).attr("pages"), + "iHits" : $(this).attr("hits"), + "iBW" : $(this).attr("bw"), + "iDaysInMonth" : iDaysInMonth + }); + + // count days in year + if (iCurrentYear != dtTemp.getFullYear()) { + iCurrentYear = dtTemp.getFullYear(); + oAM.aYearDayCount[iCurrentYear] = iDaysInMonth; + } else { + oAM.aYearDayCount[iCurrentYear] += iDaysInMonth; + } + }); + + // apply data + oAM.aData = aTemp; + oStatistics.oAllMonths = oAM; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_Browser(sPage) { + $("#loading").show(); + + // create data objects + var oB = { "iTotalHits":0, "aData":[], "aFamily":[] }; + + // pre-populate browser families + oB.aFamily = gc_aBrowserFamily; + + // do ajax call + $.ajax({ + type: "GET", + url: XMLURL("BROWSER"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + var sBrowser = $(this).attr("id"); + var iHits = parseInt($(this).attr("hits")); + + // find family browser belongs to + var bFamilyFound = false; + var sFamily = ""; + for (var iRow in oB.aFamily) { + if (sBrowser.substr(0, oB.aFamily[iRow].sBrowser.length) == oB.aFamily[iRow].sBrowser) { + // change name + sBrowser = sBrowser.substr(oB.aFamily[iRow].sBrowser.length); + sBrowser = (gc_aBrowserFamilyCaption[oB.aFamily[iRow].sBrowser] + " " + sBrowser); + + // add totals + oB.aFamily[iRow].iHits += iHits; + sFamily = oB.aFamily[iRow].sBrowser; + bFamilyFound = true; + break; + } + } + if (bFamilyFound != true) { + oB.aFamily[oB.aFamily.length - 1].iHits += iHits; + sFamily = "Other Browsers"; + } + + // increment totals + oB.iTotalHits += iHits; + + // populate array + oB.aData.push({ "sBrowser":sBrowser, + "iHits":iHits, + "sFamily":sFamily }); + }); + + // apply data + oB.aData.sort(Sort_Hits); + oB.aFamily.sort(Sort_Hits); + oStatistics.oBrowser = oB; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_Country(sPage) { + $("#loading").show(); + + // create data objects + var oC = { "bPopulated":false, "iTotalPages":0, "iTotalHits":0, "iTotalBW":0, "aData":[] }; + oC.oContinent = { "Africa":{}, "Antartica":{}, "Asia":{}, "Europe":{}, "North America":{}, "Oceania":{}, "South America":{}, "Other":{} }; + for (var sContinent in oC.oContinent) { + oC.oContinent[sContinent] = { "iTotalPages":0, "iTotalHits":0, "iTotalBW":0 }; + } + + $.ajax({ + type: "GET", + url: XMLURL("DOMAIN"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sCountryCode = $(this).attr("id"); + var sCountryName = gc_aCountryName[sCountryCode]; + if (typeof gc_aCountryName[sCountryCode] == "undefined") { + sCountryName = ("Unknown (code: " + sCountryCode.toUpperCase() + ")"); + } + var sContinent = gc_aCountryContinent[sCountryCode]; + if (typeof gc_aContinents[sContinent] == "undefined") { + sContinent = "Other"; + } + var iPages = parseInt($(this).attr("pages")); + var iHits = parseInt($(this).attr("hits")); + var iBW = parseInt($(this).attr("bw")); + + // increment totals + oC.iTotalPages += iPages; + oC.iTotalHits += iHits; + oC.iTotalBW += iBW; + oC.oContinent[sContinent].iTotalPages += iPages; + oC.oContinent[sContinent].iTotalHits += iHits; + oC.oContinent[sContinent].iTotalBW += iBW; + + // populate array + oC.aData.push({ "sCountryCode":sCountryCode, + "sCountryName":sCountryName, + "sContinent":sContinent, + "iPages":iPages, + "iHits":iHits, + "iBW":iBW } ); + }); + + // apply data + oC.aData.sort(Sort_Pages); + oStatistics.oCountry = oC; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_Filetypes(sPage) { + $("#loading").show(); + + // create data objects + var oF = { "iTotalHits":0, "iTotalBW":0, "iTotalNonCompBW":0, "iTotalCompBW":0, "aData":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("FILETYPES"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sFiletype = $(this).attr("id"); + var sDescription = gc_aFiletypeDesc[sFiletype]; + if (typeof gc_aFiletypeDesc[sFiletype] == "undefined") { + sDescription = " "; + } + if (sFiletype == "Unknown") { + sFiletype = " "; + sDescription = "Unknown"; + } + var iHits = parseInt($(this).attr("hits")); + var iBW = parseInt($(this).attr("bw")); + var iNonCompBW = parseInt($(this).attr("noncompressedbw")); + var iCompBW = parseInt($(this).attr("compressedbw")); + + // increment totals + oF.iTotalHits += iHits; + oF.iTotalBW += iBW; + oF.iTotalNonCompBW += iNonCompBW; + oF.iTotalCompBW += iCompBW; + + // populate array + oF.aData.push({ "sFiletype":sFiletype, + "sDescription":sDescription, + "iHits":iHits, + "iBW":iBW, + "iNonCompBW":iNonCompBW, + "iCompBW":iCompBW } ); + }); + + // apply data + oF.aData.sort(Sort_Hits); + oStatistics.oFiletypes = oF; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_Keyphrases(sPage) { + $("#loading").show(); + + // create data objects + var oKP = { iMaxFreq: 0, iTotalFreq:0, aData:[] }; + var oKPAlpha = { aData:[] }; + + $.ajax({ + type: "GET", + url: XMLURL("SEARCHWORDS"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sPhrase = $(this).attr("phrase").split("+").join(" ").split("%").join("%​"); + var iFreq = parseInt($(this).attr("freq")); + + // increment totals + oKP.iTotalFreq += iFreq; + if (iFreq > oKP.iMaxFreq) { + oKP.iMaxFreq = iFreq; + } + // populate array + oKP.aData.push({ "sPhrase" : sPhrase, + "iFreq" : iFreq } ); + oKPAlpha.aData.push({ sWord : sPhrase, + iFreq : iFreq } ); + }); + + // apply data + oKP.aData.sort(Sort_Freq); + oKPAlpha.aData.sort(Sort_Phrase); + oStatistics.oKeyphrases = oKP; + oStatistics.oKeyphrasesAlphabetical = oKPAlpha; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_Keywords(sPage) { + $("#loading").show(); + + // create data objects + var oKW = { iMaxFreq: 0, iTotalFreq:0, aData:[] }; + var oKWAlpha = { aData:[] }; + + $.ajax({ + type: "GET", + url: XMLURL("KEYWORDS"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sWord = $(this).attr("word").split("%").join("%​"); + var iFreq = parseInt($(this).attr("freq")); + + // increment totals + oKW.iTotalFreq += iFreq; + if (iFreq > oKW.iMaxFreq) { + oKW.iMaxFreq = iFreq; + } + + // populate array + oKW.aData.push({ sWord : sWord, + iFreq : iFreq } ); + oKWAlpha.aData.push({ sWord : sWord, + iFreq : iFreq } ); + }); + + // apply data + oKW.aData.sort(Sort_Freq); + oKWAlpha.aData.sort(Sort_Word); + oStatistics.oKeywords = oKW; + oStatistics.oKeywordsAlphabetical = oKWAlpha; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_OperatingSystems(sPage) { + $("#loading").show(); + + // create data objects + var oOS = { "iTotalHits":0, "aData":[], "aFamily":[] }; + + // pre-populate browser families + oOS.aFamily = gc_aOSFamily; + + // do ajax call + $.ajax({ + type: "GET", + url: XMLURL("OS"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + var sOperatingSystem = $(this).attr("id"); + var iHits = parseInt($(this).attr("hits")); + + // find family OS belongs to + var bFamilyFound = false; + var sFamily = ""; + for (var iRow in oOS.aFamily) { + if (sOperatingSystem.substr(0, oOS.aFamily[iRow].sOperatingSystem.length) == oOS.aFamily[iRow].sOperatingSystem) { + // change name + sOperatingSystem = sOperatingSystem.substr(oOS.aFamily[iRow].sOperatingSystem.length); + switch (oOS.aFamily[iRow].sOperatingSystem) { + case "mac": + sOperatingSystem = (sOperatingSystem.substr(0, 1).toUpperCase() + sOperatingSystem.substr(1)); + switch (sOperatingSystem) { + case "Intosh": + sOperatingSystem = "Macintosh"; + break; + case "Osx": + sOperatingSystem = "OSX"; + break; + } + break; + case "sun": + case "win": + sOperatingSystem = sOperatingSystem.toUpperCase(); + break; + default: + sOperatingSystem = (sOperatingSystem.substr(0, 1).toUpperCase() + sOperatingSystem.substr(1)); + } + sOperatingSystem = (gc_aOSFamilyCaption[oOS.aFamily[iRow].sOperatingSystem] + " " + sOperatingSystem); + + // add totals + oOS.aFamily[iRow].iHits += iHits; + sFamily = oOS.aFamily[iRow].sOperatingSystem; + bFamilyFound = true; + break; + } + } + if (bFamilyFound != true) { + oOS.aFamily[oOS.aFamily.length - 1].iHits += iHits; + sFamily = "Other OS"; + } + + // increment totals + oOS.iTotalHits += iHits; + + // populate array + oOS.aData.push({ "sOperatingSystem":sOperatingSystem, + "iHits":iHits, + "sFamily":sFamily }); + }); + + // apply data + oOS.aData.sort(Sort_Hits); + oOS.aFamily.sort(Sort_Hits); + oStatistics.oOperatingSystems = oOS; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_PageRefs(sPage) { + $("#loading").show(); + + // create data objects + var oPR = { "iTotalPages":0, "iTotalHits":0, "aData":[], "aDataDomain":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("PAGEREFS"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sReferrer = $(this).attr("url"); + var iPages = parseInt($(this).attr("pages")); + var iHits = parseInt($(this).attr("hits")); + + // increment totals + oPR.iTotalPages += iPages; + oPR.iTotalHits += iHits; + + // populate array + oPR.aData.push({ "sURL" : sReferrer, + "sVisibleURL" : sReferrer.split("/").join("​/").split("-").join("-​").split("_").join("_​"), + "iPages" : iPages, + "iHits" : iHits } ); + + // populate domain array + var aTemp = sReferrer.split("/"); + var sDomain = (aTemp[0] + "//" + aTemp[2]); + var sVisibleDomain = aTemp[2].replace(/^www./, ""); + $bExists = false; + for (var iRow in oPR.aDataDomain) { + if (oPR.aDataDomain[iRow].sVisibleURL == sVisibleDomain) { + oPR.aDataDomain[iRow].iPages += iPages; + oPR.aDataDomain[iRow].iHits += iHits; + $bExists = true; + break + } + } + if ($bExists != true) { + oPR.aDataDomain.push({ "sURL" : sDomain, + "sVisibleURL" : aTemp[2].replace(/^www./, ""), + "iPages" : iPages, + "iHits" : iHits }); + } + }); + + // apply data + oPR.aData.sort(Sort_Pages); + oStatistics.oPageRefs = oPR; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_PageRefsSE() { + $("#loading").show(); + + // create data objects + var oPR = { "iTotalPages":0, "iTotalHits":0, "aData":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("SEREFERRALS"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sReferrer = $(this).attr("id"); + var sURL = sReferrer; + var sImage = " "; + var iPages = parseInt($(this).attr("pages")); + var iHits = parseInt($(this).attr("hits")); + + // find if exists in array + for (var i = 0; i < gc_aSearchEngines.length; i++) { + if (gc_aSearchEngines[i].sCode == sReferrer) { + sReferrer = gc_aSearchEngines[i].sName; + sURL = gc_aSearchEngines[i].sURL; + sImage = "\"""; + break; + } + } + + // increment totals + oPR.iTotalPages += iPages; + oPR.iTotalHits += iHits; + + // populate array + oPR.aData.push({ "sReferrer" : sReferrer, + "sURL" : sURL, + "sImage" : sImage, + "iPages" : iPages, + "iHits" : iHits } ); + }); + + // apply data + oPR.aData.sort(Sort_Pages); + oStatistics.oPageRefsSE = oPR; + $("#loading").hide(); + DrawPage("pagerefs.se"); + } + }); +} + +function PopulateData_Pages(sPage) { + $("#loading").show(); + + // create data objects + var oP = { iTotalPages:0, iTotalBW:0, iTotalEntry:0, iTotalExit:0, aDataPages:[], aDataBW:[], aDataEntry:[], aDataExit:[] }; + + // do ajax call + $.ajax({ + type: "GET", + url: XMLURL("PAGES"), + success: function(oXML){ + CheckLastUpdate(oXML); + + // retrieve totals + var oXMLTotals = $(oXML).find("totals"); + oP.iTotalPages = parseInt(oXMLTotals.attr("pages")); + oP.iTotalBW = parseInt(oXMLTotals.attr("bw")); + oP.iTotalEntry = parseInt(oXMLTotals.attr("entry")); + oP.iTotalExit = parseInt(oXMLTotals.attr("exit")); + + // extract data blocks + oP.aDataPages = ExtractData($(oXML).find('data_pages')); + oP.aDataBW = ExtractData($(oXML).find('data_bw')); + oP.aDataEntry = ExtractData($(oXML).find('data_entry')); + oP.aDataExit = ExtractData($(oXML).find('data_exit')); + + // apply data + oStatistics.oPages = oP; + $("#loading").hide(); + DrawPage(sPage); + + function ExtractData(oXMLBlock) { + var aData = []; + + $(oXMLBlock).find('item').each(function() { + aData.push({ "sURL" : $(this).attr("url"), + "iPages" : parseInt($(this).attr("pages")), + "iBW" : parseInt($(this).attr("bw")), + "iEntry" : parseInt($(this).attr("entry")), + "iExit" : parseInt($(this).attr("exit")) }); + }); + + return aData; + } + } + }); +} + +function PopulateData_Robots(sPage) { + $("#loading").show(); + + // create data objects + var oR = { "iTotalHits":0, "iTotalBW":0, "dtLastVisit":0, "iTotalRobotsTXT":0, "aData":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("ROBOT"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sRobot = $(this).attr("id"); + var iHits = parseInt($(this).attr("hits")); + var iBW = parseInt($(this).attr("bw")); + var dtLastVisit = parseInt($(this).attr("lastvisit")); + var iRobotsTXT = parseInt($(this).attr("robotstxt")); + + // increment totals + oR.iTotalHits += iHits; + oR.iTotalBW += iBW; + oR.iTotalRobotsTXT += iRobotsTXT; + + // populate array + oR.aData.push({ "sRobot":sRobot, + "iHits":iHits, + "iBW":iBW, + "dtLastVisit":dtLastVisit, + "iRobotsTXT":iRobotsTXT } ); + }); + + // apply data + oStatistics.oRobots = oR; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_Session() { + $("#loading").show(); + + // create data objects + var oS = { "iTotalFreq":0, "aData":{s1h:0, s5mn15mn:0, s15mn30mn:0, s30s2mn:0, s0s30s:0, s2mn5mn:0, s30mn1h:0 } }; + + $.ajax({ + type: "GET", + url: XMLURL("SESSION"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sRange = ("s" + $(this).attr("range").replace("+", "").replace("-", "")); + oS.aData[sRange] = parseInt($(this).attr("freq")); + + // increment totals + oS.iTotalFreq += oS.aData[sRange]; + }); + + // apply data + oStatistics.oSession = oS; + $("#loading").hide(); + DrawPage("session"); + } + }); +} + +function PopulateData_Status(sPage) { + $("#loading").show(); + + // create data objects + var oS = { "iTotalHits":0, "iTotalBW":0, "aData":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("ERRORS"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sCode = $(this).attr("id"); + var sDescription = gc_aHTTPStatus[sCode]; + if (typeof gc_aHTTPStatus[sCode] == "undefined") { + sDescription = " "; + } + var iHits = parseInt($(this).attr("hits")); + var iBW = parseInt($(this).attr("bw")); + + // increment totals + oS.iTotalHits += iHits; + oS.iTotalBW += iBW; + + // populate array + oS.aData.push({ "sCode":sCode, + "sDescription":sDescription, + "iHits":iHits, + "iBW":iBW } ); + }); + + // apply data + oS.aData.sort(Sort_Hits); + oStatistics.oStatus = oS; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_Status404(sPage) { + $("#loading").show(); + + // create data objects + var oS = { "iTotalHits":0, "aData":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("SIDER_404"), + success: function(oXML){ + CheckLastUpdate(oXML); + + $(oXML).find('item').each(function() { + // collect values + var sURL = $(this).attr("url"); + var iHits = parseInt($(this).attr("hits")); + var sReferrer = $(this).attr("referrer"); + + // increment totals + oS.iTotalHits += iHits; + + // populate array + oS.aData.push({ "sURL":sURL.split("/").join("​/").split("-").join("-​").split("_").join("_​"), + "iHits":iHits, + "sReferrer":sReferrer, + "sReferrerVisible":sReferrer.split("/").join("​/").split("-").join("-​").split("_").join("_​") } ); + }); + + // apply data + oS.aData.sort(Sort_Hits); + oStatistics.oStatus404 = oS; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_ThisMonth(sPage) { + $("#loading").show(); + + // create data objects + var oTM = { "iTotalPages":0, "iTotalHits":0, "iTotalBW":0, "iTotalVisits":0, "aData":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("DAY"), + success: function(oXML){ + CheckLastUpdate(oXML); + + var aTemp1 = []; + var iMaxDate = 0; + $(oXML).find('item').each(function() { + // collect values + var sDate = $(this).attr("date"); + var iVisits = parseInt($(this).attr("visits")); + var iPages = parseInt($(this).attr("pages")); + var iHits = parseInt($(this).attr("hits")); + var iBW = parseInt($(this).attr("bw")); + + // increment totals + oTM.iTotalVisits += iVisits; + oTM.iTotalPages += iPages; + oTM.iTotalHits += iHits; + oTM.iTotalBW += iBW; + + // create javascript date + dtDate = new Date(sDate.substr(0,4), + (parseInt(StripLeadingZeroes(sDate.substr(4,2))) - 1), + sDate.substr(6,2)); + + // populate array + aTemp1.push({ "dtDate" : dtDate, + "iVisits" : iVisits, + "iPages" : iPages, + "iHits" : iHits, + "iBW" : iBW } ); + dtMaxDate = dtDate; + }); + + // populate complete array (including empty values) + var aTemp2 = []; + var iPointer = 0; + for (var iIndex = 0; iIndex < dtMaxDate.getDate(); iIndex++) { + dtExpectedDate = new Date(dtMaxDate.getFullYear(), dtMaxDate.getMonth(), (iIndex + 1)); + if (aTemp1[iPointer].dtDate.valueOf() == dtExpectedDate.valueOf()) { + aTemp2.push({ "dtDate" : new Date(dtMaxDate.getFullYear(), dtMaxDate.getMonth(), (iIndex + 1)), + "iVisits" : aTemp1[iPointer].iVisits, + "iPages" : aTemp1[iPointer].iPages, + "iHits" : aTemp1[iPointer].iHits, + "iBW" : aTemp1[iPointer].iBW } ); + iPointer++; + } else { + aTemp2.push({ "dtDate" : new Date(dtMaxDate.getFullYear(), dtMaxDate.getMonth(), (iIndex + 1)), + "iVisits" : 0, + "iPages" : 0, + "iHits" : 0, + "iBW" : 0 } ); + } + } + + // apply data + oTM.aData = aTemp2; + oStatistics.oThisMonth = oTM; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function PopulateData_Time(sPage) { + $("#loading").show(); + + // create data objects + var oT = { "iTotalPages":0, "iTotalHits":0, "iTotalBW":0, "iTotalNVPages":0, "iTotalNVHits":0, "iTotalNVBW":0, "aData":[] }; + + $.ajax({ + type: "GET", + url: XMLURL("TIME"), + success: function(oXML){ + CheckLastUpdate(oXML); + + var aTemp = []; + $(oXML).find('item').each(function() { + // collect values + var iHour = parseInt($(this).attr("hour")); + var iPages = parseInt($(this).attr("pages")); + var iHits = parseInt($(this).attr("hits")); + var iBW = parseInt($(this).attr("bw")); + var iNVPages = parseInt($(this).attr("notviewedpages")); + var iNVHits = parseInt($(this).attr("notviewedhits")); + var iNVBW = parseInt($(this).attr("notviewedbw")); + + // increment totals + oT.iTotalPages += iPages; + oT.iTotalHits += iHits; + oT.iTotalBW += iBW; + oT.iTotalNVPages += iPages; + oT.iTotalNVHits += iHits; + oT.iTotalNVBW += iBW; + + // populate array + oT.aData.push({ "iHour":iHour, + "iPages":iPages, + "iHits":iHits, + "iBW":iBW, + "iNVPages":iNVPages, + "iNVHits":iNVHits, + "iNVBW":iNVBW } ); + }); + + // apply data + oStatistics.oTime = oT; + $("#loading").hide(); + DrawPage(sPage); + } + }); +} + +function RedrawTable_Keyphrases(sParam, sValue) { + oPaging.oKeyphrases[sParam] = sValue; + $(".tablePie").html(Paging_Keyphrases()); +} + +function RedrawTable_Keywords(sParam, sValue) { + oPaging.oKeywords[sParam] = sValue; + $(".tablePie").html(Paging_Keywords()); +} + +function SafeDivide(iFirst, iSecond) { + if (iSecond != 0) { + return (iFirst / iSecond); + } else { + return 0; + } +} + +function ShowTools(sID) { + if (arguments.length > 0) { + sToolID = sID; + } + + // loop through items + if ($("#tools .tool:visible").size() > 0) { + $("#tools .tool:visible").each(function() { + if ($(this).attr("id") == sToolID) { + $(this).stop().slideUp(350); + } else { + $(this).stop().slideUp(350, ShowTools); + } + }); + } else { + $("#" + sToolID).stop().slideDown(350); + } +} + +function Sort_Freq(a, b) { + return b.iFreq - a.iFreq; +} + +function Sort_Hits(a, b) { + return b.iHits - a.iHits; +} + +function Sort_Pages(a, b) { + return b.iPages - a.iPages; +} + +function Sort_Phrase(a, b) { + return ((a.sPhrase < b.sPhrase) ? -1 : ((a.sPhrase > b.sPhrase) ? 1 : 0)); +} + +function Sort_Word(a, b) { + return ((a.sWord < b.sWord) ? -1 : ((a.sWord > b.sWord) ? 1 : 0)); +} + +function TagCloud(sType, oData, iMaxCount) { + // create array of top tags, sorted alpahabetically + var aTag = []; + var iCount = oData.aData.length; + if (iCount > iMaxCount) { iCount = iMaxCount; } + for (var i = 0; i < iCount; i++) { + aTag.push(oData.aData[i]); + } + if (sType == "sWord") { + aTag.sort(Sort_Word); + } else { + aTag.sort(Sort_Phrase); + } + + // apply sizes + aHTML = []; + var iMaxSize = 60; + var iMinSize = 11; + var iDiff = (iMaxSize - iMinSize); + for (var i = 0; i < iCount; i++) { + var iSize = (Math.round((aTag[i].iFreq / oData.iMaxFreq) * iDiff) + iMinSize); + aHTML.push("" + aTag[i][sType] + ""); + } + return aHTML.join("\n"); +} + +function UpdateSite() { + $("#loading").show(); + $.ajax({ + type: "POST", + url: sUpdateFilename, + data: ("config=" + g_sConfig + "&pass=" + MD5($("#password").val())), + success: function(oXML) { + switch ($(oXML).find('result:eq(0)').attr("type")) { + case "bad_password": + $("#loading").hide(); + alert( Lang("The password you entered was incorrect.") ); + break; + case "updated": + var sURL = "?config=" + g_sConfig + "&year=" + g_iYear + "&month=" + g_iMonth + "&view=" + g_sCurrentView + "&lang=" + g_sLanguage; + self.location.href = sURL; + break; + default: + $("#loading").hide(); + } + } + }); +} + +function UpdateSiteKeyUp(event) { + if (event.keyCode == 13) { + UpdateSite(); + } +} + +function XMLURL(sPage) { + var sURL = ""; + if (g_bUseStaticXML == true) { + switch (sPage) { + case "ALLMONTHS": + sURL = ("static/jawstats." + g_sConfig + ".allmonths.xml?cache=" + g_dtLastUpdate); + break; + default: + if (g_iMonth < 10) { + sURL = ("static/jawstats" + g_iYear + "0" + g_iMonth + "." + g_sConfig + "." + sPage.toLowerCase() + ".xml?cache=" + g_dtLastUpdate); + } else { + sURL = ("static/jawstats" + g_iYear + g_iMonth + "." + g_sConfig + "." + sPage.toLowerCase() + ".xml?cache=" + g_dtLastUpdate); + } + } + } else { + switch (sPage) { + case "ALLMONTHS": + sURL = ("xml_history.php?config=" + g_sConfig); + break; + case "PAGES": + sURL = ("xml_pages.php?config=" + g_sConfig + "&year=" + g_iYear + "&month=" + g_iMonth); + break; + default: + sURL = ("xml_stats.php?config=" + g_sConfig + "§ion=" + sPage + "&year=" + g_iYear + "&month=" + g_iMonth); + } + } + return sURL; +} + + +// Other functions: get week number thanks to http://www.quirksmode.org/js/week.html +function getWeekNr(dtTempDate) { + Year = takeYear(dtTempDate); + Month = dtTempDate.getMonth(); + Day = dtTempDate.getDate(); + now = Date.UTC(Year,Month,Day+1,0,0,0); + var Firstday = new Date(); + Firstday.setYear(Year); + Firstday.setMonth(0); + Firstday.setDate(1); + then = Date.UTC(Year,0,1,0,0,0); + var Compensation = Firstday.getDay(); + if (Compensation > 3) Compensation -= 4; + else Compensation += 3; + NumberOfWeek = Math.round((((now-then)/86400000)+Compensation)/7); + + // my alteration to make monday-sunday calendar + if (dtTempDate.getDay() == 0) { + NumberOfWeek--; + } + // end + + return NumberOfWeek; +} +function takeYear(dtTempDate) { + x = dtTempDate.getYear(); + var y = x % 100; + y += (y < 38) ? 2000 : 1900; + return y; +} + +// md5 thanks to http://www.webtoolkit.info +var MD5 = function (string) { + + function RotateLeft(lValue, iShiftBits) { + return (lValue<>>(32-iShiftBits)); + } + + function AddUnsigned(lX,lY) { + var lX4,lY4,lX8,lY8,lResult; + lX8 = (lX & 0x80000000); + lY8 = (lY & 0x80000000); + lX4 = (lX & 0x40000000); + lY4 = (lY & 0x40000000); + lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF); + if (lX4 & lY4) { + return (lResult ^ 0x80000000 ^ lX8 ^ lY8); + } + if (lX4 | lY4) { + if (lResult & 0x40000000) { + return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); + } else { + return (lResult ^ 0x40000000 ^ lX8 ^ lY8); + } + } else { + return (lResult ^ lX8 ^ lY8); + } + } + + function F(x,y,z) { return (x & y) | ((~x) & z); } + function G(x,y,z) { return (x & z) | (y & (~z)); } + function H(x,y,z) { return (x ^ y ^ z); } + function I(x,y,z) { return (y ^ (x | (~z))); } + + function FF(a,b,c,d,x,s,ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)); + return AddUnsigned(RotateLeft(a, s), b); + }; + + function GG(a,b,c,d,x,s,ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)); + return AddUnsigned(RotateLeft(a, s), b); + }; + + function HH(a,b,c,d,x,s,ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)); + return AddUnsigned(RotateLeft(a, s), b); + }; + + function II(a,b,c,d,x,s,ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)); + return AddUnsigned(RotateLeft(a, s), b); + }; + + function ConvertToWordArray(string) { + var lWordCount; + var lMessageLength = string.length; + var lNumberOfWords_temp1=lMessageLength + 8; + var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64; + var lNumberOfWords = (lNumberOfWords_temp2+1)*16; + var lWordArray=Array(lNumberOfWords-1); + var lBytePosition = 0; + var lByteCount = 0; + while ( lByteCount < lMessageLength ) { + lWordCount = (lByteCount-(lByteCount % 4))/4; + lBytePosition = (lByteCount % 4)*8; + lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<>>29; + return lWordArray; + }; + + function WordToHex(lValue) { + var WordToHexValue="",WordToHexValue_temp="",lByte,lCount; + for (lCount = 0;lCount<=3;lCount++) { + lByte = (lValue>>>(lCount*8)) & 255; + WordToHexValue_temp = "0" + lByte.toString(16); + WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2); + } + return WordToHexValue; + }; + + function Utf8Encode(string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + }; + + var x=Array(); + var k,AA,BB,CC,DD,a,b,c,d; + var S11=7, S12=12, S13=17, S14=22; + var S21=5, S22=9 , S23=14, S24=20; + var S31=4, S32=11, S33=16, S34=23; + var S41=6, S42=10, S43=15, S44=21; + + string = Utf8Encode(string); + + x = ConvertToWordArray(string); + + a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; + + for (k=0;k= 1000) { + aDigits[0] = aDigits[0].split("").reverse().join("").replace(oRegEx, "$1,").split("").reverse().join(""); + } + return aDigits.join("."); +} + +function StripLeadingZeroes(sString) { + while (sString.substr(0,1) == "0") { + sString = sString.substr(1); + } + return sString; +} + +$.tablesorter.addParser({ + id: "commaNumber", + is: function(s) { + return false; + }, + format: function(s) { + s = s.replace(/\,/g, ""); + return s; + }, + type: "numeric" +}); \ No newline at end of file diff --git a/jawstats/js/jquery.js b/jawstats/js/jquery.js new file mode 100755 index 0000000..396646c --- /dev/null +++ b/jawstats/js/jquery.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-01-13 12:50:31 -0500 (Tue, 13 Jan 2009) + * Revision: 6104 + */ +(function(){var l=this,g,x=l.jQuery,o=l.$,n=l.jQuery=l.$=function(D,E){return new n.fn.init(D,E)},C=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;n.fn=n.prototype={init:function(D,G){D=D||document;if(D.nodeType){this[0]=D;this.length=1;this.context=D;return this}if(typeof D==="string"){var F=C.exec(D);if(F&&(F[1]||!G)){if(F[1]){D=n.clean([F[1]],G)}else{var H=document.getElementById(F[3]);if(H){if(H.id!=F[3]){return n().find(D)}var E=n(H);E.context=document;E.selector=D;return E}D=[]}}else{return n(G).find(D)}}else{if(n.isFunction(D)){return n(document).ready(D)}}if(D.selector&&D.context){this.selector=D.selector;this.context=D.context}return this.setArray(n.makeArray(D))},selector:"",jquery:"1.3",size:function(){return this.length},get:function(D){return D===g?n.makeArray(this):this[D]},pushStack:function(E,G,D){var F=n(E);F.prevObject=this;F.context=this.context;if(G==="find"){F.selector=this.selector+(this.selector?" ":"")+D}else{if(G){F.selector=this.selector+"."+G+"("+D+")"}}return F},setArray:function(D){this.length=0;Array.prototype.push.apply(this,D);return this},each:function(E,D){return n.each(this,E,D)},index:function(D){return n.inArray(D&&D.jquery?D[0]:D,this)},attr:function(E,G,F){var D=E;if(typeof E==="string"){if(G===g){return this[0]&&n[F||"attr"](this[0],E)}else{D={};D[E]=G}}return this.each(function(H){for(E in D){n.attr(F?this.style:this,E,n.prop(this,D[E],F,H,E))}})},css:function(D,E){if((D=="width"||D=="height")&&parseFloat(E)<0){E=g}return this.attr(D,E,"curCSS")},text:function(E){if(typeof E!=="object"&&E!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(E))}var D="";n.each(E||this,function(){n.each(this.childNodes,function(){if(this.nodeType!=8){D+=this.nodeType!=1?this.nodeValue:n.fn.text([this])}})});return D},wrapAll:function(D){if(this[0]){var E=n(D,this[0].ownerDocument).clone();if(this[0].parentNode){E.insertBefore(this[0])}E.map(function(){var F=this;while(F.firstChild){F=F.firstChild}return F}).append(this)}return this},wrapInner:function(D){return this.each(function(){n(this).contents().wrapAll(D)})},wrap:function(D){return this.each(function(){n(this).wrapAll(D)})},append:function(){return this.domManip(arguments,true,function(D){if(this.nodeType==1){this.appendChild(D)}})},prepend:function(){return this.domManip(arguments,true,function(D){if(this.nodeType==1){this.insertBefore(D,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(D){this.parentNode.insertBefore(D,this)})},after:function(){return this.domManip(arguments,false,function(D){this.parentNode.insertBefore(D,this.nextSibling)})},end:function(){return this.prevObject||n([])},push:[].push,find:function(D){if(this.length===1&&!/,/.test(D)){var F=this.pushStack([],"find",D);F.length=0;n.find(D,this[0],F);return F}else{var E=n.map(this,function(G){return n.find(D,G)});return this.pushStack(/[^+>] [^+>]/.test(D)?n.unique(E):E,"find",D)}},clone:function(E){var D=this.map(function(){if(!n.support.noCloneEvent&&!n.isXMLDoc(this)){var H=this.cloneNode(true),G=document.createElement("div");G.appendChild(H);return n.clean([G.innerHTML])[0]}else{return this.cloneNode(true)}});var F=D.find("*").andSelf().each(function(){if(this[h]!==g){this[h]=null}});if(E===true){this.find("*").andSelf().each(function(H){if(this.nodeType==3){return}var G=n.data(this,"events");for(var J in G){for(var I in G[J]){n.event.add(F[H],J,G[J][I],G[J][I].data)}}})}return D},filter:function(D){return this.pushStack(n.isFunction(D)&&n.grep(this,function(F,E){return D.call(F,E)})||n.multiFilter(D,n.grep(this,function(E){return E.nodeType===1})),"filter",D)},closest:function(D){var E=n.expr.match.POS.test(D)?n(D):null;return this.map(function(){var F=this;while(F&&F.ownerDocument){if(E?E.index(F)>-1:n(F).is(D)){return F}F=F.parentNode}})},not:function(D){if(typeof D==="string"){if(f.test(D)){return this.pushStack(n.multiFilter(D,this,true),"not",D)}else{D=n.multiFilter(D,this)}}var E=D.length&&D[D.length-1]!==g&&!D.nodeType;return this.filter(function(){return E?n.inArray(this,D)<0:this!=D})},add:function(D){return this.pushStack(n.unique(n.merge(this.get(),typeof D==="string"?n(D):n.makeArray(D))))},is:function(D){return !!D&&n.multiFilter(D,this).length>0},hasClass:function(D){return !!D&&this.is("."+D)},val:function(J){if(J===g){var D=this[0];if(D){if(n.nodeName(D,"option")){return(D.attributes.value||{}).specified?D.value:D.text}if(n.nodeName(D,"select")){var H=D.selectedIndex,K=[],L=D.options,G=D.type=="select-one";if(H<0){return null}for(var E=G?H:0,I=G?H+1:L.length;E=0||n.inArray(this.name,J)>=0)}else{if(n.nodeName(this,"select")){var M=n.makeArray(J);n("option",this).each(function(){this.selected=(n.inArray(this.value,M)>=0||n.inArray(this.text,M)>=0)});if(!M.length){this.selectedIndex=-1}}else{this.value=J}}})},html:function(D){return D===g?(this[0]?this[0].innerHTML:null):this.empty().append(D)},replaceWith:function(D){return this.after(D).remove()},eq:function(D){return this.slice(D,+D+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(D){return this.pushStack(n.map(this,function(F,E){return D.call(F,E,F)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=n.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild,D=this.length>1?I.cloneNode(true):I;if(H){for(var G=0,E=this.length;G0?D.cloneNode(true):I)}}if(F){n.each(F,y)}}return this;function K(N,O){return M&&n.nodeName(N,"table")&&n.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};n.fn.init.prototype=n.fn;function y(D,E){if(E.src){n.ajax({url:E.src,async:false,dataType:"script"})}else{n.globalEval(E.text||E.textContent||E.innerHTML||"")}if(E.parentNode){E.parentNode.removeChild(E)}}function e(){return +new Date}n.extend=n.fn.extend=function(){var I=arguments[0]||{},G=1,H=arguments.length,D=false,F;if(typeof I==="boolean"){D=I;I=arguments[1]||{};G=2}if(typeof I!=="object"&&!n.isFunction(I)){I={}}if(H==G){I=this;--G}for(;G-1}},swap:function(G,F,H){var D={};for(var E in F){D[E]=G.style[E];G.style[E]=F[E]}H.call(G);for(var E in F){G.style[E]=D[E]}},css:function(F,D,H){if(D=="width"||D=="height"){var J,E={position:"absolute",visibility:"hidden",display:"block"},I=D=="width"?["Left","Right"]:["Top","Bottom"];function G(){J=D=="width"?F.offsetWidth:F.offsetHeight;var L=0,K=0;n.each(I,function(){L+=parseFloat(n.curCSS(F,"padding"+this,true))||0;K+=parseFloat(n.curCSS(F,"border"+this+"Width",true))||0});J-=Math.round(L+K)}if(n(F).is(":visible")){G()}else{n.swap(F,E,G)}return Math.max(0,J)}return n.curCSS(F,D,H)},curCSS:function(H,E,F){var K,D=H.style;if(E=="opacity"&&!n.support.opacity){K=n.attr(D,"opacity");return K==""?"1":K}if(E.match(/float/i)){E=v}if(!F&&D&&D[E]){K=D[E]}else{if(p.getComputedStyle){if(E.match(/float/i)){E="float"}E=E.replace(/([A-Z])/g,"-$1").toLowerCase();var L=p.getComputedStyle(H,null);if(L){K=L.getPropertyValue(E)}if(E=="opacity"&&K==""){K="1"}}else{if(H.currentStyle){var I=E.replace(/\-(\w)/g,function(M,N){return N.toUpperCase()});K=H.currentStyle[E]||H.currentStyle[I];if(!/^\d+(px)?$/i.test(K)&&/^\d/.test(K)){var G=D.left,J=H.runtimeStyle.left;H.runtimeStyle.left=H.currentStyle.left;D.left=K||0;K=D.pixelLeft+"px";D.left=G;H.runtimeStyle.left=J}}}}return K},clean:function(E,J,H){J=J||document;if(typeof J.createElement==="undefined"){J=J.ownerDocument||J[0]&&J[0].ownerDocument||document}if(!H&&E.length===1&&typeof E[0]==="string"){var G=/^<(\w+)\s*\/?>$/.exec(E[0]);if(G){return[J.createElement(G[1])]}}var F=[],D=[],K=J.createElement("div");n.each(E,function(O,Q){if(typeof Q==="number"){Q+=""}if(!Q){return}if(typeof Q==="string"){Q=Q.replace(/(<(\w+)[^>]*?)\/>/g,function(S,T,R){return R.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?S:T+">"});var N=n.trim(Q).toLowerCase();var P=!N.indexOf("",""]||!N.indexOf("",""]||N.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!N.indexOf("",""]||(!N.indexOf("",""]||!N.indexOf("",""]||!n.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];K.innerHTML=P[1]+Q+P[2];while(P[0]--){K=K.lastChild}if(!n.support.tbody){var M=!N.indexOf(""&&N.indexOf("=0;--L){if(n.nodeName(M[L],"tbody")&&!M[L].childNodes.length){M[L].parentNode.removeChild(M[L])}}}if(!n.support.leadingWhitespace&&/^\s/.test(Q)){K.insertBefore(J.createTextNode(Q.match(/^\s*/)[0]),K.firstChild)}Q=n.makeArray(K.childNodes)}if(Q.nodeType){F.push(Q)}else{F=n.merge(F,Q)}});if(H){for(var I=0;F[I];I++){if(n.nodeName(F[I],"script")&&(!F[I].type||F[I].type.toLowerCase()==="text/javascript")){D.push(F[I].parentNode?F[I].parentNode.removeChild(F[I]):F[I])}else{if(F[I].nodeType===1){F.splice.apply(F,[I+1,0].concat(n.makeArray(F[I].getElementsByTagName("script"))))}H.appendChild(F[I])}}return D}return F},attr:function(I,F,J){if(!I||I.nodeType==3||I.nodeType==8){return g}var G=!n.isXMLDoc(I),K=J!==g;F=G&&n.props[F]||F;if(I.tagName){var E=/href|src|style/.test(F);if(F=="selected"&&I.parentNode){I.parentNode.selectedIndex}if(F in I&&G&&!E){if(K){if(F=="type"&&n.nodeName(I,"input")&&I.parentNode){throw"type property can't be changed"}I[F]=J}if(n.nodeName(I,"form")&&I.getAttributeNode(F)){return I.getAttributeNode(F).nodeValue}if(F=="tabIndex"){var H=I.getAttributeNode("tabIndex");return H&&H.specified?H.value:I.nodeName.match(/^(a|area|button|input|object|select|textarea)$/i)?0:g}return I[F]}if(!n.support.style&&G&&F=="style"){return n.attr(I.style,"cssText",J)}if(K){I.setAttribute(F,""+J)}var D=!n.support.hrefNormalized&&G&&E?I.getAttribute(F,2):I.getAttribute(F);return D===null?g:D}if(!n.support.opacity&&F=="opacity"){if(K){I.zoom=1;I.filter=(I.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(J)+""=="NaN"?"":"alpha(opacity="+J*100+")")}return I.filter&&I.filter.indexOf("opacity=")>=0?(parseFloat(I.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}F=F.replace(/-([a-z])/ig,function(L,M){return M.toUpperCase()});if(K){I[F]=J}return I[F]},trim:function(D){return(D||"").replace(/^\s+|\s+$/g,"")},makeArray:function(F){var D=[];if(F!=null){var E=F.length;if(E==null||typeof F==="string"||n.isFunction(F)||F.setInterval){D[0]=F}else{while(E){D[--E]=F[E]}}}return D},inArray:function(F,G){for(var D=0,E=G.length;D*",this).remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(D,E){n.fn[D]=function(){return this.each(E,arguments)}});function j(D,E){return D[0]&&parseInt(n.curCSS(D[0],E,true),10)||0}var h="jQuery"+e(),u=0,z={};n.extend({cache:{},data:function(E,D,F){E=E==l?z:E;var G=E[h];if(!G){G=E[h]=++u}if(D&&!n.cache[G]){n.cache[G]={}}if(F!==g){n.cache[G][D]=F}return D?n.cache[G][D]:G},removeData:function(E,D){E=E==l?z:E;var G=E[h];if(D){if(n.cache[G]){delete n.cache[G][D];D="";for(D in n.cache[G]){break}if(!D){n.removeData(E)}}}else{try{delete E[h]}catch(F){if(E.removeAttribute){E.removeAttribute(h)}}delete n.cache[G]}},queue:function(E,D,G){if(E){D=(D||"fx")+"queue";var F=n.data(E,D);if(!F||n.isArray(G)){F=n.data(E,D,n.makeArray(G))}else{if(G){F.push(G)}}}return F},dequeue:function(G,F){var D=n.queue(G,F),E=D.shift();if(!F||F==="fx"){E=D[0]}if(E!==g){E.call(G)}}});n.fn.extend({data:function(D,F){var G=D.split(".");G[1]=G[1]?"."+G[1]:"";if(F===g){var E=this.triggerHandler("getData"+G[1]+"!",[G[0]]);if(E===g&&this.length){E=n.data(this[0],D)}return E===g&&G[1]?this.data(G[0]):E}else{return this.trigger("setData"+G[1]+"!",[G[0],F]).each(function(){n.data(this,D,F)})}},removeData:function(D){return this.each(function(){n.removeData(this,D)})},queue:function(D,E){if(typeof D!=="string"){E=D;D="fx"}if(E===g){return n.queue(this[0],D)}return this.each(function(){var F=n.queue(this,D,E);if(D=="fx"&&F.length==1){F[0].call(this)}})},dequeue:function(D){return this.each(function(){n.dequeue(this,D)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.1 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var N=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,I=0,F=Object.prototype.toString;var E=function(ae,S,aa,V){aa=aa||[];S=S||document;if(S.nodeType!==1&&S.nodeType!==9){return[]}if(!ae||typeof ae!=="string"){return aa}var ab=[],ac,Y,ah,ag,Z,R,Q=true;N.lastIndex=0;while((ac=N.exec(ae))!==null){ab.push(ac[1]);if(ac[2]){R=RegExp.rightContext;break}}if(ab.length>1&&G.match.POS.exec(ae)){if(ab.length===2&&G.relative[ab[0]]){var U="",X;while((X=G.match.POS.exec(ae))){U+=X[0];ae=ae.replace(G.match.POS,"")}Y=E.filter(U,E(/\s$/.test(ae)?ae+"*":ae,S))}else{Y=G.relative[ab[0]]?[S]:E(ab.shift(),S);while(ab.length){var P=[];ae=ab.shift();if(G.relative[ae]){ae+=ab.shift()}for(var af=0,ad=Y.length;af0){ah=D(Y)}else{Q=false}while(ab.length){var T=ab.pop(),W=T;if(!G.relative[T]){T=""}else{W=ab.pop()}if(W==null){W=S}G.relative[T](ah,W,M(S))}}if(!ah){ah=Y}if(!ah){throw"Syntax error, unrecognized expression: "+(T||ae)}if(F.call(ah)==="[object Array]"){if(!Q){aa.push.apply(aa,ah)}else{if(S.nodeType===1){for(var af=0;ah[af]!=null;af++){if(ah[af]&&(ah[af]===true||ah[af].nodeType===1&&H(S,ah[af]))){aa.push(Y[af])}}}else{for(var af=0;ah[af]!=null;af++){if(ah[af]&&ah[af].nodeType===1){aa.push(Y[af])}}}}}else{D(ah,aa)}if(R){E(R,S,aa,V)}return aa};E.matches=function(P,Q){return E(P,null,null,Q)};E.find=function(V,S){var W,Q;if(!V){return[]}for(var R=0,P=G.order.length;R":function(U,Q,V){if(typeof Q==="string"&&!/\W/.test(Q)){Q=V?Q:Q.toUpperCase();for(var R=0,P=U.length;R=0){if(!R){P.push(Q[T])}}else{if(R){Q[T]=false}}}return false},ID:function(P){return P[1].replace(/\\/g,"")},TAG:function(Q,P){for(var R=0;!P[R];R++){}return M(P[R])?Q[1]:Q[1].toUpperCase()},CHILD:function(P){if(P[1]=="nth"){var Q=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(P[2]=="even"&&"2n"||P[2]=="odd"&&"2n+1"||!/\D/.test(P[2])&&"0n+"+P[2]||P[2]);P[2]=(Q[1]+(Q[2]||1))-0;P[3]=Q[3]-0}P[0]="done"+(I++);return P},ATTR:function(Q){var P=Q[1];if(G.attrMap[P]){Q[1]=G.attrMap[P]}if(Q[2]==="~="){Q[4]=" "+Q[4]+" "}return Q},PSEUDO:function(T,Q,R,P,U){if(T[1]==="not"){if(T[3].match(N).length>1){T[3]=E(T[3],null,null,Q)}else{var S=E.filter(T[3],Q,R,true^U);if(!R){P.push.apply(P,S)}return false}}else{if(G.match.POS.test(T[0])){return true}}return T},POS:function(P){P.unshift(true);return P}},filters:{enabled:function(P){return P.disabled===false&&P.type!=="hidden"},disabled:function(P){return P.disabled===true},checked:function(P){return P.checked===true},selected:function(P){P.parentNode.selectedIndex;return P.selected===true},parent:function(P){return !!P.firstChild},empty:function(P){return !P.firstChild},has:function(R,Q,P){return !!E(P[3],R).length},header:function(P){return/h\d/i.test(P.nodeName)},text:function(P){return"text"===P.type},radio:function(P){return"radio"===P.type},checkbox:function(P){return"checkbox"===P.type},file:function(P){return"file"===P.type},password:function(P){return"password"===P.type},submit:function(P){return"submit"===P.type},image:function(P){return"image"===P.type},reset:function(P){return"reset"===P.type},button:function(P){return"button"===P.type||P.nodeName.toUpperCase()==="BUTTON"},input:function(P){return/input|select|textarea|button/i.test(P.nodeName)}},setFilters:{first:function(Q,P){return P===0},last:function(R,Q,P,S){return Q===S.length-1},even:function(Q,P){return P%2===0},odd:function(Q,P){return P%2===1},lt:function(R,Q,P){return QP[3]-0},nth:function(R,Q,P){return P[3]-0==Q},eq:function(R,Q,P){return P[3]-0==Q}},filter:{CHILD:function(P,S){var V=S[1],W=P.parentNode;var U="child"+W.childNodes.length;if(W&&(!W[U]||!P.nodeIndex)){var T=1;for(var Q=W.firstChild;Q;Q=Q.nextSibling){if(Q.nodeType==1){Q.nodeIndex=T++}}W[U]=T-1}if(V=="first"){return P.nodeIndex==1}else{if(V=="last"){return P.nodeIndex==W[U]}else{if(V=="only"){return W[U]==1}else{if(V=="nth"){var Y=false,R=S[2],X=S[3];if(R==1&&X==0){return true}if(R==0){if(P.nodeIndex==X){Y=true}}else{if((P.nodeIndex-X)%R==0&&(P.nodeIndex-X)/R>=0){Y=true}}return Y}}}}},PSEUDO:function(V,R,S,W){var Q=R[1],T=G.filters[Q];if(T){return T(V,S,R,W)}else{if(Q==="contains"){return(V.textContent||V.innerText||"").indexOf(R[3])>=0}else{if(Q==="not"){var U=R[3];for(var S=0,P=U.length;S=0:S==="~="?(" "+U+" ").indexOf(Q)>=0:!R[4]?P:S==="!="?U!=Q:S==="^="?U.indexOf(Q)===0:S==="$="?U.substr(U.length-Q.length)===Q:S==="|="?U===Q||U.substr(0,Q.length+1)===Q+"-":false},POS:function(T,Q,R,U){var P=Q[2],S=G.setFilters[P];if(S){return S(T,R,Q,U)}}}};for(var K in G.match){G.match[K]=RegExp(G.match[K].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var D=function(Q,P){Q=Array.prototype.slice.call(Q);if(P){P.push.apply(P,Q);return P}return Q};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(J){D=function(T,S){var Q=S||[];if(F.call(T)==="[object Array]"){Array.prototype.push.apply(Q,T)}else{if(typeof T.length==="number"){for(var R=0,P=T.length;R";var P=document.documentElement;P.insertBefore(Q,P.firstChild);if(!!document.getElementById(R)){G.find.ID=function(T,U){if(U.getElementById){var S=U.getElementById(T[1]);return S?S.id===T[1]||S.getAttributeNode&&S.getAttributeNode("id").nodeValue===T[1]?[S]:g:[]}};G.filter.ID=function(U,S){var T=U.getAttributeNode&&U.getAttributeNode("id");return U.nodeType===1&&T&&T.nodeValue===S}}P.removeChild(Q)})();(function(){var P=document.createElement("div");P.appendChild(document.createComment(""));if(P.getElementsByTagName("*").length>0){G.find.TAG=function(Q,U){var T=U.getElementsByTagName(Q[1]);if(Q[1]==="*"){var S=[];for(var R=0;T[R];R++){if(T[R].nodeType===1){S.push(T[R])}}T=S}return T}}P.innerHTML="";if(P.firstChild.getAttribute("href")!=="#"){G.attrHandle.href=function(Q){return Q.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var P=E;E=function(T,S,Q,R){S=S||document;if(!R&&S.nodeType===9){try{return D(S.querySelectorAll(T),Q)}catch(U){}}return P(T,S,Q,R)};E.find=P.find;E.filter=P.filter;E.selectors=P.selectors;E.matches=P.matches})()}if(document.documentElement.getElementsByClassName){G.order.splice(1,0,"CLASS");G.find.CLASS=function(P,Q){return Q.getElementsByClassName(P[1])}}function L(Q,W,V,Z,X,Y){for(var T=0,R=Z.length;T0){T=P;break}}}P=P[Q]}Y[S]=T}}}var H=document.compareDocumentPosition?function(Q,P){return Q.compareDocumentPosition(P)&16}:function(Q,P){return Q!==P&&(Q.contains?Q.contains(P):true)};var M=function(P){return P.documentElement&&!P.body||P.tagName&&P.ownerDocument&&!P.ownerDocument.body};n.find=E;n.filter=E.filter;n.expr=E.selectors;n.expr[":"]=n.expr.filters;E.selectors.filters.hidden=function(P){return"hidden"===P.type||n.css(P,"display")==="none"||n.css(P,"visibility")==="hidden"};E.selectors.filters.visible=function(P){return"hidden"!==P.type&&n.css(P,"display")!=="none"&&n.css(P,"visibility")!=="hidden"};E.selectors.filters.animated=function(P){return n.grep(n.timers,function(Q){return P===Q.elem}).length};n.multiFilter=function(R,P,Q){if(Q){R=":not("+R+")"}return E.matches(R,P)};n.dir=function(R,Q){var P=[],S=R[Q];while(S&&S!=document){if(S.nodeType==1){P.push(S)}S=S[Q]}return P};n.nth=function(T,P,R,S){P=P||1;var Q=0;for(;T;T=T[R]){if(T.nodeType==1&&++Q==P){break}}return T};n.sibling=function(R,Q){var P=[];for(;R;R=R.nextSibling){if(R.nodeType==1&&R!=Q){P.push(R)}}return P};return;l.Sizzle=E})();n.event={add:function(H,E,G,J){if(H.nodeType==3||H.nodeType==8){return}if(H.setInterval&&H!=l){H=l}if(!G.guid){G.guid=this.guid++}if(J!==g){var F=G;G=this.proxy(F);G.data=J}var D=n.data(H,"events")||n.data(H,"events",{}),I=n.data(H,"handle")||n.data(H,"handle",function(){return typeof n!=="undefined"&&!n.event.triggered?n.event.handle.apply(arguments.callee.elem,arguments):g});I.elem=H;n.each(E.split(/\s+/),function(L,M){var N=M.split(".");M=N.shift();G.type=N.slice().sort().join(".");var K=D[M];if(n.event.specialAll[M]){n.event.specialAll[M].setup.call(H,J,N)}if(!K){K=D[M]={};if(!n.event.special[M]||n.event.special[M].setup.call(H,J,N)===false){if(H.addEventListener){H.addEventListener(M,I,false)}else{if(H.attachEvent){H.attachEvent("on"+M,I)}}}}K[G.guid]=G;n.event.global[M]=true});H=null},guid:1,global:{},remove:function(J,G,I){if(J.nodeType==3||J.nodeType==8){return}var F=n.data(J,"events"),E,D;if(F){if(G===g||(typeof G==="string"&&G.charAt(0)==".")){for(var H in F){this.remove(J,H+(G||""))}}else{if(G.type){I=G.handler;G=G.type}n.each(G.split(/\s+/),function(L,N){var P=N.split(".");N=P.shift();var M=RegExp("(^|\\.)"+P.slice().sort().join(".*\\.")+"(\\.|$)");if(F[N]){if(I){delete F[N][I.guid]}else{for(var O in F[N]){if(M.test(F[N][O].type)){delete F[N][O]}}}if(n.event.specialAll[N]){n.event.specialAll[N].teardown.call(J,P)}for(E in F[N]){break}if(!E){if(!n.event.special[N]||n.event.special[N].teardown.call(J,P)===false){if(J.removeEventListener){J.removeEventListener(N,n.data(J,"handle"),false)}else{if(J.detachEvent){J.detachEvent("on"+N,n.data(J,"handle"))}}}E=null;delete F[N]}}})}for(E in F){break}if(!E){var K=n.data(J,"handle");if(K){K.elem=null}n.removeData(J,"events");n.removeData(J,"handle")}}},trigger:function(H,J,G,D){var F=H.type||H;if(!D){H=typeof H==="object"?H[h]?H:n.extend(n.Event(F),H):n.Event(F);if(F.indexOf("!")>=0){H.type=F=F.slice(0,-1);H.exclusive=true}if(!G){H.stopPropagation();if(this.global[F]){n.each(n.cache,function(){if(this.events&&this.events[F]){n.event.trigger(H,J,this.handle.elem)}})}}if(!G||G.nodeType==3||G.nodeType==8){return g}H.result=g;H.target=G;J=n.makeArray(J);J.unshift(H)}H.currentTarget=G;var I=n.data(G,"handle");if(I){I.apply(G,J)}if((!G[F]||(n.nodeName(G,"a")&&F=="click"))&&G["on"+F]&&G["on"+F].apply(G,J)===false){H.result=false}if(!D&&G[F]&&!H.isDefaultPrevented()&&!(n.nodeName(G,"a")&&F=="click")){this.triggered=true;try{G[F]()}catch(K){}}this.triggered=false;if(!H.isPropagationStopped()){var E=G.parentNode||G.ownerDocument;if(E){n.event.trigger(H,J,E,true)}}},handle:function(J){var I,D;J=arguments[0]=n.event.fix(J||l.event);var K=J.type.split(".");J.type=K.shift();I=!K.length&&!J.exclusive;var H=RegExp("(^|\\.)"+K.slice().sort().join(".*\\.")+"(\\.|$)");D=(n.data(this,"events")||{})[J.type];for(var F in D){var G=D[F];if(I||H.test(G.type)){J.handler=G;J.data=G.data;var E=G.apply(this,arguments);if(E!==g){J.result=E;if(E===false){J.preventDefault();J.stopPropagation()}}if(J.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(G){if(G[h]){return G}var E=G;G=n.Event(E);for(var F=this.props.length,I;F;){I=this.props[--F];G[I]=E[I]}if(!G.target){G.target=G.srcElement||document}if(G.target.nodeType==3){G.target=G.target.parentNode}if(!G.relatedTarget&&G.fromElement){G.relatedTarget=G.fromElement==G.target?G.toElement:G.fromElement}if(G.pageX==null&&G.clientX!=null){var H=document.documentElement,D=document.body;G.pageX=G.clientX+(H&&H.scrollLeft||D&&D.scrollLeft||0)-(H.clientLeft||0);G.pageY=G.clientY+(H&&H.scrollTop||D&&D.scrollTop||0)-(H.clientTop||0)}if(!G.which&&((G.charCode||G.charCode===0)?G.charCode:G.keyCode)){G.which=G.charCode||G.keyCode}if(!G.metaKey&&G.ctrlKey){G.metaKey=G.ctrlKey}if(!G.which&&G.button){G.which=(G.button&1?1:(G.button&2?3:(G.button&4?2:0)))}return G},proxy:function(E,D){D=D||function(){return E.apply(this,arguments)};D.guid=E.guid=E.guid||D.guid||this.guid++;return D},special:{ready:{setup:A,teardown:function(){}}},specialAll:{live:{setup:function(D,E){n.event.add(this,E[0],c)},teardown:function(F){if(F.length){var D=0,E=RegExp("(^|\\.)"+F[0]+"(\\.|$)");n.each((n.data(this,"events").live||{}),function(){if(E.test(this.type)){D++}});if(D<1){n.event.remove(this,F[0],c)}}}}}};n.Event=function(D){if(!this.preventDefault){return new n.Event(D)}if(D&&D.type){this.originalEvent=D;this.type=D.type;this.timeStamp=D.timeStamp}else{this.type=D}if(!this.timeStamp){this.timeStamp=e()}this[h]=true};function k(){return false}function t(){return true}n.Event.prototype={preventDefault:function(){this.isDefaultPrevented=t;var D=this.originalEvent;if(!D){return}if(D.preventDefault){D.preventDefault()}D.returnValue=false},stopPropagation:function(){this.isPropagationStopped=t;var D=this.originalEvent;if(!D){return}if(D.stopPropagation){D.stopPropagation()}D.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=t;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(E){var D=E.relatedTarget;while(D&&D!=this){try{D=D.parentNode}catch(F){D=this}}if(D!=this){E.type=E.data;n.event.handle.apply(this,arguments)}};n.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(E,D){n.event.special[D]={setup:function(){n.event.add(this,E,a,D)},teardown:function(){n.event.remove(this,E,a)}}});n.fn.extend({bind:function(E,F,D){return E=="unload"?this.one(E,F,D):this.each(function(){n.event.add(this,E,D||F,D&&F)})},one:function(F,G,E){var D=n.event.proxy(E||G,function(H){n(this).unbind(H,D);return(E||G).apply(this,arguments)});return this.each(function(){n.event.add(this,F,D,E&&G)})},unbind:function(E,D){return this.each(function(){n.event.remove(this,E,D)})},trigger:function(D,E){return this.each(function(){n.event.trigger(D,E,this)})},triggerHandler:function(D,F){if(this[0]){var E=n.Event(D);E.preventDefault();E.stopPropagation();n.event.trigger(E,F,this[0]);return E.result}},toggle:function(F){var D=arguments,E=1;while(E=0){var D=F.slice(H,F.length);F=F.slice(0,H)}var G="GET";if(I){if(n.isFunction(I)){J=I;I=null}else{if(typeof I==="object"){I=n.param(I);G="POST"}}}var E=this;n.ajax({url:F,type:G,dataType:"html",data:I,complete:function(L,K){if(K=="success"||K=="notmodified"){E.html(D?n("
").append(L.responseText.replace(//g,"")).find(D):L.responseText)}if(J){E.each(J,[L.responseText,K,L])}}});return this},serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?n.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type))}).map(function(D,E){var F=n(this).val();return F==null?null:n.isArray(F)?n.map(F,function(H,G){return{name:E.name,value:H}}):{name:E.name,value:F}}).get()}});n.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(D,E){n.fn[E]=function(F){return this.bind(E,F)}});var q=e();n.extend({get:function(D,F,G,E){if(n.isFunction(F)){G=F;F=null}return n.ajax({type:"GET",url:D,data:F,success:G,dataType:E})},getScript:function(D,E){return n.get(D,null,E,"script")},getJSON:function(D,E,F){return n.get(D,E,F,"json")},post:function(D,F,G,E){if(n.isFunction(F)){G=F;F={}}return n.ajax({type:"POST",url:D,data:F,success:G,dataType:E})},ajaxSetup:function(D){n.extend(n.ajaxSettings,D)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(L){L=n.extend(true,L,n.extend(true,{},n.ajaxSettings,L));var V,E=/=\?(&|$)/g,Q,U,F=L.type.toUpperCase();if(L.data&&L.processData&&typeof L.data!=="string"){L.data=n.param(L.data)}if(L.dataType=="jsonp"){if(F=="GET"){if(!L.url.match(E)){L.url+=(L.url.match(/\?/)?"&":"?")+(L.jsonp||"callback")+"=?"}}else{if(!L.data||!L.data.match(E)){L.data=(L.data?L.data+"&":"")+(L.jsonp||"callback")+"=?"}}L.dataType="json"}if(L.dataType=="json"&&(L.data&&L.data.match(E)||L.url.match(E))){V="jsonp"+q++;if(L.data){L.data=(L.data+"").replace(E,"="+V+"$1")}L.url=L.url.replace(E,"="+V+"$1");L.dataType="script";l[V]=function(W){U=W;H();K();l[V]=g;try{delete l[V]}catch(X){}if(G){G.removeChild(S)}}}if(L.dataType=="script"&&L.cache==null){L.cache=false}if(L.cache===false&&F=="GET"){var D=e();var T=L.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+D+"$2");L.url=T+((T==L.url)?(L.url.match(/\?/)?"&":"?")+"_="+D:"")}if(L.data&&F=="GET"){L.url+=(L.url.match(/\?/)?"&":"?")+L.data;L.data=null}if(L.global&&!n.active++){n.event.trigger("ajaxStart")}var P=/^(\w+:)?\/\/([^\/?#]+)/.exec(L.url);if(L.dataType=="script"&&F=="GET"&&P&&(P[1]&&P[1]!=location.protocol||P[2]!=location.host)){var G=document.getElementsByTagName("head")[0];var S=document.createElement("script");S.src=L.url;if(L.scriptCharset){S.charset=L.scriptCharset}if(!V){var N=false;S.onload=S.onreadystatechange=function(){if(!N&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){N=true;H();K();G.removeChild(S)}}}G.appendChild(S);return g}var J=false;var I=L.xhr();if(L.username){I.open(F,L.url,L.async,L.username,L.password)}else{I.open(F,L.url,L.async)}try{if(L.data){I.setRequestHeader("Content-Type",L.contentType)}if(L.ifModified){I.setRequestHeader("If-Modified-Since",n.lastModified[L.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}I.setRequestHeader("X-Requested-With","XMLHttpRequest");I.setRequestHeader("Accept",L.dataType&&L.accepts[L.dataType]?L.accepts[L.dataType]+", */*":L.accepts._default)}catch(R){}if(L.beforeSend&&L.beforeSend(I,L)===false){if(L.global&&!--n.active){n.event.trigger("ajaxStop")}I.abort();return false}if(L.global){n.event.trigger("ajaxSend",[I,L])}var M=function(W){if(I.readyState==0){if(O){clearInterval(O);O=null;if(L.global&&!--n.active){n.event.trigger("ajaxStop")}}}else{if(!J&&I&&(I.readyState==4||W=="timeout")){J=true;if(O){clearInterval(O);O=null}Q=W=="timeout"?"timeout":!n.httpSuccess(I)?"error":L.ifModified&&n.httpNotModified(I,L.url)?"notmodified":"success";if(Q=="success"){try{U=n.httpData(I,L.dataType,L)}catch(Y){Q="parsererror"}}if(Q=="success"){var X;try{X=I.getResponseHeader("Last-Modified")}catch(Y){}if(L.ifModified&&X){n.lastModified[L.url]=X}if(!V){H()}}else{n.handleError(L,I,Q)}K();if(L.async){I=null}}}};if(L.async){var O=setInterval(M,13);if(L.timeout>0){setTimeout(function(){if(I){if(!J){M("timeout")}if(I){I.abort()}}},L.timeout)}}try{I.send(L.data)}catch(R){n.handleError(L,I,null,R)}if(!L.async){M()}function H(){if(L.success){L.success(U,Q)}if(L.global){n.event.trigger("ajaxSuccess",[I,L])}}function K(){if(L.complete){L.complete(I,Q)}if(L.global){n.event.trigger("ajaxComplete",[I,L])}if(L.global&&!--n.active){n.event.trigger("ajaxStop")}}return I},handleError:function(E,G,D,F){if(E.error){E.error(G,D,F)}if(E.global){n.event.trigger("ajaxError",[G,E,F])}},active:0,httpSuccess:function(E){try{return !E.status&&location.protocol=="file:"||(E.status>=200&&E.status<300)||E.status==304||E.status==1223}catch(D){}return false},httpNotModified:function(F,D){try{var G=F.getResponseHeader("Last-Modified");return F.status==304||G==n.lastModified[D]}catch(E){}return false},httpData:function(I,G,F){var E=I.getResponseHeader("content-type"),D=G=="xml"||!G&&E&&E.indexOf("xml")>=0,H=D?I.responseXML:I.responseText;if(D&&H.documentElement.tagName=="parsererror"){throw"parsererror"}if(F&&F.dataFilter){H=F.dataFilter(H,G)}if(typeof H==="string"){if(G=="script"){n.globalEval(H)}if(G=="json"){H=l["eval"]("("+H+")")}}return H},param:function(D){var F=[];function G(H,I){F[F.length]=encodeURIComponent(H)+"="+encodeURIComponent(I)}if(n.isArray(D)||D.jquery){n.each(D,function(){G(this.name,this.value)})}else{for(var E in D){if(n.isArray(D[E])){n.each(D[E],function(){G(E,this)})}else{G(E,n.isFunction(D[E])?D[E]():D[E])}}}return F.join("&").replace(/%20/g,"+")}});var m={},d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function s(E,D){var F={};n.each(d.concat.apply([],d.slice(0,D)),function(){F[this]=E});return F}n.fn.extend({show:function(I,K){if(I){return this.animate(s("show",3),I,K)}else{for(var G=0,E=this.length;G").appendTo("body");J=H.css("display");if(J==="none"){J="block"}H.remove();m[F]=J}this[G].style.display=n.data(this[G],"olddisplay",J)}}return this}},hide:function(G,H){if(G){return this.animate(s("hide",3),G,H)}else{for(var F=0,E=this.length;F=0;G--){if(F[G].elem==this){if(D){F[G](true)}F.splice(G,1)}}});if(!D){this.dequeue()}return this}});n.each({slideDown:s("show",1),slideUp:s("hide",1),slideToggle:s("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(D,E){n.fn[D]=function(F,G){return this.animate(E,F,G)}});n.extend({speed:function(F,G,E){var D=typeof F==="object"?F:{complete:E||!E&&G||n.isFunction(F)&&F,duration:F,easing:E&&G||G&&!n.isFunction(G)&&G};D.duration=n.fx.off?0:typeof D.duration==="number"?D.duration:n.fx.speeds[D.duration]||n.fx.speeds._default;D.old=D.complete;D.complete=function(){if(D.queue!==false){n(this).dequeue()}if(n.isFunction(D.old)){D.old.call(this)}};return D},easing:{linear:function(F,G,D,E){return D+E*F},swing:function(F,G,D,E){return((-Math.cos(F*Math.PI)/2)+0.5)*E+D}},timers:[],timerId:null,fx:function(E,D,F){this.options=D;this.elem=E;this.prop=F;if(!D.orig){D.orig={}}}});n.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(n.fx.step[this.prop]||n.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(E){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var D=parseFloat(n.css(this.elem,this.prop,E));return D&&D>-10000?D:parseFloat(n.curCSS(this.elem,this.prop))||0},custom:function(H,G,F){this.startTime=e();this.start=H;this.end=G;this.unit=F||this.unit||"px";this.now=this.start;this.pos=this.state=0;var D=this;function E(I){return D.step(I)}E.elem=this.elem;n.timers.push(E);if(E()&&n.timerId==null){n.timerId=setInterval(function(){var J=n.timers;for(var I=0;I=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var D=true;for(var E in this.options.curAnim){if(this.options.curAnim[E]!==true){D=false}}if(D){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(n.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){n(this.elem).hide()}if(this.options.hide||this.options.show){for(var H in this.options.curAnim){n.attr(this.elem.style,H,this.options.orig[H])}}}if(D){this.options.complete.call(this.elem)}return false}else{var I=F-this.startTime;this.state=I/this.options.duration;this.pos=n.easing[this.options.easing||(n.easing.swing?"swing":"linear")](this.state,I,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};n.extend(n.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(D){n.attr(D.elem.style,"opacity",D.now)},_default:function(D){if(D.elem.style&&D.elem.style[D.prop]!=null){D.elem.style[D.prop]=D.now+D.unit}else{D.elem[D.prop]=D.now}}}});if(document.documentElement.getBoundingClientRect){n.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return n.offset.bodyOffset(this[0])}var F=this[0].getBoundingClientRect(),I=this[0].ownerDocument,E=I.body,D=I.documentElement,K=D.clientTop||E.clientTop||0,J=D.clientLeft||E.clientLeft||0,H=F.top+(self.pageYOffset||n.boxModel&&D.scrollTop||E.scrollTop)-K,G=F.left+(self.pageXOffset||n.boxModel&&D.scrollLeft||E.scrollLeft)-J;return{top:H,left:G}}}else{n.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return n.offset.bodyOffset(this[0])}n.offset.initialized||n.offset.initialize();var I=this[0],F=I.offsetParent,E=I,N=I.ownerDocument,L,G=N.documentElement,J=N.body,K=N.defaultView,D=K.getComputedStyle(I,null),M=I.offsetTop,H=I.offsetLeft;while((I=I.parentNode)&&I!==J&&I!==G){L=K.getComputedStyle(I,null);M-=I.scrollTop,H-=I.scrollLeft;if(I===F){M+=I.offsetTop,H+=I.offsetLeft;if(n.offset.doesNotAddBorder&&!(n.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(I.tagName))){M+=parseInt(L.borderTopWidth,10)||0,H+=parseInt(L.borderLeftWidth,10)||0}E=F,F=I.offsetParent}if(n.offset.subtractsBorderForOverflowNotVisible&&L.overflow!=="visible"){M+=parseInt(L.borderTopWidth,10)||0,H+=parseInt(L.borderLeftWidth,10)||0}D=L}if(D.position==="relative"||D.position==="static"){M+=J.offsetTop,H+=J.offsetLeft}if(D.position==="fixed"){M+=Math.max(G.scrollTop,J.scrollTop),H+=Math.max(G.scrollLeft,J.scrollLeft)}return{top:M,left:H}}}n.offset={initialize:function(){if(this.initialized){return}var K=document.body,E=document.createElement("div"),G,F,M,H,L,D,I=K.style.marginTop,J='
';L={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(D in L){E.style[D]=L[D]}E.innerHTML=J;K.insertBefore(E,K.firstChild);G=E.firstChild,F=G.firstChild,H=G.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(F.offsetTop!==5);this.doesAddBorderForTableAndCells=(H.offsetTop===5);G.style.overflow="hidden",G.style.position="relative";this.subtractsBorderForOverflowNotVisible=(F.offsetTop===-5);K.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(K.offsetTop===0);K.style.marginTop=I;K.removeChild(E);this.initialized=true},bodyOffset:function(D){n.offset.initialized||n.offset.initialize();var F=D.offsetTop,E=D.offsetLeft;if(n.offset.doesNotIncludeMarginInBodyOffset){F+=parseInt(n.curCSS(D,"marginTop",true),10)||0,E+=parseInt(n.curCSS(D,"marginLeft",true),10)||0}return{top:F,left:E}}};n.fn.extend({position:function(){var H=0,G=0,E;if(this[0]){var F=this.offsetParent(),I=this.offset(),D=/^body|html$/i.test(F[0].tagName)?{top:0,left:0}:F.offset();I.top-=j(this,"marginTop");I.left-=j(this,"marginLeft");D.top+=j(F,"borderTopWidth");D.left+=j(F,"borderLeftWidth");E={top:I.top-D.top,left:I.left-D.left}}return E},offsetParent:function(){var D=this[0].offsetParent||document.body;while(D&&(!/^body|html$/i.test(D.tagName)&&n.css(D,"position")=="static")){D=D.offsetParent}return n(D)}});n.each(["Left","Top"],function(E,D){var F="scroll"+D;n.fn[F]=function(G){if(!this[0]){return null}return G!==g?this.each(function(){this==l||this==document?l.scrollTo(!E?G:n(l).scrollLeft(),E?G:n(l).scrollTop()):this[F]=G}):this[0]==l||this[0]==document?self[E?"pageYOffset":"pageXOffset"]||n.boxModel&&document.documentElement[F]||document.body[F]:this[0][F]}});n.each(["Height","Width"],function(G,E){var D=G?"Left":"Top",F=G?"Right":"Bottom";n.fn["inner"+E]=function(){return this[E.toLowerCase()]()+j(this,"padding"+D)+j(this,"padding"+F)};n.fn["outer"+E]=function(I){return this["inner"+E]()+j(this,"border"+D+"Width")+j(this,"border"+F+"Width")+(I?j(this,"margin"+D)+j(this,"margin"+F):0)};var H=E.toLowerCase();n.fn[H]=function(I){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+E]||document.body["client"+E]:this[0]==document?Math.max(document.documentElement["client"+E],document.body["scroll"+E],document.documentElement["scroll"+E],document.body["offset"+E],document.documentElement["offset"+E]):I===g?(this.length?n.css(this[0],H):null):this.css(H,typeof I==="string"?I:I+"px")}})})(); \ No newline at end of file diff --git a/jawstats/js/jquery.tablesorter.js b/jawstats/js/jquery.tablesorter.js new file mode 100755 index 0000000..b5e5be7 --- /dev/null +++ b/jawstats/js/jquery.tablesorter.js @@ -0,0 +1,876 @@ +/* + * + * TableSorter 2.0 - Client-side table sorting with ease! + * Version 2.0.3 + * @requires jQuery v1.2.3 + * + * Copyright (c) 2007 Christian Bach + * Examples and docs at: http://tablesorter.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ +/** + * + * @description Create a sortable table with multi-column sorting capabilitys + * + * @example $('table').tablesorter(); + * @desc Create a simple tablesorter interface. + * + * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] }); + * @desc Create a tablesorter interface and sort on the first and secound column in ascending order. + * + * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } }); + * @desc Create a tablesorter interface and disableing the first and secound column headers. + * + * @example $('table').tablesorter({ 0: {sorter:"integer"}, 1: {sorter:"currency"} }); + * @desc Create a tablesorter interface and set a column parser for the first and secound column. + * + * + * @param Object settings An object literal containing key/value pairs to provide optional settings. + * + * @option String cssHeader (optional) A string of the class name to be appended to sortable tr elements in the thead of the table. + * Default value: "header" + * + * @option String cssAsc (optional) A string of the class name to be appended to sortable tr elements in the thead on a ascending sort. + * Default value: "headerSortUp" + * + * @option String cssDesc (optional) A string of the class name to be appended to sortable tr elements in the thead on a descending sort. + * Default value: "headerSortDown" + * + * @option String sortInitialOrder (optional) A string of the inital sorting order can be asc or desc. + * Default value: "asc" + * + * @option String sortMultisortKey (optional) A string of the multi-column sort key. + * Default value: "shiftKey" + * + * @option String textExtraction (optional) A string of the text-extraction method to use. + * For complex html structures inside td cell set this option to "complex", + * on large tables the complex option can be slow. + * Default value: "simple" + * + * @option Object headers (optional) An array containing the forces sorting rules. + * This option let's you specify a default sorting rule. + * Default value: null + * + * @option Array sortList (optional) An array containing the forces sorting rules. + * This option let's you specify a default sorting rule. + * Default value: null + * + * @option Array sortForce (optional) An array containing forced sorting rules. + * This option let's you specify a default sorting rule, which is prepended to user-selected rules. + * Default value: null + * + * @option Array sortAppend (optional) An array containing forced sorting rules. + * This option let's you specify a default sorting rule, which is appended to user-selected rules. + * Default value: null + * + * @option Boolean widthFixed (optional) Boolean flag indicating if tablesorter should apply fixed widths to the table columns. + * This is usefull when using the pager companion plugin. + * This options requires the dimension jquery plugin. + * Default value: false + * + * @option Boolean cancelSelection (optional) Boolean flag indicating if tablesorter should cancel selection of the table headers text. + * Default value: true + * + * @option Boolean debug (optional) Boolean flag indicating if tablesorter should display debuging information usefull for development. + * + * @type jQuery + * + * @name tablesorter + * + * @cat Plugins/Tablesorter + * + * @author Christian Bach/christian.bach@polyester.se + */ + +(function($) { + $.extend({ + tablesorter: new function() { + + var parsers = [], widgets = []; + + this.defaults = { + cssHeader: "header", + cssAsc: "headerSortUp", + cssDesc: "headerSortDown", + sortInitialOrder: "asc", + sortMultiSortKey: "shiftKey", + sortForce: null, + sortAppend: null, + textExtraction: "simple", + parsers: {}, + widgets: [], + widgetZebra: {css: ["even","odd"]}, + headers: {}, + widthFixed: false, + cancelSelection: true, + sortList: [], + headerList: [], + dateFormat: "us", + decimal: '.', + debug: false + }; + + /* debuging utils */ + function benchmark(s,d) { + log(s + "," + (new Date().getTime() - d.getTime()) + "ms"); + } + + this.benchmark = benchmark; + + function log(s) { + if (typeof console != "undefined" && typeof console.debug != "undefined") { + console.log(s); + } else { + alert(s); + } + } + + /* parsers utils */ + function buildParserCache(table,$headers) { + + if(table.config.debug) { var parsersDebug = ""; } + + var rows = table.tBodies[0].rows; + + if(table.tBodies[0].rows[0]) { + + var list = [], cells = rows[0].cells, l = cells.length; + + for (var i=0;i < l; i++) { + var p = false; + + if($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter) ) { + + p = getParserById($($headers[i]).metadata().sorter); + + } else if((table.config.headers[i] && table.config.headers[i].sorter)) { + + p = getParserById(table.config.headers[i].sorter); + } + if(!p) { + p = detectParserForColumn(table,cells[i]); + } + + if(table.config.debug) { parsersDebug += "column:" + i + " parser:" +p.id + "\n"; } + + list.push(p); + } + } + + if(table.config.debug) { log(parsersDebug); } + + return list; + }; + + function detectParserForColumn(table,node) { + var l = parsers.length; + for(var i=1; i < l; i++) { + if(parsers[i].is($.trim(getElementText(table.config,node)),table,node)) { + return parsers[i]; + } + } + // 0 is always the generic parser (text) + return parsers[0]; + } + + function getParserById(name) { + var l = parsers.length; + for(var i=0; i < l; i++) { + if(parsers[i].id.toLowerCase() == name.toLowerCase()) { + return parsers[i]; + } + } + return false; + } + + /* utils */ + function buildCache(table) { + + if(table.config.debug) { var cacheTime = new Date(); } + + + var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0, + totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0, + parsers = table.config.parsers, + cache = {row: [], normalized: []}; + + for (var i=0;i < totalRows; ++i) { + + /** Add the table data to main data array */ + var c = table.tBodies[0].rows[i], cols = []; + + cache.row.push($(c)); + + for(var j=0; j < totalCells; ++j) { + cols.push(parsers[j].format(getElementText(table.config,c.cells[j]),table,c.cells[j])); + } + + cols.push(i); // add position for rowCache + cache.normalized.push(cols); + cols = null; + }; + + if(table.config.debug) { benchmark("Building cache for " + totalRows + " rows:", cacheTime); } + + return cache; + }; + + function getElementText(config,node) { + + if(!node) return ""; + + var t = ""; + + if(config.textExtraction == "simple") { + if(node.childNodes[0] && node.childNodes[0].hasChildNodes()) { + t = node.childNodes[0].innerHTML; + } else { + t = node.innerHTML; + } + } else { + if(typeof(config.textExtraction) == "function") { + t = config.textExtraction(node); + } else { + t = $(node).text(); + } + } + return t; + } + + function appendToTable(table,cache) { + + if(table.config.debug) {var appendTime = new Date()} + + var c = cache, + r = c.row, + n= c.normalized, + totalRows = n.length, + checkCell = (n[0].length-1), + tableBody = $(table.tBodies[0]), + rows = []; + + for (var i=0;i < totalRows; i++) { + rows.push(r[n[i][checkCell]]); + if(!table.config.appender) { + + var o = r[n[i][checkCell]]; + var l = o.length; + for(var j=0; j < l; j++) { + + tableBody[0].appendChild(o[j]); + + } + + //tableBody.append(r[n[i][checkCell]]); + } + } + + if(table.config.appender) { + + table.config.appender(table,rows); + } + + rows = null; + + if(table.config.debug) { benchmark("Rebuilt table:", appendTime); } + + //apply table widgets + applyWidget(table); + + // trigger sortend + setTimeout(function() { + $(table).trigger("sortEnd"); + },0); + + }; + + function buildHeaders(table) { + + if(table.config.debug) { var time = new Date(); } + + var meta = ($.metadata) ? true : false, tableHeadersRows = []; + + for(var i = 0; i < table.tHead.rows.length; i++) { tableHeadersRows[i]=0; }; + + $tableHeaders = $("thead th",table); + + $tableHeaders.each(function(index) { + + this.count = 0; + this.column = index; + this.order = formatSortingOrder(table.config.sortInitialOrder); + + if(checkHeaderMetadata(this) || checkHeaderOptions(table,index)) this.sortDisabled = true; + + if(!this.sortDisabled) { + $(this).addClass(table.config.cssHeader); + } + + // add cell to headerList + table.config.headerList[index]= this; + }); + + if(table.config.debug) { benchmark("Built headers:", time); log($tableHeaders); } + + return $tableHeaders; + + }; + + function checkCellColSpan(table, rows, row) { + var arr = [], r = table.tHead.rows, c = r[row].cells; + + for(var i=0; i < c.length; i++) { + var cell = c[i]; + + if ( cell.colSpan > 1) { + arr = arr.concat(checkCellColSpan(table, headerArr,row++)); + } else { + if(table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row+1])) { + arr.push(cell); + } + //headerArr[row] = (i+row); + } + } + return arr; + }; + + function checkHeaderMetadata(cell) { + if(($.metadata) && ($(cell).metadata().sorter === false)) { return true; }; + return false; + } + + function checkHeaderOptions(table,i) { + if((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { return true; }; + return false; + } + + function applyWidget(table) { + var c = table.config.widgets; + var l = c.length; + for(var i=0; i < l; i++) { + + getWidgetById(c[i]).format(table); + } + + } + + function getWidgetById(name) { + var l = widgets.length; + for(var i=0; i < l; i++) { + if(widgets[i].id.toLowerCase() == name.toLowerCase() ) { + return widgets[i]; + } + } + }; + + function formatSortingOrder(v) { + + if(typeof(v) != "Number") { + i = (v.toLowerCase() == "desc") ? 1 : 0; + } else { + i = (v == (0 || 1)) ? v : 0; + } + return i; + } + + function isValueInArray(v, a) { + var l = a.length; + for(var i=0; i < l; i++) { + if(a[i][0] == v) { + return true; + } + } + return false; + } + + function setHeadersCss(table,$headers, list, css) { + // remove all header information + $headers.removeClass(css[0]).removeClass(css[1]); + + var h = []; + $headers.each(function(offset) { + if(!this.sortDisabled) { + h[this.column] = $(this); + } + }); + + var l = list.length; + for(var i=0; i < l; i++) { + h[list[i][0]].addClass(css[list[i][1]]); + } + } + + function fixColumnWidth(table,$headers) { + var c = table.config; + if(c.widthFixed) { + var colgroup = $(''); + $("tr:first td",table.tBodies[0]).each(function() { + colgroup.append($('').css('width',$(this).width())); + }); + $(table).prepend(colgroup); + }; + } + + function updateHeaderSortCount(table,sortList) { + var c = table.config, l = sortList.length; + for(var i=0; i < l; i++) { + var s = sortList[i], o = c.headerList[s[0]]; + o.count = s[1]; + o.count++; + } + } + + /* sorting methods */ + function multisort(table,sortList,cache) { + + if(table.config.debug) { var sortTime = new Date(); } + + var dynamicExp = "var sortWrapper = function(a,b) {", l = sortList.length; + + for(var i=0; i < l; i++) { + + var c = sortList[i][0]; + var order = sortList[i][1]; + var s = (getCachedSortType(table.config.parsers,c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc"); + + var e = "e" + i; + + dynamicExp += "var " + e + " = " + s + "(a[" + c + "],b[" + c + "]); "; + dynamicExp += "if(" + e + ") { return " + e + "; } "; + dynamicExp += "else { "; + } + + // if value is the same keep orignal order + var orgOrderCol = cache.normalized[0].length - 1; + dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];"; + + for(var i=0; i < l; i++) { + dynamicExp += "}; "; + } + + dynamicExp += "return 0; "; + dynamicExp += "}; "; + + eval(dynamicExp); + + cache.normalized.sort(sortWrapper); + + if(table.config.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order+ " time:", sortTime); } + + return cache; + }; + + function sortText(a,b) { + return ((a < b) ? -1 : ((a > b) ? 1 : 0)); + }; + + function sortTextDesc(a,b) { + return ((b < a) ? -1 : ((b > a) ? 1 : 0)); + }; + + function sortNumeric(a,b) { + return a-b; + }; + + function sortNumericDesc(a,b) { + return b-a; + }; + + function getCachedSortType(parsers,i) { + return parsers[i].type; + }; + + /* public methods */ + this.construct = function(settings) { + + return this.each(function() { + + if(!this.tHead || !this.tBodies) return; + + var $this, $document,$headers, cache, config, shiftDown = 0, sortOrder; + + this.config = {}; + + config = $.extend(this.config, $.tablesorter.defaults, settings); + + // store common expression for speed + $this = $(this); + + // build headers + $headers = buildHeaders(this); + + // try to auto detect column type, and store in tables config + this.config.parsers = buildParserCache(this,$headers); + + + // build the cache for the tbody cells + cache = buildCache(this); + + // get the css class names, could be done else where. + var sortCSS = [config.cssDesc,config.cssAsc]; + + // fixate columns if the users supplies the fixedWidth option + fixColumnWidth(this); + + // apply event handling to headers + // this is to big, perhaps break it out? + $headers.click(function(e) { + + $this.trigger("sortStart"); + + var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0; + + if(!this.sortDisabled && totalRows > 0) { + + + // store exp, for speed + var $cell = $(this); + + // get current column index + var i = this.column; + + // get current column sort order + this.order = this.count++ % 2; + + // user only whants to sort on one column + if(!e[config.sortMultiSortKey]) { + + // flush the sort list + config.sortList = []; + + if(config.sortForce != null) { + var a = config.sortForce; + for(var j=0; j < a.length; j++) { + if(a[j][0] != i) { + config.sortList.push(a[j]); + } + } + } + + // add column to sort list + config.sortList.push([i,this.order]); + + // multi column sorting + } else { + // the user has clicked on an all ready sortet column. + if(isValueInArray(i,config.sortList)) { + + // revers the sorting direction for all tables. + for(var j=0; j < config.sortList.length; j++) { + var s = config.sortList[j], o = config.headerList[s[0]]; + if(s[0] == i) { + o.count = s[1]; + o.count++; + s[1] = o.count % 2; + } + } + } else { + // add column to sort list array + config.sortList.push([i,this.order]); + } + }; + setTimeout(function() { + //set css for headers + setHeadersCss($this[0],$headers,config.sortList,sortCSS); + appendToTable($this[0],multisort($this[0],config.sortList,cache)); + },1); + // stop normal event by returning false + return false; + } + // cancel selection + }).mousedown(function() { + if(config.cancelSelection) { + this.onselectstart = function() {return false}; + return false; + } + }); + + // apply easy methods that trigger binded events + $this.bind("update",function() { + + // rebuild parsers. + this.config.parsers = buildParserCache(this,$headers); + + // rebuild the cache map + cache = buildCache(this); + + }).bind("sorton",function(e,list) { + + $(this).trigger("sortStart"); + + config.sortList = list; + + // update and store the sortlist + var sortList = config.sortList; + + // update header count index + updateHeaderSortCount(this,sortList); + + //set css for headers + setHeadersCss(this,$headers,sortList,sortCSS); + + + // sort the table and append it to the dom + appendToTable(this,multisort(this,sortList,cache)); + + }).bind("appendCache",function() { + + appendToTable(this,cache); + + }).bind("applyWidgetId",function(e,id) { + + getWidgetById(id).format(this); + + }).bind("applyWidgets",function() { + // apply widgets + applyWidget(this); + }); + + if($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) { + config.sortList = $(this).metadata().sortlist; + } + // if user has supplied a sort list to constructor. + if(config.sortList.length > 0) { + $this.trigger("sorton",[config.sortList]); + } + + // apply widgets + applyWidget(this); + }); + }; + + this.addParser = function(parser) { + var l = parsers.length, a = true; + for(var i=0; i < l; i++) { + if(parsers[i].id.toLowerCase() == parser.id.toLowerCase()) { + a = false; + } + } + if(a) { parsers.push(parser); }; + }; + + this.addWidget = function(widget) { + widgets.push(widget); + }; + + this.formatFloat = function(s) { + var i = parseFloat(s); + return (isNaN(i)) ? 0 : i; + }; + this.formatInt = function(s) { + var i = parseInt(s); + return (isNaN(i)) ? 0 : i; + }; + + this.isDigit = function(s,config) { + var DECIMAL = '\\' + config.decimal; + var exp = '/(^[+]?0(' + DECIMAL +'0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)' + DECIMAL +'(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*' + DECIMAL +'0+$)/'; + return RegExp(exp).test($.trim(s)); + }; + + this.clearTableBody = function(table) { + if($.browser.msie) { + function empty() { + while ( this.firstChild ) this.removeChild( this.firstChild ); + } + empty.apply(table.tBodies[0]); + } else { + table.tBodies[0].innerHTML = ""; + } + }; + } + }); + + // extend plugin scope + $.fn.extend({ + tablesorter: $.tablesorter.construct + }); + + var ts = $.tablesorter; + + // add default parsers + ts.addParser({ + id: "text", + is: function(s) { + return true; + }, + format: function(s) { + return $.trim(s.toLowerCase()); + }, + type: "text" + }); + + ts.addParser({ + id: "digit", + is: function(s,table) { + var c = table.config; + return $.tablesorter.isDigit(s,c); + }, + format: function(s) { + return $.tablesorter.formatFloat(s); + }, + type: "numeric" + }); + + ts.addParser({ + id: "currency", + is: function(s) { + return /^[£$€?.]/.test(s); + }, + format: function(s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),"")); + }, + type: "numeric" + }); + + ts.addParser({ + id: "ipAddress", + is: function(s) { + return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s); + }, + format: function(s) { + var a = s.split("."), r = "", l = a.length; + for(var i = 0; i < l; i++) { + var item = a[i]; + if(item.length == 2) { + r += "0" + item; + } else { + r += item; + } + } + return $.tablesorter.formatFloat(r); + }, + type: "numeric" + }); + + ts.addParser({ + id: "url", + is: function(s) { + return /^(https?|ftp|file):\/\/$/.test(s); + }, + format: function(s) { + return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),'')); + }, + type: "text" + }); + + ts.addParser({ + id: "isoDate", + is: function(s) { + return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s); + }, + format: function(s) { + return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(new RegExp(/-/g),"/")).getTime() : "0"); + }, + type: "numeric" + }); + + ts.addParser({ + id: "percent", + is: function(s) { + return /\%$/.test($.trim(s)); + }, + format: function(s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),"")); + }, + type: "numeric" + }); + + ts.addParser({ + id: "usLongDate", + is: function(s) { + return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); + }, + format: function(s) { + return $.tablesorter.formatFloat(new Date(s).getTime()); + }, + type: "numeric" + }); + + ts.addParser({ + id: "shortDate", + is: function(s) { + return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s); + }, + format: function(s,table) { + var c = table.config; + s = s.replace(/\-/g,"/"); + if(c.dateFormat == "us") { + // reformat the string in ISO format + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2"); + } else if(c.dateFormat == "uk") { + //reformat the string in ISO format + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1"); + } else if(c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") { + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3"); + } + return $.tablesorter.formatFloat(new Date(s).getTime()); + }, + type: "numeric" + }); + + ts.addParser({ + id: "time", + is: function(s) { + return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s); + }, + format: function(s) { + return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime()); + }, + type: "numeric" + }); + + + ts.addParser({ + id: "metadata", + is: function(s) { + return false; + }, + format: function(s,table,cell) { + var c = table.config, p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName; + return $(cell).metadata()[p]; + }, + type: "numeric" + }); + + // JAWStats specific.. + ts.addParser({ + id: "bandwidth", + is: function(s) { + return false; + }, + format: function(s) { + // format your data for normalization + switch (s.substr(-1)) { + case "k": + s = parseFloat(s); + break; + case "M": + s = (parseFloat(s) * 1024); + break; + case "G": + s = (parseFloat(s) * 1024 * 1024); + break; + } + return s; + }, + type: "numeric" + }); + + // add default widgets + ts.addWidget({ + id: "zebra", + format: function(table) { + if(table.config.debug) { var time = new Date(); } + $("tr:visible",table.tBodies[0]) + .filter(':even') + .removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]) + .end().filter(':odd') + .removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]); + if(table.config.debug) { $.tablesorter.benchmark("Applying Zebra widget", time); } + } + }); +})(jQuery); \ No newline at end of file diff --git a/jawstats/js/packed.js b/jawstats/js/packed.js new file mode 100755 index 0000000..3e343dd --- /dev/null +++ b/jawstats/js/packed.js @@ -0,0 +1,44 @@ +/* + * jQuery JavaScript Library v1.3 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-01-13 12:50:31 -0500 (Tue, 13 Jan 2009) + * Revision: 6104 + */ +(function(){var l=this,g,x=l.jQuery,o=l.$,n=l.jQuery=l.$=function(D,E){return new n.fn.init(D,E)},C=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;n.fn=n.prototype={init:function(D,G){D=D||document;if(D.nodeType){this[0]=D;this.length=1;this.context=D;return this}if(typeof D==="string"){var F=C.exec(D);if(F&&(F[1]||!G)){if(F[1]){D=n.clean([F[1]],G)}else{var H=document.getElementById(F[3]);if(H){if(H.id!=F[3]){return n().find(D)}var E=n(H);E.context=document;E.selector=D;return E}D=[]}}else{return n(G).find(D)}}else{if(n.isFunction(D)){return n(document).ready(D)}}if(D.selector&&D.context){this.selector=D.selector;this.context=D.context}return this.setArray(n.makeArray(D))},selector:"",jquery:"1.3",size:function(){return this.length},get:function(D){return D===g?n.makeArray(this):this[D]},pushStack:function(E,G,D){var F=n(E);F.prevObject=this;F.context=this.context;if(G==="find"){F.selector=this.selector+(this.selector?" ":"")+D}else{if(G){F.selector=this.selector+"."+G+"("+D+")"}}return F},setArray:function(D){this.length=0;Array.prototype.push.apply(this,D);return this},each:function(E,D){return n.each(this,E,D)},index:function(D){return n.inArray(D&&D.jquery?D[0]:D,this)},attr:function(E,G,F){var D=E;if(typeof E==="string"){if(G===g){return this[0]&&n[F||"attr"](this[0],E)}else{D={};D[E]=G}}return this.each(function(H){for(E in D){n.attr(F?this.style:this,E,n.prop(this,D[E],F,H,E))}})},css:function(D,E){if((D=="width"||D=="height")&&parseFloat(E)<0){E=g}return this.attr(D,E,"curCSS")},text:function(E){if(typeof E!=="object"&&E!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(E))}var D="";n.each(E||this,function(){n.each(this.childNodes,function(){if(this.nodeType!=8){D+=this.nodeType!=1?this.nodeValue:n.fn.text([this])}})});return D},wrapAll:function(D){if(this[0]){var E=n(D,this[0].ownerDocument).clone();if(this[0].parentNode){E.insertBefore(this[0])}E.map(function(){var F=this;while(F.firstChild){F=F.firstChild}return F}).append(this)}return this},wrapInner:function(D){return this.each(function(){n(this).contents().wrapAll(D)})},wrap:function(D){return this.each(function(){n(this).wrapAll(D)})},append:function(){return this.domManip(arguments,true,function(D){if(this.nodeType==1){this.appendChild(D)}})},prepend:function(){return this.domManip(arguments,true,function(D){if(this.nodeType==1){this.insertBefore(D,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(D){this.parentNode.insertBefore(D,this)})},after:function(){return this.domManip(arguments,false,function(D){this.parentNode.insertBefore(D,this.nextSibling)})},end:function(){return this.prevObject||n([])},push:[].push,find:function(D){if(this.length===1&&!/,/.test(D)){var F=this.pushStack([],"find",D);F.length=0;n.find(D,this[0],F);return F}else{var E=n.map(this,function(G){return n.find(D,G)});return this.pushStack(/[^+>] [^+>]/.test(D)?n.unique(E):E,"find",D)}},clone:function(E){var D=this.map(function(){if(!n.support.noCloneEvent&&!n.isXMLDoc(this)){var H=this.cloneNode(true),G=document.createElement("div");G.appendChild(H);return n.clean([G.innerHTML])[0]}else{return this.cloneNode(true)}});var F=D.find("*").andSelf().each(function(){if(this[h]!==g){this[h]=null}});if(E===true){this.find("*").andSelf().each(function(H){if(this.nodeType==3){return}var G=n.data(this,"events");for(var J in G){for(var I in G[J]){n.event.add(F[H],J,G[J][I],G[J][I].data)}}})}return D},filter:function(D){return this.pushStack(n.isFunction(D)&&n.grep(this,function(F,E){return D.call(F,E)})||n.multiFilter(D,n.grep(this,function(E){return E.nodeType===1})),"filter",D)},closest:function(D){var E=n.expr.match.POS.test(D)?n(D):null;return this.map(function(){var F=this;while(F&&F.ownerDocument){if(E?E.index(F)>-1:n(F).is(D)){return F}F=F.parentNode}})},not:function(D){if(typeof D==="string"){if(f.test(D)){return this.pushStack(n.multiFilter(D,this,true),"not",D)}else{D=n.multiFilter(D,this)}}var E=D.length&&D[D.length-1]!==g&&!D.nodeType;return this.filter(function(){return E?n.inArray(this,D)<0:this!=D})},add:function(D){return this.pushStack(n.unique(n.merge(this.get(),typeof D==="string"?n(D):n.makeArray(D))))},is:function(D){return !!D&&n.multiFilter(D,this).length>0},hasClass:function(D){return !!D&&this.is("."+D)},val:function(J){if(J===g){var D=this[0];if(D){if(n.nodeName(D,"option")){return(D.attributes.value||{}).specified?D.value:D.text}if(n.nodeName(D,"select")){var H=D.selectedIndex,K=[],L=D.options,G=D.type=="select-one";if(H<0){return null}for(var E=G?H:0,I=G?H+1:L.length;E=0||n.inArray(this.name,J)>=0)}else{if(n.nodeName(this,"select")){var M=n.makeArray(J);n("option",this).each(function(){this.selected=(n.inArray(this.value,M)>=0||n.inArray(this.text,M)>=0)});if(!M.length){this.selectedIndex=-1}}else{this.value=J}}})},html:function(D){return D===g?(this[0]?this[0].innerHTML:null):this.empty().append(D)},replaceWith:function(D){return this.after(D).remove()},eq:function(D){return this.slice(D,+D+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(D){return this.pushStack(n.map(this,function(F,E){return D.call(F,E,F)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=n.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild,D=this.length>1?I.cloneNode(true):I;if(H){for(var G=0,E=this.length;G0?D.cloneNode(true):I)}}if(F){n.each(F,y)}}return this;function K(N,O){return M&&n.nodeName(N,"table")&&n.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};n.fn.init.prototype=n.fn;function y(D,E){if(E.src){n.ajax({url:E.src,async:false,dataType:"script"})}else{n.globalEval(E.text||E.textContent||E.innerHTML||"")}if(E.parentNode){E.parentNode.removeChild(E)}}function e(){return +new Date}n.extend=n.fn.extend=function(){var I=arguments[0]||{},G=1,H=arguments.length,D=false,F;if(typeof I==="boolean"){D=I;I=arguments[1]||{};G=2}if(typeof I!=="object"&&!n.isFunction(I)){I={}}if(H==G){I=this;--G}for(;G-1}},swap:function(G,F,H){var D={};for(var E in F){D[E]=G.style[E];G.style[E]=F[E]}H.call(G);for(var E in F){G.style[E]=D[E]}},css:function(F,D,H){if(D=="width"||D=="height"){var J,E={position:"absolute",visibility:"hidden",display:"block"},I=D=="width"?["Left","Right"]:["Top","Bottom"];function G(){J=D=="width"?F.offsetWidth:F.offsetHeight;var L=0,K=0;n.each(I,function(){L+=parseFloat(n.curCSS(F,"padding"+this,true))||0;K+=parseFloat(n.curCSS(F,"border"+this+"Width",true))||0});J-=Math.round(L+K)}if(n(F).is(":visible")){G()}else{n.swap(F,E,G)}return Math.max(0,J)}return n.curCSS(F,D,H)},curCSS:function(H,E,F){var K,D=H.style;if(E=="opacity"&&!n.support.opacity){K=n.attr(D,"opacity");return K==""?"1":K}if(E.match(/float/i)){E=v}if(!F&&D&&D[E]){K=D[E]}else{if(p.getComputedStyle){if(E.match(/float/i)){E="float"}E=E.replace(/([A-Z])/g,"-$1").toLowerCase();var L=p.getComputedStyle(H,null);if(L){K=L.getPropertyValue(E)}if(E=="opacity"&&K==""){K="1"}}else{if(H.currentStyle){var I=E.replace(/\-(\w)/g,function(M,N){return N.toUpperCase()});K=H.currentStyle[E]||H.currentStyle[I];if(!/^\d+(px)?$/i.test(K)&&/^\d/.test(K)){var G=D.left,J=H.runtimeStyle.left;H.runtimeStyle.left=H.currentStyle.left;D.left=K||0;K=D.pixelLeft+"px";D.left=G;H.runtimeStyle.left=J}}}}return K},clean:function(E,J,H){J=J||document;if(typeof J.createElement==="undefined"){J=J.ownerDocument||J[0]&&J[0].ownerDocument||document}if(!H&&E.length===1&&typeof E[0]==="string"){var G=/^<(\w+)\s*\/?>$/.exec(E[0]);if(G){return[J.createElement(G[1])]}}var F=[],D=[],K=J.createElement("div");n.each(E,function(O,Q){if(typeof Q==="number"){Q+=""}if(!Q){return}if(typeof Q==="string"){Q=Q.replace(/(<(\w+)[^>]*?)\/>/g,function(S,T,R){return R.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?S:T+">"});var N=n.trim(Q).toLowerCase();var P=!N.indexOf("",""]||!N.indexOf("",""]||N.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!N.indexOf("",""]||(!N.indexOf("",""]||!N.indexOf("",""]||!n.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];K.innerHTML=P[1]+Q+P[2];while(P[0]--){K=K.lastChild}if(!n.support.tbody){var M=!N.indexOf(""&&N.indexOf("=0;--L){if(n.nodeName(M[L],"tbody")&&!M[L].childNodes.length){M[L].parentNode.removeChild(M[L])}}}if(!n.support.leadingWhitespace&&/^\s/.test(Q)){K.insertBefore(J.createTextNode(Q.match(/^\s*/)[0]),K.firstChild)}Q=n.makeArray(K.childNodes)}if(Q.nodeType){F.push(Q)}else{F=n.merge(F,Q)}});if(H){for(var I=0;F[I];I++){if(n.nodeName(F[I],"script")&&(!F[I].type||F[I].type.toLowerCase()==="text/javascript")){D.push(F[I].parentNode?F[I].parentNode.removeChild(F[I]):F[I])}else{if(F[I].nodeType===1){F.splice.apply(F,[I+1,0].concat(n.makeArray(F[I].getElementsByTagName("script"))))}H.appendChild(F[I])}}return D}return F},attr:function(I,F,J){if(!I||I.nodeType==3||I.nodeType==8){return g}var G=!n.isXMLDoc(I),K=J!==g;F=G&&n.props[F]||F;if(I.tagName){var E=/href|src|style/.test(F);if(F=="selected"&&I.parentNode){I.parentNode.selectedIndex}if(F in I&&G&&!E){if(K){if(F=="type"&&n.nodeName(I,"input")&&I.parentNode){throw"type property can't be changed"}I[F]=J}if(n.nodeName(I,"form")&&I.getAttributeNode(F)){return I.getAttributeNode(F).nodeValue}if(F=="tabIndex"){var H=I.getAttributeNode("tabIndex");return H&&H.specified?H.value:I.nodeName.match(/^(a|area|button|input|object|select|textarea)$/i)?0:g}return I[F]}if(!n.support.style&&G&&F=="style"){return n.attr(I.style,"cssText",J)}if(K){I.setAttribute(F,""+J)}var D=!n.support.hrefNormalized&&G&&E?I.getAttribute(F,2):I.getAttribute(F);return D===null?g:D}if(!n.support.opacity&&F=="opacity"){if(K){I.zoom=1;I.filter=(I.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(J)+""=="NaN"?"":"alpha(opacity="+J*100+")")}return I.filter&&I.filter.indexOf("opacity=")>=0?(parseFloat(I.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}F=F.replace(/-([a-z])/ig,function(L,M){return M.toUpperCase()});if(K){I[F]=J}return I[F]},trim:function(D){return(D||"").replace(/^\s+|\s+$/g,"")},makeArray:function(F){var D=[];if(F!=null){var E=F.length;if(E==null||typeof F==="string"||n.isFunction(F)||F.setInterval){D[0]=F}else{while(E){D[--E]=F[E]}}}return D},inArray:function(F,G){for(var D=0,E=G.length;D*",this).remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(D,E){n.fn[D]=function(){return this.each(E,arguments)}});function j(D,E){return D[0]&&parseInt(n.curCSS(D[0],E,true),10)||0}var h="jQuery"+e(),u=0,z={};n.extend({cache:{},data:function(E,D,F){E=E==l?z:E;var G=E[h];if(!G){G=E[h]=++u}if(D&&!n.cache[G]){n.cache[G]={}}if(F!==g){n.cache[G][D]=F}return D?n.cache[G][D]:G},removeData:function(E,D){E=E==l?z:E;var G=E[h];if(D){if(n.cache[G]){delete n.cache[G][D];D="";for(D in n.cache[G]){break}if(!D){n.removeData(E)}}}else{try{delete E[h]}catch(F){if(E.removeAttribute){E.removeAttribute(h)}}delete n.cache[G]}},queue:function(E,D,G){if(E){D=(D||"fx")+"queue";var F=n.data(E,D);if(!F||n.isArray(G)){F=n.data(E,D,n.makeArray(G))}else{if(G){F.push(G)}}}return F},dequeue:function(G,F){var D=n.queue(G,F),E=D.shift();if(!F||F==="fx"){E=D[0]}if(E!==g){E.call(G)}}});n.fn.extend({data:function(D,F){var G=D.split(".");G[1]=G[1]?"."+G[1]:"";if(F===g){var E=this.triggerHandler("getData"+G[1]+"!",[G[0]]);if(E===g&&this.length){E=n.data(this[0],D)}return E===g&&G[1]?this.data(G[0]):E}else{return this.trigger("setData"+G[1]+"!",[G[0],F]).each(function(){n.data(this,D,F)})}},removeData:function(D){return this.each(function(){n.removeData(this,D)})},queue:function(D,E){if(typeof D!=="string"){E=D;D="fx"}if(E===g){return n.queue(this[0],D)}return this.each(function(){var F=n.queue(this,D,E);if(D=="fx"&&F.length==1){F[0].call(this)}})},dequeue:function(D){return this.each(function(){n.dequeue(this,D)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.1 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var N=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,I=0,F=Object.prototype.toString;var E=function(ae,S,aa,V){aa=aa||[];S=S||document;if(S.nodeType!==1&&S.nodeType!==9){return[]}if(!ae||typeof ae!=="string"){return aa}var ab=[],ac,Y,ah,ag,Z,R,Q=true;N.lastIndex=0;while((ac=N.exec(ae))!==null){ab.push(ac[1]);if(ac[2]){R=RegExp.rightContext;break}}if(ab.length>1&&G.match.POS.exec(ae)){if(ab.length===2&&G.relative[ab[0]]){var U="",X;while((X=G.match.POS.exec(ae))){U+=X[0];ae=ae.replace(G.match.POS,"")}Y=E.filter(U,E(/\s$/.test(ae)?ae+"*":ae,S))}else{Y=G.relative[ab[0]]?[S]:E(ab.shift(),S);while(ab.length){var P=[];ae=ab.shift();if(G.relative[ae]){ae+=ab.shift()}for(var af=0,ad=Y.length;af0){ah=D(Y)}else{Q=false}while(ab.length){var T=ab.pop(),W=T;if(!G.relative[T]){T=""}else{W=ab.pop()}if(W==null){W=S}G.relative[T](ah,W,M(S))}}if(!ah){ah=Y}if(!ah){throw"Syntax error, unrecognized expression: "+(T||ae)}if(F.call(ah)==="[object Array]"){if(!Q){aa.push.apply(aa,ah)}else{if(S.nodeType===1){for(var af=0;ah[af]!=null;af++){if(ah[af]&&(ah[af]===true||ah[af].nodeType===1&&H(S,ah[af]))){aa.push(Y[af])}}}else{for(var af=0;ah[af]!=null;af++){if(ah[af]&&ah[af].nodeType===1){aa.push(Y[af])}}}}}else{D(ah,aa)}if(R){E(R,S,aa,V)}return aa};E.matches=function(P,Q){return E(P,null,null,Q)};E.find=function(V,S){var W,Q;if(!V){return[]}for(var R=0,P=G.order.length;R":function(U,Q,V){if(typeof Q==="string"&&!/\W/.test(Q)){Q=V?Q:Q.toUpperCase();for(var R=0,P=U.length;R=0){if(!R){P.push(Q[T])}}else{if(R){Q[T]=false}}}return false},ID:function(P){return P[1].replace(/\\/g,"")},TAG:function(Q,P){for(var R=0;!P[R];R++){}return M(P[R])?Q[1]:Q[1].toUpperCase()},CHILD:function(P){if(P[1]=="nth"){var Q=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(P[2]=="even"&&"2n"||P[2]=="odd"&&"2n+1"||!/\D/.test(P[2])&&"0n+"+P[2]||P[2]);P[2]=(Q[1]+(Q[2]||1))-0;P[3]=Q[3]-0}P[0]="done"+(I++);return P},ATTR:function(Q){var P=Q[1];if(G.attrMap[P]){Q[1]=G.attrMap[P]}if(Q[2]==="~="){Q[4]=" "+Q[4]+" "}return Q},PSEUDO:function(T,Q,R,P,U){if(T[1]==="not"){if(T[3].match(N).length>1){T[3]=E(T[3],null,null,Q)}else{var S=E.filter(T[3],Q,R,true^U);if(!R){P.push.apply(P,S)}return false}}else{if(G.match.POS.test(T[0])){return true}}return T},POS:function(P){P.unshift(true);return P}},filters:{enabled:function(P){return P.disabled===false&&P.type!=="hidden"},disabled:function(P){return P.disabled===true},checked:function(P){return P.checked===true},selected:function(P){P.parentNode.selectedIndex;return P.selected===true},parent:function(P){return !!P.firstChild},empty:function(P){return !P.firstChild},has:function(R,Q,P){return !!E(P[3],R).length},header:function(P){return/h\d/i.test(P.nodeName)},text:function(P){return"text"===P.type},radio:function(P){return"radio"===P.type},checkbox:function(P){return"checkbox"===P.type},file:function(P){return"file"===P.type},password:function(P){return"password"===P.type},submit:function(P){return"submit"===P.type},image:function(P){return"image"===P.type},reset:function(P){return"reset"===P.type},button:function(P){return"button"===P.type||P.nodeName.toUpperCase()==="BUTTON"},input:function(P){return/input|select|textarea|button/i.test(P.nodeName)}},setFilters:{first:function(Q,P){return P===0},last:function(R,Q,P,S){return Q===S.length-1},even:function(Q,P){return P%2===0},odd:function(Q,P){return P%2===1},lt:function(R,Q,P){return QP[3]-0},nth:function(R,Q,P){return P[3]-0==Q},eq:function(R,Q,P){return P[3]-0==Q}},filter:{CHILD:function(P,S){var V=S[1],W=P.parentNode;var U="child"+W.childNodes.length;if(W&&(!W[U]||!P.nodeIndex)){var T=1;for(var Q=W.firstChild;Q;Q=Q.nextSibling){if(Q.nodeType==1){Q.nodeIndex=T++}}W[U]=T-1}if(V=="first"){return P.nodeIndex==1}else{if(V=="last"){return P.nodeIndex==W[U]}else{if(V=="only"){return W[U]==1}else{if(V=="nth"){var Y=false,R=S[2],X=S[3];if(R==1&&X==0){return true}if(R==0){if(P.nodeIndex==X){Y=true}}else{if((P.nodeIndex-X)%R==0&&(P.nodeIndex-X)/R>=0){Y=true}}return Y}}}}},PSEUDO:function(V,R,S,W){var Q=R[1],T=G.filters[Q];if(T){return T(V,S,R,W)}else{if(Q==="contains"){return(V.textContent||V.innerText||"").indexOf(R[3])>=0}else{if(Q==="not"){var U=R[3];for(var S=0,P=U.length;S=0:S==="~="?(" "+U+" ").indexOf(Q)>=0:!R[4]?P:S==="!="?U!=Q:S==="^="?U.indexOf(Q)===0:S==="$="?U.substr(U.length-Q.length)===Q:S==="|="?U===Q||U.substr(0,Q.length+1)===Q+"-":false},POS:function(T,Q,R,U){var P=Q[2],S=G.setFilters[P];if(S){return S(T,R,Q,U)}}}};for(var K in G.match){G.match[K]=RegExp(G.match[K].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var D=function(Q,P){Q=Array.prototype.slice.call(Q);if(P){P.push.apply(P,Q);return P}return Q};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(J){D=function(T,S){var Q=S||[];if(F.call(T)==="[object Array]"){Array.prototype.push.apply(Q,T)}else{if(typeof T.length==="number"){for(var R=0,P=T.length;R";var P=document.documentElement;P.insertBefore(Q,P.firstChild);if(!!document.getElementById(R)){G.find.ID=function(T,U){if(U.getElementById){var S=U.getElementById(T[1]);return S?S.id===T[1]||S.getAttributeNode&&S.getAttributeNode("id").nodeValue===T[1]?[S]:g:[]}};G.filter.ID=function(U,S){var T=U.getAttributeNode&&U.getAttributeNode("id");return U.nodeType===1&&T&&T.nodeValue===S}}P.removeChild(Q)})();(function(){var P=document.createElement("div");P.appendChild(document.createComment(""));if(P.getElementsByTagName("*").length>0){G.find.TAG=function(Q,U){var T=U.getElementsByTagName(Q[1]);if(Q[1]==="*"){var S=[];for(var R=0;T[R];R++){if(T[R].nodeType===1){S.push(T[R])}}T=S}return T}}P.innerHTML="";if(P.firstChild.getAttribute("href")!=="#"){G.attrHandle.href=function(Q){return Q.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var P=E;E=function(T,S,Q,R){S=S||document;if(!R&&S.nodeType===9){try{return D(S.querySelectorAll(T),Q)}catch(U){}}return P(T,S,Q,R)};E.find=P.find;E.filter=P.filter;E.selectors=P.selectors;E.matches=P.matches})()}if(document.documentElement.getElementsByClassName){G.order.splice(1,0,"CLASS");G.find.CLASS=function(P,Q){return Q.getElementsByClassName(P[1])}}function L(Q,W,V,Z,X,Y){for(var T=0,R=Z.length;T0){T=P;break}}}P=P[Q]}Y[S]=T}}}var H=document.compareDocumentPosition?function(Q,P){return Q.compareDocumentPosition(P)&16}:function(Q,P){return Q!==P&&(Q.contains?Q.contains(P):true)};var M=function(P){return P.documentElement&&!P.body||P.tagName&&P.ownerDocument&&!P.ownerDocument.body};n.find=E;n.filter=E.filter;n.expr=E.selectors;n.expr[":"]=n.expr.filters;E.selectors.filters.hidden=function(P){return"hidden"===P.type||n.css(P,"display")==="none"||n.css(P,"visibility")==="hidden"};E.selectors.filters.visible=function(P){return"hidden"!==P.type&&n.css(P,"display")!=="none"&&n.css(P,"visibility")!=="hidden"};E.selectors.filters.animated=function(P){return n.grep(n.timers,function(Q){return P===Q.elem}).length};n.multiFilter=function(R,P,Q){if(Q){R=":not("+R+")"}return E.matches(R,P)};n.dir=function(R,Q){var P=[],S=R[Q];while(S&&S!=document){if(S.nodeType==1){P.push(S)}S=S[Q]}return P};n.nth=function(T,P,R,S){P=P||1;var Q=0;for(;T;T=T[R]){if(T.nodeType==1&&++Q==P){break}}return T};n.sibling=function(R,Q){var P=[];for(;R;R=R.nextSibling){if(R.nodeType==1&&R!=Q){P.push(R)}}return P};return;l.Sizzle=E})();n.event={add:function(H,E,G,J){if(H.nodeType==3||H.nodeType==8){return}if(H.setInterval&&H!=l){H=l}if(!G.guid){G.guid=this.guid++}if(J!==g){var F=G;G=this.proxy(F);G.data=J}var D=n.data(H,"events")||n.data(H,"events",{}),I=n.data(H,"handle")||n.data(H,"handle",function(){return typeof n!=="undefined"&&!n.event.triggered?n.event.handle.apply(arguments.callee.elem,arguments):g});I.elem=H;n.each(E.split(/\s+/),function(L,M){var N=M.split(".");M=N.shift();G.type=N.slice().sort().join(".");var K=D[M];if(n.event.specialAll[M]){n.event.specialAll[M].setup.call(H,J,N)}if(!K){K=D[M]={};if(!n.event.special[M]||n.event.special[M].setup.call(H,J,N)===false){if(H.addEventListener){H.addEventListener(M,I,false)}else{if(H.attachEvent){H.attachEvent("on"+M,I)}}}}K[G.guid]=G;n.event.global[M]=true});H=null},guid:1,global:{},remove:function(J,G,I){if(J.nodeType==3||J.nodeType==8){return}var F=n.data(J,"events"),E,D;if(F){if(G===g||(typeof G==="string"&&G.charAt(0)==".")){for(var H in F){this.remove(J,H+(G||""))}}else{if(G.type){I=G.handler;G=G.type}n.each(G.split(/\s+/),function(L,N){var P=N.split(".");N=P.shift();var M=RegExp("(^|\\.)"+P.slice().sort().join(".*\\.")+"(\\.|$)");if(F[N]){if(I){delete F[N][I.guid]}else{for(var O in F[N]){if(M.test(F[N][O].type)){delete F[N][O]}}}if(n.event.specialAll[N]){n.event.specialAll[N].teardown.call(J,P)}for(E in F[N]){break}if(!E){if(!n.event.special[N]||n.event.special[N].teardown.call(J,P)===false){if(J.removeEventListener){J.removeEventListener(N,n.data(J,"handle"),false)}else{if(J.detachEvent){J.detachEvent("on"+N,n.data(J,"handle"))}}}E=null;delete F[N]}}})}for(E in F){break}if(!E){var K=n.data(J,"handle");if(K){K.elem=null}n.removeData(J,"events");n.removeData(J,"handle")}}},trigger:function(H,J,G,D){var F=H.type||H;if(!D){H=typeof H==="object"?H[h]?H:n.extend(n.Event(F),H):n.Event(F);if(F.indexOf("!")>=0){H.type=F=F.slice(0,-1);H.exclusive=true}if(!G){H.stopPropagation();if(this.global[F]){n.each(n.cache,function(){if(this.events&&this.events[F]){n.event.trigger(H,J,this.handle.elem)}})}}if(!G||G.nodeType==3||G.nodeType==8){return g}H.result=g;H.target=G;J=n.makeArray(J);J.unshift(H)}H.currentTarget=G;var I=n.data(G,"handle");if(I){I.apply(G,J)}if((!G[F]||(n.nodeName(G,"a")&&F=="click"))&&G["on"+F]&&G["on"+F].apply(G,J)===false){H.result=false}if(!D&&G[F]&&!H.isDefaultPrevented()&&!(n.nodeName(G,"a")&&F=="click")){this.triggered=true;try{G[F]()}catch(K){}}this.triggered=false;if(!H.isPropagationStopped()){var E=G.parentNode||G.ownerDocument;if(E){n.event.trigger(H,J,E,true)}}},handle:function(J){var I,D;J=arguments[0]=n.event.fix(J||l.event);var K=J.type.split(".");J.type=K.shift();I=!K.length&&!J.exclusive;var H=RegExp("(^|\\.)"+K.slice().sort().join(".*\\.")+"(\\.|$)");D=(n.data(this,"events")||{})[J.type];for(var F in D){var G=D[F];if(I||H.test(G.type)){J.handler=G;J.data=G.data;var E=G.apply(this,arguments);if(E!==g){J.result=E;if(E===false){J.preventDefault();J.stopPropagation()}}if(J.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(G){if(G[h]){return G}var E=G;G=n.Event(E);for(var F=this.props.length,I;F;){I=this.props[--F];G[I]=E[I]}if(!G.target){G.target=G.srcElement||document}if(G.target.nodeType==3){G.target=G.target.parentNode}if(!G.relatedTarget&&G.fromElement){G.relatedTarget=G.fromElement==G.target?G.toElement:G.fromElement}if(G.pageX==null&&G.clientX!=null){var H=document.documentElement,D=document.body;G.pageX=G.clientX+(H&&H.scrollLeft||D&&D.scrollLeft||0)-(H.clientLeft||0);G.pageY=G.clientY+(H&&H.scrollTop||D&&D.scrollTop||0)-(H.clientTop||0)}if(!G.which&&((G.charCode||G.charCode===0)?G.charCode:G.keyCode)){G.which=G.charCode||G.keyCode}if(!G.metaKey&&G.ctrlKey){G.metaKey=G.ctrlKey}if(!G.which&&G.button){G.which=(G.button&1?1:(G.button&2?3:(G.button&4?2:0)))}return G},proxy:function(E,D){D=D||function(){return E.apply(this,arguments)};D.guid=E.guid=E.guid||D.guid||this.guid++;return D},special:{ready:{setup:A,teardown:function(){}}},specialAll:{live:{setup:function(D,E){n.event.add(this,E[0],c)},teardown:function(F){if(F.length){var D=0,E=RegExp("(^|\\.)"+F[0]+"(\\.|$)");n.each((n.data(this,"events").live||{}),function(){if(E.test(this.type)){D++}});if(D<1){n.event.remove(this,F[0],c)}}}}}};n.Event=function(D){if(!this.preventDefault){return new n.Event(D)}if(D&&D.type){this.originalEvent=D;this.type=D.type;this.timeStamp=D.timeStamp}else{this.type=D}if(!this.timeStamp){this.timeStamp=e()}this[h]=true};function k(){return false}function t(){return true}n.Event.prototype={preventDefault:function(){this.isDefaultPrevented=t;var D=this.originalEvent;if(!D){return}if(D.preventDefault){D.preventDefault()}D.returnValue=false},stopPropagation:function(){this.isPropagationStopped=t;var D=this.originalEvent;if(!D){return}if(D.stopPropagation){D.stopPropagation()}D.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=t;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(E){var D=E.relatedTarget;while(D&&D!=this){try{D=D.parentNode}catch(F){D=this}}if(D!=this){E.type=E.data;n.event.handle.apply(this,arguments)}};n.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(E,D){n.event.special[D]={setup:function(){n.event.add(this,E,a,D)},teardown:function(){n.event.remove(this,E,a)}}});n.fn.extend({bind:function(E,F,D){return E=="unload"?this.one(E,F,D):this.each(function(){n.event.add(this,E,D||F,D&&F)})},one:function(F,G,E){var D=n.event.proxy(E||G,function(H){n(this).unbind(H,D);return(E||G).apply(this,arguments)});return this.each(function(){n.event.add(this,F,D,E&&G)})},unbind:function(E,D){return this.each(function(){n.event.remove(this,E,D)})},trigger:function(D,E){return this.each(function(){n.event.trigger(D,E,this)})},triggerHandler:function(D,F){if(this[0]){var E=n.Event(D);E.preventDefault();E.stopPropagation();n.event.trigger(E,F,this[0]);return E.result}},toggle:function(F){var D=arguments,E=1;while(E=0){var D=F.slice(H,F.length);F=F.slice(0,H)}var G="GET";if(I){if(n.isFunction(I)){J=I;I=null}else{if(typeof I==="object"){I=n.param(I);G="POST"}}}var E=this;n.ajax({url:F,type:G,dataType:"html",data:I,complete:function(L,K){if(K=="success"||K=="notmodified"){E.html(D?n("
").append(L.responseText.replace(//g,"")).find(D):L.responseText)}if(J){E.each(J,[L.responseText,K,L])}}});return this},serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?n.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type))}).map(function(D,E){var F=n(this).val();return F==null?null:n.isArray(F)?n.map(F,function(H,G){return{name:E.name,value:H}}):{name:E.name,value:F}}).get()}});n.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(D,E){n.fn[E]=function(F){return this.bind(E,F)}});var q=e();n.extend({get:function(D,F,G,E){if(n.isFunction(F)){G=F;F=null}return n.ajax({type:"GET",url:D,data:F,success:G,dataType:E})},getScript:function(D,E){return n.get(D,null,E,"script")},getJSON:function(D,E,F){return n.get(D,E,F,"json")},post:function(D,F,G,E){if(n.isFunction(F)){G=F;F={}}return n.ajax({type:"POST",url:D,data:F,success:G,dataType:E})},ajaxSetup:function(D){n.extend(n.ajaxSettings,D)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(L){L=n.extend(true,L,n.extend(true,{},n.ajaxSettings,L));var V,E=/=\?(&|$)/g,Q,U,F=L.type.toUpperCase();if(L.data&&L.processData&&typeof L.data!=="string"){L.data=n.param(L.data)}if(L.dataType=="jsonp"){if(F=="GET"){if(!L.url.match(E)){L.url+=(L.url.match(/\?/)?"&":"?")+(L.jsonp||"callback")+"=?"}}else{if(!L.data||!L.data.match(E)){L.data=(L.data?L.data+"&":"")+(L.jsonp||"callback")+"=?"}}L.dataType="json"}if(L.dataType=="json"&&(L.data&&L.data.match(E)||L.url.match(E))){V="jsonp"+q++;if(L.data){L.data=(L.data+"").replace(E,"="+V+"$1")}L.url=L.url.replace(E,"="+V+"$1");L.dataType="script";l[V]=function(W){U=W;H();K();l[V]=g;try{delete l[V]}catch(X){}if(G){G.removeChild(S)}}}if(L.dataType=="script"&&L.cache==null){L.cache=false}if(L.cache===false&&F=="GET"){var D=e();var T=L.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+D+"$2");L.url=T+((T==L.url)?(L.url.match(/\?/)?"&":"?")+"_="+D:"")}if(L.data&&F=="GET"){L.url+=(L.url.match(/\?/)?"&":"?")+L.data;L.data=null}if(L.global&&!n.active++){n.event.trigger("ajaxStart")}var P=/^(\w+:)?\/\/([^\/?#]+)/.exec(L.url);if(L.dataType=="script"&&F=="GET"&&P&&(P[1]&&P[1]!=location.protocol||P[2]!=location.host)){var G=document.getElementsByTagName("head")[0];var S=document.createElement("script");S.src=L.url;if(L.scriptCharset){S.charset=L.scriptCharset}if(!V){var N=false;S.onload=S.onreadystatechange=function(){if(!N&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){N=true;H();K();G.removeChild(S)}}}G.appendChild(S);return g}var J=false;var I=L.xhr();if(L.username){I.open(F,L.url,L.async,L.username,L.password)}else{I.open(F,L.url,L.async)}try{if(L.data){I.setRequestHeader("Content-Type",L.contentType)}if(L.ifModified){I.setRequestHeader("If-Modified-Since",n.lastModified[L.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}I.setRequestHeader("X-Requested-With","XMLHttpRequest");I.setRequestHeader("Accept",L.dataType&&L.accepts[L.dataType]?L.accepts[L.dataType]+", */*":L.accepts._default)}catch(R){}if(L.beforeSend&&L.beforeSend(I,L)===false){if(L.global&&!--n.active){n.event.trigger("ajaxStop")}I.abort();return false}if(L.global){n.event.trigger("ajaxSend",[I,L])}var M=function(W){if(I.readyState==0){if(O){clearInterval(O);O=null;if(L.global&&!--n.active){n.event.trigger("ajaxStop")}}}else{if(!J&&I&&(I.readyState==4||W=="timeout")){J=true;if(O){clearInterval(O);O=null}Q=W=="timeout"?"timeout":!n.httpSuccess(I)?"error":L.ifModified&&n.httpNotModified(I,L.url)?"notmodified":"success";if(Q=="success"){try{U=n.httpData(I,L.dataType,L)}catch(Y){Q="parsererror"}}if(Q=="success"){var X;try{X=I.getResponseHeader("Last-Modified")}catch(Y){}if(L.ifModified&&X){n.lastModified[L.url]=X}if(!V){H()}}else{n.handleError(L,I,Q)}K();if(L.async){I=null}}}};if(L.async){var O=setInterval(M,13);if(L.timeout>0){setTimeout(function(){if(I){if(!J){M("timeout")}if(I){I.abort()}}},L.timeout)}}try{I.send(L.data)}catch(R){n.handleError(L,I,null,R)}if(!L.async){M()}function H(){if(L.success){L.success(U,Q)}if(L.global){n.event.trigger("ajaxSuccess",[I,L])}}function K(){if(L.complete){L.complete(I,Q)}if(L.global){n.event.trigger("ajaxComplete",[I,L])}if(L.global&&!--n.active){n.event.trigger("ajaxStop")}}return I},handleError:function(E,G,D,F){if(E.error){E.error(G,D,F)}if(E.global){n.event.trigger("ajaxError",[G,E,F])}},active:0,httpSuccess:function(E){try{return !E.status&&location.protocol=="file:"||(E.status>=200&&E.status<300)||E.status==304||E.status==1223}catch(D){}return false},httpNotModified:function(F,D){try{var G=F.getResponseHeader("Last-Modified");return F.status==304||G==n.lastModified[D]}catch(E){}return false},httpData:function(I,G,F){var E=I.getResponseHeader("content-type"),D=G=="xml"||!G&&E&&E.indexOf("xml")>=0,H=D?I.responseXML:I.responseText;if(D&&H.documentElement.tagName=="parsererror"){throw"parsererror"}if(F&&F.dataFilter){H=F.dataFilter(H,G)}if(typeof H==="string"){if(G=="script"){n.globalEval(H)}if(G=="json"){H=l["eval"]("("+H+")")}}return H},param:function(D){var F=[];function G(H,I){F[F.length]=encodeURIComponent(H)+"="+encodeURIComponent(I)}if(n.isArray(D)||D.jquery){n.each(D,function(){G(this.name,this.value)})}else{for(var E in D){if(n.isArray(D[E])){n.each(D[E],function(){G(E,this)})}else{G(E,n.isFunction(D[E])?D[E]():D[E])}}}return F.join("&").replace(/%20/g,"+")}});var m={},d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function s(E,D){var F={};n.each(d.concat.apply([],d.slice(0,D)),function(){F[this]=E});return F}n.fn.extend({show:function(I,K){if(I){return this.animate(s("show",3),I,K)}else{for(var G=0,E=this.length;G").appendTo("body");J=H.css("display");if(J==="none"){J="block"}H.remove();m[F]=J}this[G].style.display=n.data(this[G],"olddisplay",J)}}return this}},hide:function(G,H){if(G){return this.animate(s("hide",3),G,H)}else{for(var F=0,E=this.length;F=0;G--){if(F[G].elem==this){if(D){F[G](true)}F.splice(G,1)}}});if(!D){this.dequeue()}return this}});n.each({slideDown:s("show",1),slideUp:s("hide",1),slideToggle:s("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(D,E){n.fn[D]=function(F,G){return this.animate(E,F,G)}});n.extend({speed:function(F,G,E){var D=typeof F==="object"?F:{complete:E||!E&&G||n.isFunction(F)&&F,duration:F,easing:E&&G||G&&!n.isFunction(G)&&G};D.duration=n.fx.off?0:typeof D.duration==="number"?D.duration:n.fx.speeds[D.duration]||n.fx.speeds._default;D.old=D.complete;D.complete=function(){if(D.queue!==false){n(this).dequeue()}if(n.isFunction(D.old)){D.old.call(this)}};return D},easing:{linear:function(F,G,D,E){return D+E*F},swing:function(F,G,D,E){return((-Math.cos(F*Math.PI)/2)+0.5)*E+D}},timers:[],timerId:null,fx:function(E,D,F){this.options=D;this.elem=E;this.prop=F;if(!D.orig){D.orig={}}}});n.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(n.fx.step[this.prop]||n.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(E){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var D=parseFloat(n.css(this.elem,this.prop,E));return D&&D>-10000?D:parseFloat(n.curCSS(this.elem,this.prop))||0},custom:function(H,G,F){this.startTime=e();this.start=H;this.end=G;this.unit=F||this.unit||"px";this.now=this.start;this.pos=this.state=0;var D=this;function E(I){return D.step(I)}E.elem=this.elem;n.timers.push(E);if(E()&&n.timerId==null){n.timerId=setInterval(function(){var J=n.timers;for(var I=0;I=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var D=true;for(var E in this.options.curAnim){if(this.options.curAnim[E]!==true){D=false}}if(D){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(n.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){n(this.elem).hide()}if(this.options.hide||this.options.show){for(var H in this.options.curAnim){n.attr(this.elem.style,H,this.options.orig[H])}}}if(D){this.options.complete.call(this.elem)}return false}else{var I=F-this.startTime;this.state=I/this.options.duration;this.pos=n.easing[this.options.easing||(n.easing.swing?"swing":"linear")](this.state,I,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};n.extend(n.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(D){n.attr(D.elem.style,"opacity",D.now)},_default:function(D){if(D.elem.style&&D.elem.style[D.prop]!=null){D.elem.style[D.prop]=D.now+D.unit}else{D.elem[D.prop]=D.now}}}});if(document.documentElement.getBoundingClientRect){n.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return n.offset.bodyOffset(this[0])}var F=this[0].getBoundingClientRect(),I=this[0].ownerDocument,E=I.body,D=I.documentElement,K=D.clientTop||E.clientTop||0,J=D.clientLeft||E.clientLeft||0,H=F.top+(self.pageYOffset||n.boxModel&&D.scrollTop||E.scrollTop)-K,G=F.left+(self.pageXOffset||n.boxModel&&D.scrollLeft||E.scrollLeft)-J;return{top:H,left:G}}}else{n.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return n.offset.bodyOffset(this[0])}n.offset.initialized||n.offset.initialize();var I=this[0],F=I.offsetParent,E=I,N=I.ownerDocument,L,G=N.documentElement,J=N.body,K=N.defaultView,D=K.getComputedStyle(I,null),M=I.offsetTop,H=I.offsetLeft;while((I=I.parentNode)&&I!==J&&I!==G){L=K.getComputedStyle(I,null);M-=I.scrollTop,H-=I.scrollLeft;if(I===F){M+=I.offsetTop,H+=I.offsetLeft;if(n.offset.doesNotAddBorder&&!(n.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(I.tagName))){M+=parseInt(L.borderTopWidth,10)||0,H+=parseInt(L.borderLeftWidth,10)||0}E=F,F=I.offsetParent}if(n.offset.subtractsBorderForOverflowNotVisible&&L.overflow!=="visible"){M+=parseInt(L.borderTopWidth,10)||0,H+=parseInt(L.borderLeftWidth,10)||0}D=L}if(D.position==="relative"||D.position==="static"){M+=J.offsetTop,H+=J.offsetLeft}if(D.position==="fixed"){M+=Math.max(G.scrollTop,J.scrollTop),H+=Math.max(G.scrollLeft,J.scrollLeft)}return{top:M,left:H}}}n.offset={initialize:function(){if(this.initialized){return}var K=document.body,E=document.createElement("div"),G,F,M,H,L,D,I=K.style.marginTop,J='
';L={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(D in L){E.style[D]=L[D]}E.innerHTML=J;K.insertBefore(E,K.firstChild);G=E.firstChild,F=G.firstChild,H=G.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(F.offsetTop!==5);this.doesAddBorderForTableAndCells=(H.offsetTop===5);G.style.overflow="hidden",G.style.position="relative";this.subtractsBorderForOverflowNotVisible=(F.offsetTop===-5);K.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(K.offsetTop===0);K.style.marginTop=I;K.removeChild(E);this.initialized=true},bodyOffset:function(D){n.offset.initialized||n.offset.initialize();var F=D.offsetTop,E=D.offsetLeft;if(n.offset.doesNotIncludeMarginInBodyOffset){F+=parseInt(n.curCSS(D,"marginTop",true),10)||0,E+=parseInt(n.curCSS(D,"marginLeft",true),10)||0}return{top:F,left:E}}};n.fn.extend({position:function(){var H=0,G=0,E;if(this[0]){var F=this.offsetParent(),I=this.offset(),D=/^body|html$/i.test(F[0].tagName)?{top:0,left:0}:F.offset();I.top-=j(this,"marginTop");I.left-=j(this,"marginLeft");D.top+=j(F,"borderTopWidth");D.left+=j(F,"borderLeftWidth");E={top:I.top-D.top,left:I.left-D.left}}return E},offsetParent:function(){var D=this[0].offsetParent||document.body;while(D&&(!/^body|html$/i.test(D.tagName)&&n.css(D,"position")=="static")){D=D.offsetParent}return n(D)}});n.each(["Left","Top"],function(E,D){var F="scroll"+D;n.fn[F]=function(G){if(!this[0]){return null}return G!==g?this.each(function(){this==l||this==document?l.scrollTo(!E?G:n(l).scrollLeft(),E?G:n(l).scrollTop()):this[F]=G}):this[0]==l||this[0]==document?self[E?"pageYOffset":"pageXOffset"]||n.boxModel&&document.documentElement[F]||document.body[F]:this[0][F]}});n.each(["Height","Width"],function(G,E){var D=G?"Left":"Top",F=G?"Right":"Bottom";n.fn["inner"+E]=function(){return this[E.toLowerCase()]()+j(this,"padding"+D)+j(this,"padding"+F)};n.fn["outer"+E]=function(I){return this["inner"+E]()+j(this,"border"+D+"Width")+j(this,"border"+F+"Width")+(I?j(this,"margin"+D)+j(this,"margin"+F):0)};var H=E.toLowerCase();n.fn[H]=function(I){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+E]||document.body["client"+E]:this[0]==document?Math.max(document.documentElement["client"+E],document.body["scroll"+E],document.documentElement["scroll"+E],document.body["offset"+E],document.documentElement["offset"+E]):I===g?(this.length?n.css(this[0],H):null):this.css(H,typeof I==="string"?I:I+"px")}})})(); + +/* + * + * TableSorter 2.0 - Client-side table sorting with ease! + * Version 2.0.1 + * @requires jQuery v1.2.1 + * + * Copyright (c) 2007 Christian Bach + * Examples and docs at: http://tablesorter.com + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + // NOTE: This has been modified by myself for JAWStats ("bandwidth" parser added) +(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'.',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms")}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s)}else{alert(s)}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug=""}var rows=table.tBodies[0].rows;if(table.tBodies[0].rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i1){arr=arr.concat(checkCellColSpan(table,headerArr,row++))}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell)}}}return arr};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true};return false}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true};return false}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('').css('width',$(this).width()))});$(table).prepend(colgroup)}}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;ib)?1:0))};function sortTextDesc(a,b){return((ba)?1:0))};function sortNumeric(a,b){return a-b};function sortNumericDesc(a,b){return b-a};function getCachedSortType(parsers,i){return parsers[i].type};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){$this.trigger("sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){var $cell=$(this);var i=this.column;this.order=this.count++%2;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j0){$this.trigger("sorton",[config.sortList])}applyWidget(this)})};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject; \ No newline at end of file diff --git a/jawstats/js/swfobject.js b/jawstats/js/swfobject.js new file mode 100755 index 0000000..caa256a --- /dev/null +++ b/jawstats/js/swfobject.js @@ -0,0 +1,233 @@ +/** + * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ + * + * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + */ +if(typeof deconcept == "undefined") var deconcept = new Object(); +if(typeof deconcept.util == "undefined") deconcept.util = new Object(); +if(typeof deconcept.SWFObjectUtil == "undefined") deconcept.SWFObjectUtil = new Object(); +deconcept.SWFObject = function(swf, id, w, h, ver, c, quality, xiRedirectUrl, redirectUrl, detectKey) { + if (!document.getElementById) { return; } + this.DETECT_KEY = detectKey ? detectKey : 'detectflash'; + this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY); + this.params = new Object(); + this.variables = new Object(); + this.attributes = new Array(); + if(swf) { this.setAttribute('swf', swf); } + if(id) { this.setAttribute('id', id); } + if(w) { this.setAttribute('width', w); } + if(h) { this.setAttribute('height', h); } + if(ver) { this.setAttribute('version', new deconcept.PlayerVersion(ver.toString().split("."))); } + this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion(); + if (!window.opera && document.all && this.installedVer.major > 7) { + // only add the onunload cleanup if the Flash Player version supports External Interface and we are in IE + deconcept.SWFObject.doPrepUnload = true; + } + if(c) { this.addParam('bgcolor', c); } + var q = quality ? quality : 'high'; + this.addParam('quality', q); + this.setAttribute('useExpressInstall', false); + this.setAttribute('doExpressInstall', false); + var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location; + this.setAttribute('xiRedirectUrl', xir); + this.setAttribute('redirectUrl', ''); + if(redirectUrl) { this.setAttribute('redirectUrl', redirectUrl); } +} +deconcept.SWFObject.prototype = { + useExpressInstall: function(path) { + this.xiSWFPath = !path ? "expressinstall.swf" : path; + this.setAttribute('useExpressInstall', true); + }, + setAttribute: function(name, value){ + this.attributes[name] = value; + }, + getAttribute: function(name){ + return this.attributes[name]; + }, + addParam: function(name, value){ + this.params[name] = value; + }, + getParams: function(){ + return this.params; + }, + addVariable: function(name, value){ + this.variables[name] = value; + }, + getVariable: function(name){ + return this.variables[name]; + }, + getVariables: function(){ + return this.variables; + }, + getVariablePairs: function(){ + var variablePairs = new Array(); + var key; + var variables = this.getVariables(); + for(key in variables){ + variablePairs[variablePairs.length] = key +"="+ variables[key]; + } + return variablePairs; + }, + getSWFHTML: function() { + var swfNode = ""; + if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // netscape plugin architecture + if (this.getAttribute("doExpressInstall")) { + this.addVariable("MMplayerType", "PlugIn"); + this.setAttribute('swf', this.xiSWFPath); + } + swfNode = ' 0){ swfNode += 'flashvars="'+ pairs +'"'; } + swfNode += '/>'; + } else { // PC IE + if (this.getAttribute("doExpressInstall")) { + this.addVariable("MMplayerType", "ActiveX"); + this.setAttribute('swf', this.xiSWFPath); + } + swfNode = ''; + swfNode += ''; + var params = this.getParams(); + for(var key in params) { + swfNode += ''; + } + var pairs = this.getVariablePairs().join("&"); + if(pairs.length > 0) {swfNode += '';} + swfNode += ""; + } + return swfNode; + }, + write: function(elementId){ + if(this.getAttribute('useExpressInstall')) { + // check to see if we need to do an express install + var expressInstallReqVer = new deconcept.PlayerVersion([6,0,65]); + if (this.installedVer.versionIsValid(expressInstallReqVer) && !this.installedVer.versionIsValid(this.getAttribute('version'))) { + this.setAttribute('doExpressInstall', true); + this.addVariable("MMredirectURL", escape(this.getAttribute('xiRedirectUrl'))); + document.title = document.title.slice(0, 47) + " - Flash Player Installation"; + this.addVariable("MMdoctitle", document.title); + } + } + if(this.skipDetect || this.getAttribute('doExpressInstall') || this.installedVer.versionIsValid(this.getAttribute('version'))){ + var n = (typeof elementId == 'string') ? document.getElementById(elementId) : elementId; + n.innerHTML = this.getSWFHTML(); + return true; + }else{ + if(this.getAttribute('redirectUrl') != "") { + document.location.replace(this.getAttribute('redirectUrl')); + } + } + return false; + } +} + +/* ---- detection functions ---- */ +deconcept.SWFObjectUtil.getPlayerVersion = function(){ + var PlayerVersion = new deconcept.PlayerVersion([0,0,0]); + if(navigator.plugins && navigator.mimeTypes.length){ + var x = navigator.plugins["Shockwave Flash"]; + if(x && x.description) { + PlayerVersion = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split(".")); + } + }else if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0){ // if Windows CE + var axo = 1; + var counter = 3; + while(axo) { + try { + counter++; + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+ counter); +// document.write("player v: "+ counter); + PlayerVersion = new deconcept.PlayerVersion([counter,0,0]); + } catch (e) { + axo = null; + } + } + } else { // Win IE (non mobile) + // do minor version lookup in IE, but avoid fp6 crashing issues + // see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/ + try{ + var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + }catch(e){ + try { + var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + PlayerVersion = new deconcept.PlayerVersion([6,0,21]); + axo.AllowScriptAccess = "always"; // error if player version < 6.0.47 (thanks to Michael Williams @ Adobe for this code) + } catch(e) { + if (PlayerVersion.major == 6) { + return PlayerVersion; + } + } + try { + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); + } catch(e) {} + } + if (axo != null) { + PlayerVersion = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(",")); + } + } + return PlayerVersion; +} +deconcept.PlayerVersion = function(arrVersion){ + this.major = arrVersion[0] != null ? parseInt(arrVersion[0]) : 0; + this.minor = arrVersion[1] != null ? parseInt(arrVersion[1]) : 0; + this.rev = arrVersion[2] != null ? parseInt(arrVersion[2]) : 0; +} +deconcept.PlayerVersion.prototype.versionIsValid = function(fv){ + if(this.major < fv.major) return false; + if(this.major > fv.major) return true; + if(this.minor < fv.minor) return false; + if(this.minor > fv.minor) return true; + if(this.rev < fv.rev) return false; + return true; +} +/* ---- get value of query string param ---- */ +deconcept.util = { + getRequestParameter: function(param) { + var q = document.location.search || document.location.hash; + if (param == null) { return q; } + if(q) { + var pairs = q.substring(1).split("&"); + for (var i=0; i < pairs.length; i++) { + if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { + return pairs[i].substring((pairs[i].indexOf("=")+1)); + } + } + } + return ""; + } +} +/* fix for video streaming bug */ +deconcept.SWFObjectUtil.cleanupSWFs = function() { + var objects = document.getElementsByTagName("OBJECT"); + for (var i = objects.length - 1; i >= 0; i--) { + objects[i].style.display = 'none'; + for (var x in objects[i]) { + if (typeof objects[i][x] == 'function') { + objects[i][x] = function(){}; + } + } + } +} +// fixes bug in some fp9 versions see http://blog.deconcept.com/2006/07/28/swfobject-143-released/ +if (deconcept.SWFObject.doPrepUnload) { + if (!deconcept.unloadSet) { + deconcept.SWFObjectUtil.prepUnload = function() { + __flash_unloadHandler = function(){}; + __flash_savedUnloadHandler = function(){}; + window.attachEvent("onunload", deconcept.SWFObjectUtil.cleanupSWFs); + } + window.attachEvent("onbeforeunload", deconcept.SWFObjectUtil.prepUnload); + deconcept.unloadSet = true; + } +} +/* add document.getElementById if needed (mobile IE < 5) */ +if (!document.getElementById && document.all) { document.getElementById = function(id) { return document.all[id]; }} + +/* add some aliases for ease of use/backwards compatibility */ +var getQueryParamValue = deconcept.util.getRequestParameter; +var FlashObject = deconcept.SWFObject; // for legacy support +var SWFObject = deconcept.SWFObject; diff --git a/jawstats/languages/de-de.js b/jawstats/languages/de-de.js new file mode 100755 index 0000000..e1cad65 --- /dev/null +++ b/jawstats/languages/de-de.js @@ -0,0 +1,455 @@ +// JAWStats de-de translation file +// Last Updated: Sunday, 25th January 2009. 04:10:55 +oTranslation = { +"0 seconds - 30 seconds":"0 Sekunden - 30 Sekunden", +"15 minutes - 30 minutes":"15 Minuten - 30 Minuten", +"1st":"Erster", +"2 minutes - 5 minutes":"2 Minuten - 5 Minuten", +"2nd":"Zweiter", +"30 minutes - 1 hour":"30 Minuten - 1 Stunde", +"30 seconds - 2 minutes":"30 Sekunden - 2 Minuten", +"3rd":"Dritter", +"5 minutes - 15 minutes":"5 Minuten - 15 Minuten", +"Active Server Page":"Active Server Page", +"Adobe Flash file":"Adobe Flash Datei", +"Adobe Portable Document Format file":"Adobe PDF Datei", +"Aero/Travel domains":"Luftfahrt-/Reiseunternemens Adressen", +"Afghanistan":"Afghanistan", +"Africa":"Afrika", +"Aland Islands":"Åland", +"Albania":"Albanien", +"Algeria":"Algerien", +"All Browsers":"Alle Browser", +"All Months":"Alle Monate", +"All Operating Systems":"Alle Betriebsysteme", +"All Referrers":"Alle Herkünfte", +"American Samoa":"Amerikanisch-Samoa", +"Andorra":"Andorra", +"Angola":"Angola", +"Anguilla":"Anguilla", +"Antarctica":"Antarktis", +"Antigua and Barbuda":"Antigua und Barbuda", +"Apr":"Apr", +"April":"April", +"Argentina":"Argentinien", +"Armenia":"Armenien", +"Aruba":"Aruba", +"Asia":"Asien", +"Aug":"Aug", +"August":"August", +"Australia":"Australien", +"Austria":"Österreich", +"Average":"Durchschnitt", +"Average Size":"Durchschnittliche Größe", +"Azerbaijan":"Aserbaidschan", +"Bad Request":"Ungültige Anfrage", +"Bahamas":"Bahamas", +"Bahrain":"Bahrain", +"Bandwidth":"Bandbreite", +"Bangladesh":"Bangladesh", +"Barbados":"Barbados", +"Belarus":"Weißrussland", +"Belgium":"Belgien", +"Belize":"Belize", +"Benin":"Benin", +"Bermuda":"Bermuda", +"Bhutan":"Bhutan", +"Bolivia":"Bolivien", +"Bosnia and Herzegovina":"Bosnien und Herzegowina", +"Botswana":"Botswana", +"Bouvet Island":"Bouvetinsel", +"Brazil":"Brasilien", +"British Indian Ocean Territory":"Britisches Territorium im Indischen Ozean", +"Browser":"Browser", +"Browser Families":"Browser Familien", +"Browser Family":"Browser Familie", +"Browsers":"Browser", +"Brunei Darussalam":"Brunei Darussalam", +"Bulgaria":"Bulgarien", +"Burkina Faso":"Burkina Faso", +"Burundi":"Burundi", +"BW":"Bandbreite", +"Calendar of Bandwidth Usage":"Kalender (Bandbreiten Nutzung)", +"Calendar of Bandwidth Usage this Month":"Kalender (Bandbreite) in diesem Monat", +"Calendar of Hits":"Kalender (Zugriffe)", +"Calendar of Hits this Month":"Kaldender (Zugriffe in diesem Monat)", +"Calendar of Page Views":"Kalender (Seitenansichten)", +"Calendar of Page Views this Month":"Kalender (aufgerufene Seiten) in diesem Monat", +"Calendar of Visitors":"Kaldender (Besucher)", +"Calendar of Visitors this Month":"Kalender (Besucher in diesem Monat)", +"Cambodia":"Kambodscha", +"Cameroon":"Kamerun", +"Canada":"Kanada", +"Cape Verde":"Cabo Verde", +"Cascading Style Sheet":"Cascading Style Sheet", +"Cayman Islands":"Kaimaninseln", +"Central African Republic":"Zentralafrikanische Republik", +"CGI script":"CGI-Skript", +"Chad":"Tschad", +"Chile":"Chile", +"China":"China", +"Christmas Island":"Weihnachtsinsel", +"Cocos (Keeling) Islands":"Kokosinseln", +"Code":"Code", +"Coldfusion script":"Coldfusion-Skript", +"Colombia":"Kolumbien", +"Commercial":"Kommerziell", +"Comoros":"Komoren", +"Congo (Brazzaville)":"Republik Kongo", +"Congo (Kinshasa)":"Demokratische Republik Kongo", +"Continents":"Kontinente", +"Cook Islands":"Cookinseln", +"Costa Rica":"Costa Rica", +"Cote d'Ivoire":"Elfenbeinküste", +"Countries":"Länder", +"Countries":"Länder", +"Croatia":"Kroatien", +"Cuba":"Kuba", +"Cyprus":"Zypern", +"Czech Republic":"Tschechische Republik", +"Daily Average":"Täglicher Durchschnitt", +"Date":"Datum", +"Day":"Tag", +"Dec":"Dez", +"December":"Dezember", +"Denmark":"Dänemark", +"Description":"Beschreibung", +"Djibouti":"Dschibuti", +"Dominica":"Dominica", +"Dominican Republic":"Dominikanische Republik", +"Ecuador":"Ecuador", +"Egypt":"Ägypten", +"El Salvador":"El Salvador", +"Entry":"Eingang", +"Equatorial Guinea":"Äquatorialguinea", +"Eritrea":"Eritrea", +"Estonia":"Estland", +"Ethiopia":"Äthiopien", +"Europe":"Europa", +"European Union":"Europäische Union", +"Exit":"Ausgang", +"Falkland Islands":"Falklandinseln", +"Faroe Islands":"FÃ¥rö", +"Feb":"Feb", +"February":"Februar", +"Fiji":"Fiji", +"File Archive":"Dateiarchiv", +"File Not Found":"Dokument nicht gefunden", +"File Not Found URLs":"Nicht gefundene Adressen", +"Filetype":"Dateityp", +"Filetypes":"Dateitypen", +"Finland":"Finnland", +"Flash Video file":"Flash Video Datei", +"Forbidden":"Verboten", +"France":"Frankreich", +"French Guiana":"Französisch-Guayana", +"French Polynesia":"Französisch-Polynesien", +"French Southern Lands":"Französische Süd- und Antarktisgebiete", +"Frequency":"Frequenz", +"Fri":"Fr", +"Friday":"Freitag", +"Gabon":"Gabun", +"Gambia":"Gambia", +"Georgia":"Georgien", +"Germany":"Deutschland", +"Ghana":"Ghana", +"Gibraltar":"Gibraltar", +"Greece":"Griechenland", +"Greenland":"Grönland", +"Grenada":"Grenada", +"Guadeloupe":"Guadeloupe", +"Guam":"Guam", +"Guatemala":"Republik Guatemala", +"Guernsey":"Guernsey", +"Guinea":"Guinea", +"Guinea-Bissau":"Guinea-Bissau", +"Guyana":"Guyana", +"Haiti":"Haiti", +"Heard and McDonald Islands":"Heard und McDonaldinseln", +"Hits":"Aufrufe", +"Honduras":"Honduras", +"Hong Kong":"Hong Kong", +"Hour":"Stunde", +"Hours":"Stunden", +"HTML or XML static page":"Statische HTML- oder XML-Seite", +"HTTP Status Codes":"HTTP Status Codes", +"Hungary":"Ungarn", +"Iceland":"Island", +"Icon":"Icon", +"Image":"Bild", +"India":"Indien", +"Indonesia":"Indonesien", +"Info Domains":"Info Domains", +"Iran":"Iran", +"Iraq":"Irak", +"Ireland":"Irland", +"Isle of Man":"Isle of Man", +"Israel":"Israel", +"Italy":"Italien", +"Jamaica":"Jamaika", +"Jan":"Jan", +"January":"Januar", +"Japan":"Japan", +"JavaScript File":"JavaScript-Datei", +"JavaServer Page":"JavaServer-Seite", +"Jersey":"Jersey", +"Jordan":"Jordanien", +"Jul":"Jul", +"July":"Juli", +"Jun":"Jun", +"June":"Juni", +"Kazakhstan":"Kasachstan", +"Kenya":"Kenia", +"Keyphrase":"Keyphrase", +"Keyphrases":"Suchaudrücke", +"Keyword":"Keyword", +"Keywords":"Stichwörter", +"Kiribati":"Kiribati", +"Korea, North":"Nordkorea", +"Korea, South":"Südkorea", +"Kuwait":"Kuwait", +"Kyrgyzstan":"Kirgistan", +"Laos":"Laos", +"Last Visit":"Letzter Besuch", +"Latvia":"Lettland", +"Lebanon":"Libanon", +"Lesotho":"Lesotho", +"Liberia":"Liberia", +"Libya":"Libyen", +"Liechtenstein":"Liechtenstein", +"Lithuania":"Littauen", +"Local Network Host":"Host dem Lokalem Netzwerk", +"Localhost":"Localhost", +"Luxembourg":"Luxemburg", +"Macau":"Macau", +"Macedonia":"Mazedonien", +"Madagascar":"Madagaskar", +"Malawi":"Malawi", +"Malaysia":"Malaysia", +"Maldives":"Malediven", +"Mali":"Mali", +"Malta":"Malta", +"Mar":"Mär", +"March":"März", +"Marshall Islands":"Marshall-Inseln", +"Martinique":"Martinique", +"Mauritania":"Mauretanien", +"Mauritius":"Mauritius", +"May":"Mai", +"May":"Mai", +"Mayotte":"Mayotte", +"Mexico":"Mexiko", +"Micronesia":"Mikronesien", +"Microsoft PowerPoint file":"Microsoft PowerPoint Datei", +"Moldova":"Moldawien", +"Mon":"Mon", +"Monaco":"Monaco", +"Monday":"Montag", +"Mongolia":"Mongolei", +"Montenegro":"Montenegro", +"Month":"Monat", +"Montserrat":"Montserrat", +"More than 1 hour":"Länger als 1 Stunde", +"Morocco":"Marokko", +"Moved Permanently (redirect)":"Permanent verschoben (redirect)", +"Moved Temporarily (redirect)":"Temporär verschoben (redirect)", +"Mozambique":"Mosambik", +"MPEG-1 Audio Layer 3 file":"MPEG-1 Audio Layer 3 Datei", +"MPEG-4 Audio File":"MPEG-4 Audio Datei", +"Myanmar":"Myanmar", +"Name domains":"Namen Domains", +"Namibia":"Namibia", +"NATO":"NATO", +"Nauru":"Nauru", +"Nepal":"Nepal", +"Netherlands":"Niederlande", +"Netherlands Antilles":"Niederländische Antillen", +"Network":"Netzwerk", +"New Caledonia":"Neu-Kaledonien", +"New Zealand":"Neuseeland", +"Nicaragua":"Nicaragua", +"Niger":"Niger", +"Nigeria":"Nigeria", +"Niue":"Niue", +"Non-Profit Organisations":"Nicht Kommerzielle Organisationen", +"Norfolk Island":"Norfolkinsel", +"North America":"Nord Amerika", +"Northern Mariana Islands":"Nord-Marianeninseln", +"Norway":"Norwegen", +"Not Viewed":"Nicht sichtbar", +"Nov":"Nov", +"November":"November", +"Oceania":"Ozeanien", +"Oct":"Okt", +"October":"Oktober", +"Old style Arpanet":"Infrastruktur-Domain", +"Oman":"Oman", +"Operating Systems":"Betriebssystem", +"Other":"Andere", +"Other Browsers":"Andere Browser", +"Other Countries":"Andere Länder", +"Other Filetypes":"Andere Dateitypen", +"Other Keyphrases":"Andere Schlüsselsätze", +"Other Keywords":"Andere Schlüsselwörter", +"Other Operating Systems":"Andere Betriebssysteme", +"Other Referrers":"Andere Herkünfte", +"Other Search Engines":"Andere Suchmaschinen", +"Other Spiders":"Andere Robots", +"Other Status Codes":"Andere Status Meldungen", +"Other URLs":"Andere Adressen", +"Other Versions":"Andere Versionen", +"Other Visitors":"Andere Besucher", +"Overall":"Insgesamt", +"Overview":"Übersicht", +"Pages":"Seiten", +"Pages":"Seiten", +"Pakistan":"Pakistan", +"Palau":"Palau", +"Palestine":"Palästina", +"Panama":"Panama", +"Papua New Guinea":"Papua Neu-Guinea", +"Paraguay":"Paraguay", +"Partial Content":"Partieller Inhalt", +"per Visit":"pro Besuch", +"Perl script":"Perl-Skript", +"Peru":"Peru", +"Philippines":"Philippinen", +"PHP script":"PHP-Skript", +"Pitcairn":"Pitcairn", +"Poland":"Polen", +"Portugal":"Portugal", +"Puerto Rico":"Puerto Rico", +"Qatar":"Katar", +"QuickTime Movie":"QuickTime-Film", +"Referrer":"Referrer", +"Referrers":"Herkünfte", +"Referring Domains":"Verweisende Adressen", +"Referring Pages":"Verweisende Seiten", +"Referring Search Engines":"Verweisende Suchmaschinen", +"Reunion":"La Réunion", +"Romania":"Rumänien", +"Russian Federation":"Russland", +"Rwanda":"Ruanda", +"Saint Barthelemy":"St. Barth", +"Saint Helena":"St. Helena", +"Saint Kitts and Nevis":"St. Kitts und Nevis", +"Saint Lucia":"St. Lucia", +"Saint Martin (French part)":"St. Martin (frz.)", +"Saint Pierre and Miquelon":"Saint-Pierre und Miquelon", +"Saint Vincent and the Grenadines":"St. Vincent und die Grenadinen", +"Samoa":"Samoa", +"San Marino":"San Marino", +"Sao Tome and Principe":"São Tomé und Príncipe", +"Sat":"Sa", +"Satellite Provider":"Satelliten Provider", +"Saturday":"Samstag", +"Saudi Arabia":"Saudi-Arabien", +"Search Engine":"Suchmaschine", +"Search Engines":"Suchmaschinen", +"Senegal":"Senegal", +"Sep":"Sep", +"September":"September", +"Serbia":"Serbien", +"Service Unavailable":"Service nicht verfügbar", +"Session Duration":"Session Dauer", +"Session Length":"Session Länge", +"Sessions":"Sitzungen", +"Seychelles":"Seychellen", +"Sierra Leone":"Sierra Leone", +"Singapore":"Singapur", +"Slovakia":"Slowakei", +"Slovenia":"Slovenien", +"Solomon Islands":"Solomon-Inseln", +"Somalia":"Somalia", +"South Africa":"Südafrika", +"South America":"Süd Amerika", +"South Georgia and South Sandwich Islands":"Südgeorgien und die Südlichen Sandwichinseln", +"Spain":"Spanien", +"Spider":"Spider", +"Spiders":"Spiders", +"Sri Lanka":"Sri Lanka", +"Status":"Status", +"Sudan":"Sudan", +"Sun":"So", +"Sunday":"Sonntag", +"Suriname":"Surinam", +"Svalbard and Jan Mayen Islands":"Svalbard und Jan Mayen Insel", +"Swaziland":"Swasiland", +"Sweden":"Schweden", +"Switzerland":"Schweiz", +"Syria":"Syrien", +"Taiwan":"Taiwan", +"Tajikistan":"Tadschikistan", +"Tanzania":"Tansania", +"Text file":"Textdatei", +"Thailand":"Thailand", +"The password you entered was incorrect":"Das eingegebene Passwort ist nicht korrekt", +"There is no data to display":"Es gibt keine anzuzeigenden Daten.", +"This Month":"Aktueller Monat", +"Thu":"Do", +"Thursday":"Donnerstag", +"Timor-Leste":"Ost-Timor", +"Togo":"Togo", +"Tokelau":"Tokelau", +"Tonga":"Tonga", +"Top 10 Referrers":"Top 10 Herkünfte", +"Top 50 Referrers":"Top 10 Herkünfte", +"Top Bandwidth":"Top Bandbreite", +"Top Entry Pages":"Top Einstiegsseiten", +"Total":"Gesamt", +"Total Visitors":"Besucher Insgesamt", +"Trinidad and Tobago":"Trinidad und Tobago", +"Tue":"Di", +"Tuesday":"Dienstag", +"Tunisia":"Tunesien", +"Turkey":"Türkei", +"Turkmenistan":"Turkmenistan", +"Turks and Caicos Islands":"Turks- und Caicosinseln", +"Tuvalu":"Tuvalu", +"Uganda":"Uganda", +"Ukraine":"Ukraine", +"Unauthorized":"Nicht authorisiert", +"Unique Ratio":"Eindeutiges Verhältnis", +"Unique Visitors":"Eindeutige Besucher", +"United Arab Emirates":"Vereinigte Arabische Emirate", +"United Kingdom":"Großbrittannien", +"United States Minor Outlying Islands":"Amerikanisch-Ozeanien", +"United States of America":"Vereinigte Staaten von Amerika", +"Unknown":"Unbekannt", +"URL":"URL", +"Uruguay":"Uruguay", +"USA Educational":"Bildungseinrichtungen", +"USA Military":"militärische Einrichtungen der USA", +"Uzbekistan":"Usbekistan", +"Vanuatu":"Vanuatu", +"Vatican City":"Vatikan-Stadt", +"Venezuela":"Venezuela", +"Vietnam":"Vietnam", +"Virgin Islands, British":"Britische Virgin-Inseln", +"Virgin Islands, U.S.":"U.S.-amerikanische Virgin-Inseln", +"Visiting Spiders":"Indizierende Suchmaschinen", +"Visitors by Continent":"Besucher pro Kontinent", +"Visitors by Country":"Besucher pro Land", +"Visitors from Africa":"Besucher aus Afrika", +"Visitors from Asia":"Besucher aus Asien", +"Visitors from Europe":"Besucher aus Europa", +"Visitors from North America":"Besucher aus Nord Amerkia", +"Visitors from Oceania":"Besucher aus Ozeanien", +"Visitors from South America":"Besucher aus Süd Amerika", +"Visitors per Day":"Besucher pro Tag", +"Visitors this Month":"Besucher in diesem Monat", +"Visits":"Besuche", +"Wallis and Futuna Islands":"Wallis und Futuna-Inseln", +"Waveform Audio file":"Waveform Audio Datei", +"Wed":"Mi", +"Wednesday":"Mittwoch", +"Week":"Woche", +"Week Total":"Gesamte Woche", +"Western Sahara":"Westliche Sahara", +"within Family":"im Bereich", +"XML file":"XML-Datei", +"Year":"Jahr", +"Yemen":"Jemen", +"Zambia":"Sambia", +"Zimbabwe":"Simbabwe" +} \ No newline at end of file diff --git a/jawstats/languages/fr.js b/jawstats/languages/fr.js new file mode 100755 index 0000000..fc90d26 --- /dev/null +++ b/jawstats/languages/fr.js @@ -0,0 +1,311 @@ +// JAWStats fr translation file +// Last Updated: Sunday, 25th January 2009. 04:10:40 +oTranslation = { +"0 seconds - 30 seconds":"0 seconde - 30 secondes", +"15 minutes - 30 minutes":"15 minutes - 30 minutes", +"2 minutes - 5 minutes":"2 minutes - 5 minutes", +"30 minutes - 1 hour":"30 minutes - 1 heure", +"30 seconds - 2 minutes":"30 secondes - 2 minutes", +"5 minutes - 15 minutes":"5 minutes - 15 minutes", +"Active Server Page":"Page de serveur active", +"Adobe Flash file":"Fichier Adobe Flash", +"Adobe Portable Document Format file":"Fichier Adobe PDF", +"Afghanistan":"Afghanistan", +"Africa":"Afrique", +"Aland Islands":"Åland", +"Albania":"Albanie", +"Algeria":"Algérie", +"All Browsers":"Tous les navigateurs", +"All Months":"Tous les mois", +"All Operating Systems":"Tous les systèmes d'exploitations", +"All Referrers":"Tous les référents", +"American Samoa":"Samoa américaines", +"Andorra":"Andorre", +"Angola":"Angola", +"Anguilla":"Île d'Anguilla", +"Antarctica":"Antarctique", +"Antigua and Barbuda":"Antigua-et-Barbuda", +"Apr":"Avr", +"April":"Avril", +"Argentina":"Argentine", +"Armenia":"Arménie", +"Aruba":"Aruba", +"Asia":"Asie", +"Aug":"Aou", +"August":"Août", +"Australia":"Australie", +"Austria":"Autriche", +"Average":"Moyenne", +"Average Size":"Taille moyenne", +"Azerbaijan":"Azerbaïdjan", +"Bad Request":"Mauvaise requête", +"Bahamas":"Bahamas", +"Bahrain":"Bahreïn", +"Bandwidth":"Bande Passante", +"Bangladesh":"Bangladesh", +"Barbados":"Barbade", +"Belarus":"Biélorussie", +"Belgium":"Belgique", +"Belize":"Bélize", +"Benin":"Bénin", +"Bermuda":"Bermudes", +"Bhutan":"Bhoutan", +"Bolivia":"Bolivie", +"Bosnia and Herzegovina":"Bosnie-Herzégovine", +"Botswana":"Botswana", +"Bouvet Island":"Île Bouvet", +"Brazil":"Brésil", +"British Indian Ocean Territory":"Territoire britannique de l'océan Indien", +"Browser":"Navigateur", +"Browser Families":"Familles de navigateurs", +"Browser Family":"Famille de navigateurs", +"Browsers":"Navigateurs", +"Brunei Darussalam":"Brunei", +"Bulgaria":"Bulgarie", +"Burkina Faso":"Burkina Faso", +"Burundi":"Burundi", +"BW":"BP", +"Calendar of Bandwidth Usage":"Calendrier de la conso. de la Bande Passante", +"Calendar of Bandwidth Usage this Month":"Calendrier de l'usage de la bande passante pour le mois", +"Calendar of Hits":"Calendrier des Hits", +"Calendar of Hits this Month":"Calendrier des HIT du mois", +"Calendar of Page Views":"Calendrier des pages vues", +"Calendar of Page Views this Month":"Calendrier des Pages vues ce mois", +"Calendar of Visitors":"Calendrier des Visiteurs", +"Calendar of Visitors this Month":"Calendrier des Visiteurs de ce mois", +"Cambodia":"Cambodge", +"Cameroon":"Cameroun", +"Canada":"Canada", +"Cape Verde":"Cap Vert", +"Cascading Style Sheet":"Feuilles de style", +"Cayman Islands":"Îles Caïmans", +"Central African Republic":"République Centre-Africaine", +"CGI script":"Script CGI", +"Chad":"Tchad", +"Chile":"Chili", +"China":"Chine", +"Christmas Island":"Île Christmas", +"Cocos (Keeling) Islands":"Îles Cocos", +"Code":"Code", +"Coldfusion script":"Script Coldfusion", +"Colombia":"Colombie", +"Comoros":"Comores", +"Congo (Brazzaville)":"République du Congo", +"Congo (Kinshasa)":"République démocratique du Congo", +"Continents":"Continents", +"Cook Islands":"Îles Cook", +"Costa Rica":"Costa Rica", +"Cote d'Ivoire":"Côte d'Ivoire", +"Countries":"Pays", +"Countries":"Pays", +"Croatia":"Croatie", +"Cuba":"Cuba", +"Cyprus":"Chypre", +"Czech Republic":"République Tchèque", +"Daily Average":"Moyenne quotidienne", +"Date":"Date", +"Day":"Jour", +"Day of Week Average":"Moyenne pour jours de la semaine", +"Day of Week Total":"Total pour jours de la semaine", +"Dec":"Déc", +"December":"Décembre", +"Denmark":"Danemark", +"Description":"Description", +"Djibouti":"Djibouti", +"Dominica":"Dominique", +"Dominican Republic":"République Dominicaine", +"Ecuador":"Équateur", +"Egypt":"Égypte", +"El Salvador":"Salvador", +"Entry":"Entrée", +"Equatorial Guinea":"Guinée Équatoriale", +"Eritrea":"Érythrée", +"Estonia":"Estonie", +"Ethiopia":"Éthiopie", +"Europe":"Europe", +"Exit":"Sortie", +"Falkland Islands":"Îles Malouines", +"Feb":"Fév", +"February":"Février", +"Fiji":"Îles Fiji", +"File Archive":"Archive", +"File Not Found":"Fichier introuvable", +"File Not Found URLs":"Fichier URLs introuvable", +"Filetype":"Type de fichier", +"Filetypes":"Type de fichier", +"Finland":"Finlande", +"Flash Video file":"Fichier Vidéo Flash", +"Forbidden":"Interdit", +"France":"France", +"Frequency":"Fréquence", +"Fri":"Ven", +"Friday":"Vendredi", +"Greece":"Grèce", +"Greenland":"Groenland", +"Grenada":"Grenade", +"Guadeloupe":"Guadeloupe", +"Hits":"Hits", +"Honduras":"Honduras", +"Hong Kong":"Hong Kong", +"Hour":"Heure", +"Hours":"Heures", +"HTML or XML static page":"Page statique HTML ou XML", +"HTTP Status Codes":"Codes de statut HTTP", +"Hungary":"Hongrie", +"Icon":"Icone", +"Image":"Image", +"India":"Inde", +"Indonesia":"Indonésie", +"Iran":"Iran", +"Iraq":"Iraq", +"Ireland":"Irelande", +"Italy":"Italie", +"Jan":"Jan", +"January":"Janvier", +"Japan":"Japon", +"JavaScript File":"Fichier JavaScript", +"JavaServer Page":"Fichier JSP", +"Jordan":"Jordanie", +"Jul":"Jui", +"July":"Juillet", +"Jun":"Jui", +"June":"Juin", +"Keyphrase":"Phrase clés", +"Keyphrases":"Phrases clés", +"Keyword":"Mot clés", +"Keywords":"Mots clés", +"Last Visit":"Dernière visite", +"Lebanon":"Liban", +"Luxembourg":"Luxembourg", +"Mar":"Mar", +"March":"Mars", +"May":"Mai", +"May":"Mai", +"Microsoft PowerPoint file":"Fichier Microsoft PowerPoint", +"Mon":"Lun", +"Monday":"Lundi", +"Month":"Mois", +"More than 1 hour":"Plus d'une heure", +"Moved Permanently (redirect)":"Changement définitif(redirection)", +"Moved Temporarily (redirect)":"Changement temporaire(redirection)", +"MPEG-1 Audio Layer 3 file":"Fichier Audio MP3", +"MPEG-4 Audio File":"Fichier Audio MPEG-4", +"North America":"Amérique du Nord", +"Not Viewed":"Non vues", +"Nov":"Nov", +"November":"Novembre", +"Oceania":"Océanie", +"Oct":"Oct", +"October":"Octobre", +"Operating System":"Système d'exploitation", +"Operating System Families":"Familles de systèmes d'exploitation", +"Operating System Family":"Famille de systèmes d'exploitation", +"Operating Systems":"Système d'exploitation", +"Other":"Autre", +"Other Browsers":"Autres Navigateurs", +"Other Countries":"Autres Pays", +"Other Filetypes":"Autres types de fichiers", +"Other Keyphrases":"Autres phrases clés", +"Other Keywords":"Autres mots clés", +"Other Operating Systems":"Autres systèmes d'exploitation", +"Other Referrers":"Autres référents", +"Other Search Engines":"Autres moteurs de recherche", +"Other Spiders":"Autres robots d'indexation", +"Other Status Codes":"Autres codes de statut", +"Other URLs":"Autres URLs", +"Other Versions":"Autres versions", +"Other Visitors":"Autre Visiteurs", +"Overall":"Vue d'ensemble", +"Overview":"Survol", +"Page Views":"Pages vues", +"Pages":"Pages", +"Pages":"Pages", +"Partial Content":"Contenu partiel", +"per Visit":"par Visite", +"Perl script":"Script Perl", +"PHP script":"Script PHP", +"QuickTime Movie":"Vidéo QuickTime", +"Referrer":"Référent", +"Referrers":"Referrers", +"Referring Domains":"Domaines référents", +"Referring Pages":"Pages référentes", +"Referring Search Engines":"Moteurs de recherche référents", +"Romania":"Roumanie", +"Sat":"Sam", +"Saturday":"Samedi", +"Search Engine":"Moteur de recherche", +"Search Engines":"Moteurs de recherche", +"Sep":"Sep", +"September":"Septembre", +"Serbia":"Serbie", +"Service Unavailable":"Service indisponible", +"Session Duration":"Durée de session", +"Session Length":"Durée de session", +"Sessions":"Sessions", +"South Africa":"Afrique du Sud", +"South America":"Amérique du Sud", +"Spain":"Espagne", +"Spider":"Robot d'indexation", +"Spiders":"Robot d'indexation", +"Status":"Statut", +"Sudan":"Soudan", +"Sun":"Dim", +"Sunday":"Dimanche", +"Sweden":"Suède", +"Switzerland":"Suisse", +"Syria":"Syrie", +"Taiwan":"Taïwan", +"Tajikistan":"Tadjikistan", +"Tanzania":"Tanzanie", +"Text file":"Fichier Texte", +"Thailand":"Thaïlande", +"The password you entered was incorrect":"Le mot de passe que vous avez entré est incorrect", +"There is no data to display":"Il n'y a pas de donnée à afficher", +"This Month":"Ce mois", +"Thu":"Jeu", +"Thursday":"Jeudi", +"Timor-Leste":"Timor oriental", +"Togo":"Togo", +"Tokelau":"Tokelau", +"Top 10 Referrers":"Top 10 des référents", +"Top 50 Referrers":"Top 50 des référents", +"Top Bandwidth":"Top bande passante", +"Top Entry Pages":"Top des pages d'entrées", +"Top Exit Pages":"Top des pages de sorties", +"Top Page Views":"Top des pages vues", +"Total":"Total", +"Total Visitors":"Total Visiteurs", +"Trinidad and Tobago":"Trinité et Tobago", +"Tue":"Mar", +"Tuesday":"Mardi", +"Tunisia":"Tunisie", +"Turkey":"Turquie", +"Unauthorized":"Non autorisé", +"Unique Ratio":"Ratio uniques", +"Unique Visitors":"Visiteurs uniques", +"Unknown":"Inconnu", +"URL":"URL", +"Visiting Spiders":"Robots d'indexation en cours", +"Visitors by Continent":"Visiteurs par continent", +"Visitors by Country":"Visiteurs par pays", +"Visitors each Month":"Visiteurs par mois", +"Visitors each Year":"Visiteurs par années", +"Visitors from Africa":"Visiteurs d'Afrique", +"Visitors from Asia":"Visiteurs d'Asie", +"Visitors from Europe":"Visiteurs d'Europe", +"Visitors from North America":"Visiteurs d'Amérique du Nord", +"Visitors from Oceania":"Visiteurs d'Océanie", +"Visitors from South America":"Visiteurs d'Amérique du Sud", +"Visitors over 24 Hours":"Visiteurs au delà des 24h.", +"Visitors per Day":"Visiteurs par jour", +"Visitors this Month":"Visiteurs ce mois", +"Visits":"Visites", +"Waveform Audio file":"Fichier Audio Wav", +"Wed":"Mer", +"Wednesday":"Mercredi", +"Week":"Semaine", +"Week Total":"Total pour la semaine", +"within Family":"dans la Famille", +"XML file":"Fichier XML", +"Year":"Année" +} \ No newline at end of file diff --git a/jawstats/languages/jp.js b/jawstats/languages/jp.js new file mode 100755 index 0000000..8c15062 --- /dev/null +++ b/jawstats/languages/jp.js @@ -0,0 +1,415 @@ +// JAWStats jp translation file +// Last Updated: Sunday, 25th January 2009. 04:11:11 +oTranslation = { +"Active Server Page":"Active Server Page", +"Adobe Flash file":"Adobe Flashファイル", +"Afghanistan":"アフガニスタン", +"Africa":"アフリカ", +"Aland Islands":"オーランド諸島", +"Albania":"アルバニア", +"Algeria":"アルジェリア", +"All Browsers":"全ブラウザ", +"All Months":"月", +"All Operating Systems":"全OS", +"All Referrers":"全リファラー", +"American Samoa":"アメリカ領サモア", +"Andorra":"アンドラ", +"Angola":"アンゴラ", +"Anguilla":"アンギラ", +"Antarctica":"南極大陸", +"Antigua and Barbuda":"アンティグア・バーブーダ", +"Apr":"4月", +"April":"4月", +"Argentina":"アルゼンチン", +"Armenia":"アルメニア", +"Aruba":"アルバ", +"Asia":"アジア", +"Aug":"8月", +"August":"8月", +"Australia":"オーストラリア", +"Austria":"オーストリア", +"Average":"平均", +"Azerbaijan":"アゼルバイジャン", +"Bad Request":"不正なリクエスト", +"Bahamas":"バハマ", +"Bahrain":"バーレーン", +"Bandwidth":"バンド幅", +"Bangladesh":"バングラデシュ", +"Barbados":"バルバドス", +"Belarus":"ベラルーシ", +"Belgium":"ベルギー", +"Belize":"ベリーズ", +"Benin":"ベナン", +"Bermuda":"バミューダ", +"Bhutan":"ブータン", +"Bolivia":"ボリビア", +"Bosnia and Herzegovina":"ボスニア・ヘルツェゴビナ", +"Botswana":"ボツワナ", +"Bouvet Island":"ブーベ島", +"Brazil":"ブラジル", +"British Indian Ocean Territory":"イギリス領インド洋地域", +"Browser":"ブラウザ", +"Browser Families":"ブラウザ", +"Browser Family":"ブラウザ", +"Browsers":"ブラウザ", +"Brunei Darussalam":"ブルネイ・ダルサラーム", +"Bulgaria":"ブルガリア", +"Burkina Faso":"ブルキナファソ", +"Burundi":"ブルンジ", +"Calendar of Bandwidth Usage":"バンド幅使用量をカレンダーで見る", +"Calendar of Hits":"ヒット件数をカレンダーで見る", +"Calendar of Page Views":"アクセスページ件数をカレンダーで見る", +"Calendar of Visitors":"アクセス件数をカレンダーで見る", +"Cambodia":"カンボジア", +"Cameroon":"カメルーン", +"Canada":"カナダ", +"Cape Verde":"カーボベルデ", +"Cascading Style Sheet":"Cascading Style Sheet", +"Cayman Islands":"ケイマン諸島", +"Central African Republic":"中央アフリカ共和国", +"CGI script":"CGIスクリプト", +"Chad":"チャド", +"Chile":"チリ", +"China":"中国", +"Christmas Island":"クリスマス島", +"Cocos (Keeling) Islands":"ココス(キーリング)諸島", +"Coldfusion script":"Coldfusionスクリプト", +"Colombia":"コロンビア", +"Comoros":"コモロ連合", +"Congo (Brazzaville)":"コンゴ(ブラザビル)", +"Congo (Kinshasa)":"コンゴ(キンシャサ)", +"Continents":"大陸", +"Cook Islands":"クック諸島", +"Costa Rica":"コスタリカ", +"Cote d'Ivoire":"コートジボワール", +"Countries":"国", +"Countries":"国", +"Croatia":"クロアチア", +"Cuba":"キューバ", +"Cyprus":"キプロス", +"Czech Republic":"チェコ", +"Daily Average":"毎日の平均", +"Date":"日付", +"Day":"日", +"Day of Week Average":"曜日の平均", +"Day of Week Total":"曜日の合計", +"Dec":"12月", +"December":"12月", +"Denmark":"デンマーク", +"Description":"説明", +"Djibouti":"ジブチ", +"Dominica":"ドミニカ", +"Dominican Republic":"ドミニカ共和国", +"Ecuador":"エクアドル", +"Egypt":"エジプト", +"El Salvador":"エルサルバドル", +"Entry":"入り口", +"Equatorial Guinea":"赤道ギニア", +"Eritrea":"エリトリア", +"Estonia":"エストニア", +"Ethiopia":"エチオピア", +"Europe":"ヨーロッパ", +"European Union":"欧州連合", +"Exit":"出口", +"Falkland Islands":"フォークランド諸島", +"Faroe Islands":"フェロー諸島", +"Feb":"2月", +"February":"2月", +"Fiji":"フィジー", +"File Archive":"ファイルアーカイブ", +"File Not Found":"ページが見つかりません", +"Filetype":"ファイルの種類", +"Filetypes":"ファイル", +"Finland":"フィンランド", +"Flash Video file":"Flashビデオファイル", +"Forbidden":"禁止", +"France":"フランス", +"French Guiana":"フランス領ギアナ", +"French Polynesia":"タヒチ島", +"French Southern Lands":"フランス領南方地域", +"Frequency":"頻度", +"Fri":"金", +"Friday":"金曜日", +"Gabon":"ガボン", +"Gambia":"ガンビア", +"Georgia":"グルジア", +"Germany":"ドイツ", +"Ghana":"ガーナ", +"Gibraltar":"ジブラルタル", +"Greece":"ギリシャ", +"Greenland":"グリーンランド", +"Grenada":"グレナダ", +"Guadeloupe":"グアドループ", +"Guam":"グアム", +"Guatemala":"グアテマラ", +"Guernsey":"ガーンジー島", +"Guinea":"ギニア", +"Guinea-Bissau":"ギニアビサウ", +"Guyana":"ガイアナ", +"Haiti":"ハイチ", +"Heard and McDonald Islands":"ハード島とマクドナルド諸島", +"Honduras":"ホンジュラス", +"Hong Kong":"香港", +"Hour":"時", +"Hours":"時間", +"HTML or XML static page":"HTML or XML スタティックページ", +"HTTP Status Codes":"エラー", +"Hungary":"ハンガリー", +"Iceland":"アイスランド", +"Image":"イメージ", +"India":"インド", +"Indonesia":"インドネシア", +"Iran":"イラン", +"Iraq":"イラク", +"Ireland":"アイルランド", +"Isle of Man":"マン島", +"Israel":"イスラエル", +"Italy":"イタリア", +"Jamaica":"ジャマイカ", +"Jan":"1月", +"January":"1月", +"Japan":"日本", +"JavaScript File":"Javascriptファイル", +"JavaServer Page":"Javaserverページ", +"Jersey":"ジャージー島", +"Jordan":"ヨルダン", +"Jul":"7月", +"July":"7月", +"Jun":"6月", +"June":"6月", +"Kazakhstan":"カザフスタン", +"Kenya":"ケニア", +"Keyphrases":"キーフレーズ", +"Keywords":"キーワード", +"Kiribati":"キリバス", +"Korea, North":"北朝鮮", +"Korea, South":"韓国", +"Kuwait":"クウェート", +"Kyrgyzstan":"キルギス", +"Laos":"ラオス", +"Last Visit":"最終アクセス", +"Latvia":"ラトビア", +"Lebanon":"レバノン", +"Lesotho":"レソト", +"Liberia":"リベリア", +"Libya":"リビア", +"Liechtenstein":"リヒテンシュタイン", +"Lithuania":"リトアニア", +"Local Network Host":"ローカルネットワークホスト", +"Luxembourg":"ルクセンブルク", +"Macau":"マカオ", +"Macedonia":"マケドニア", +"Madagascar":"マダガスカル", +"Malawi":"マラウイ", +"Malaysia":"マレーシア", +"Maldives":"モルディブ", +"Mali":"マリ", +"Malta":"マルタ", +"Mar":"3月", +"March":"3月", +"Marshall Islands":"マーシャル諸島", +"Martinique":"マルティニーク", +"Mauritania":"モーリタニア", +"Mauritius":"モーリシャス", +"May":"5月", +"May":"5月", +"Mayotte":"マイヨット島", +"Mexico":"メキシコ", +"Micronesia":"ミクロネシア", +"Microsoft PowerPoint file":"Microsoft PowerPointファイル", +"Moldova":"モルドバ", +"Mon":"月", +"Monaco":"モナコ", +"Monday":"月曜日", +"Mongolia":"モンゴル", +"Montenegro":"モンテネグロ", +"Month":"月", +"Montserrat":"モントセラト", +"Morocco":"モロッコ", +"Moved Permanently (redirect)":"恒久的移動", +"Moved Temporarily (redirect)":"一時的な移動(転送)", +"Mozambique":"モザンビーク", +"MPEG-4 Audio File":"MPEG-4音声ファイル", +"Myanmar":"ミャンマー", +"Namibia":"ナミビア", +"Nauru":"ナウル", +"Nepal":"ネパール", +"Netherlands":"オランダ", +"Netherlands Antilles":"オランダ領アンティル", +"New Caledonia":"ニューカレドニア", +"New Zealand":"ニュージーランド", +"Nicaragua":"ニカラグア", +"Niger":"ニジェール", +"Nigeria":"ナイジェリア", +"Niue":"ニウエ", +"Norfolk Island":"ノーフォーク島", +"North America":"北アメリカ", +"Northern Mariana Islands":"北マリアナ諸島", +"Norway":"ノルウェー", +"Not Viewed":"ビューなし", +"Nov":"11月", +"November":"11月", +"Oceania":"]オセアニア", +"Oct":"10月", +"October":"10月", +"Oman":"オマーン", +"Operating System Families":"OSファミリー", +"Operating Systems":"オペレーティングシステム", +"Other":"その他", +"Other Browsers":"その他のブラウザー", +"Other Filetypes":"その他のファイルタイプ", +"Other Keyphrases":"その他のキーフレーズ", +"Other Keywords":"その他のキーワード", +"Other Operating Systems":"その他のOS", +"Other Referrers":"その他のリファレンス", +"Other Search Engines":"その他の検索エンジン", +"Other Spiders":"その他のスパイダー", +"Other Status Codes":"その他のステータスコード", +"Other URLs":"その他のURL", +"Other Versions":"その他のバージョン", +"Other Visitors":"他の訪問者数", +"Overview":"概略", +"Pages":"ページ", +"Pakistan":"パキスタン", +"Palau":"パラオ", +"Palestine":"パレスチナ", +"Panama":"パナマ", +"Papua New Guinea":"パプアニューギニア", +"Paraguay":"パラグアイ", +"Partial Content":"部分的コンテンツ", +"per Visit":"平均", +"Perl script":"Perlスクリプト", +"Peru":"ペルー", +"Philippines":"フィリピン", +"PHP script":"PHPスクリプト", +"Pitcairn":"ピトケアン諸島", +"Poland":"ポーランド", +"Portugal":"ポルトガル", +"Puerto Rico":"プエルトリコ", +"Qatar":"カタール", +"Referrers":"リファラー", +"Referring Domains":"リファラードメイン", +"Referring Pages":"ホームページ", +"Referring Search Engines":"リファラー", +"Reunion":"レユニオン島", +"Romania":"ルーマニア", +"Russian Federation":"ロシア連邦", +"Rwanda":"ルワンダ", +"Saint Barthelemy":"サン・バルテルミー島", +"Saint Helena":"セントヘレナ", +"Saint Kitts and Nevis":"セントクリストファー・ネイビス", +"Saint Lucia":"セントルシア", +"Saint Martin (French part)":"セント・マーチン島", +"Saint Pierre and Miquelon":"サンピエール・ミクロン", +"Saint Vincent and the Grenadines":"セントビンセント・グレナディーン", +"Samoa":"サモア", +"San Marino":"サンマリノ", +"Sao Tome and Principe":"サントメ・プリンシペ", +"Sat":"土", +"Satellite Provider":"衛星プロバイダー", +"Saturday":"土曜日", +"Saudi Arabia":"サウジアラビア", +"Search Engine":"検索エンジン", +"Search Engines":"検索エンジン", +"Senegal":"セネガル", +"Sep":"9月", +"September":"9月", +"Serbia":"セルビア", +"Service Unavailable":"利用できないサービスです。", +"Session Duration":"Ugh, put the wrong translation here ... don't have Session Duration in my translations though ...", +"Session Length":"セッション", +"Sessions":"セッション", +"Seychelles":"セーシェル", +"Sierra Leone":"シエラレオネ", +"Singapore":"シンガポール", +"Slovakia":"スロバキア", +"Slovenia":"スロベニア", +"Solomon Islands":"ソロモン諸島", +"Somalia":"ソマリア", +"South Africa":"南アフリカ", +"South America":"南アメリカ", +"South Georgia and South Sandwich Islands":"サウスジョージア・サウスサンドウィッチ諸島", +"Spain":"スペイン", +"Spider":"スパイダー", +"Spiders":"訪問/訪問者", +"Sri Lanka":"スリランカ", +"Status":"エラー", +"Sudan":"スーダン", +"Sun":"日", +"Sunday":"日曜日", +"Suriname":"スリナム", +"Svalbard and Jan Mayen Islands":"スバールバル諸島・ヤンマイエン島", +"Swaziland":"スワジランド", +"Sweden":"スウェーデン", +"Switzerland":"スイス", +"Syria":"シリア", +"Taiwan":"台湾", +"Tajikistan":"タジキスタン", +"Tanzania":"タンザニア", +"Text file":"テキストファイル", +"Thailand":"タイ", +"There is no data to display":"表示するデータがありません。", +"This Month":"今月", +"Thu":"木", +"Thursday":"木曜日", +"Timor-Leste":"東ティモール", +"Togo":"トーゴ", +"Tokelau":"トケラウ", +"Tonga":"トンガ", +"Top 10 Referrers":"リファラー・トップ10", +"Top 50 Referrers":"リファラー・トップ50", +"Top Bandwidth":"トップ帯域幅の使用", +"Top Entry Pages":"トップ入場数ページ", +"Top Exit Pages":"トップ退出数ページ", +"Top Page Views":"トップページ観覧者数", +"Total":"合計", +"Total Visitors":"アクセス件数の合計", +"Trinidad and Tobago":"トリニダード・トバゴ", +"Tue":"火", +"Tuesday":"火曜日", +"Tunisia":"チュニジア", +"Turkey":"トルコ", +"Turkmenistan":"トルクメニスタン", +"Turks and Caicos Islands":"タークス・カイコス諸島", +"Tuvalu":"ツバル", +"Uganda":"ウガンダ", +"Ukraine":"ウクライナ", +"Unauthorized":"権限外", +"Unique Ratio":"ユニークユーザー比率", +"Unique Visitors":"ユニークユーザー数", +"United Arab Emirates":"アラブ首長国連邦", +"United Kingdom":"イギリス", +"United States Minor Outlying Islands":"米国の領土の島", +"United States of America":"アメリカ", +"Unknown":"不明", +"Uruguay":"ウルグアイ", +"Uzbekistan":"ウズベキスタン", +"Vanuatu":"バヌアツ", +"Vatican City":"バチカン", +"Venezuela":"ベネスエラ", +"Vietnam":"ベトナム", +"Virgin Islands, British":"イギリス領ヴァージン諸島", +"Virgin Islands, U.S.":"アメリカ領ヴァージン諸島", +"Visiting Spiders":"スパイダー", +"Visitors by Continent":"大陸からの訪問者数", +"Visitors by Country":"国", +"Visitors from Africa":"アフリカからの訪問者数", +"Visitors from Asia":"アジアからの訪問者数", +"Visitors from Europe":"ヨーロッパからの訪問者数", +"Visitors from North America":"北アメリカからの訪問者数", +"Visitors from Oceania":"]オセアニアからの訪問者数", +"Visitors from South America":"南アメリカからの訪問者数", +"Visitors per Day":"1日平均アクセス件数", +"Visitors this Month":"今月のアクセス件数", +"Wallis and Futuna Islands":"ウォリス・ フトゥナ諸島", +"Wed":"æ°´", +"Wednesday":"水曜日", +"Week":"週", +"Week Total":"1週間の合計", +"Western Sahara":"西サハラ", +"XML file":"XMLファイル", +"Year":"å¹´", +"Yemen":"イエメン", +"Zambia":"ザンビア", +"Zimbabwe":"ジンバブエ" +} \ No newline at end of file diff --git a/jawstats/languages/pl.js b/jawstats/languages/pl.js new file mode 100755 index 0000000..a4aef13 --- /dev/null +++ b/jawstats/languages/pl.js @@ -0,0 +1,356 @@ +// JAWStats pl translation file +// Last Updated: Sunday, 25th January 2009. 04:11:26 +oTranslation = { +"0 seconds - 30 seconds":"0 sekund - 30 sekund", +"15 minutes - 30 minutes":"15 minut - 30 minut", +"2 minutes - 5 minutes":"2 minuty - 5 minut", +"30 minutes - 1 hour":"30 minut - 1 godzina", +"30 seconds - 2 minutes":"30 sekund - 2 minuty", +"5 minutes - 15 minutes":"5 minut - 15 minut", +"Active Server Page":"Strona ASP", +"Adobe Flash file":"Plik Adobe Flash", +"Adobe Portable Document Format file":"Dokument Adobe Portable", +"Afghanistan":"Afganistan", +"Africa":"Afryka", +"Aland Islands":"Wyspy Alandzkie", +"Albania":"Albania", +"Algeria":"Algieria", +"All Browsers":"Wszystkie przeglądarki", +"All Months":"Miesiące", +"All Operating Systems":"Wszystkie systemy operacyjne", +"All Referrers":"Wszystkie odnośniki", +"American Samoa":"Samoa Amerykańskie", +"Andorra":"Andora", +"Angola":"Angola", +"Anguilla":"Anguilla", +"Antigua and Barbuda":"Antigua i Barbuda", +"Apr":"Kw.", +"April":"Kwiecień", +"Argentina":"Argentyna", +"Armenia":"Armenia", +"Aruba":"Aruba", +"Asia":"Azja", +"Aug":"Sierp.", +"August":"Sierpień", +"Australia":"Australia", +"Austria":"Austria", +"Average":"Średnio", +"Average Size":"Średni rozmiar", +"Azerbaijan":"Azerbejdżan", +"Bad Request":"Nieprawidłowe zapytanie", +"Bahamas":"Bahamy", +"Bahrain":"Bahrajn", +"Bandwidth":"Pasmo", +"Bangladesh":"Bangladesz", +"Barbados":"Barbados", +"Belarus":"Białoruś", +"Belgium":"Belgia", +"Belize":"Belize", +"Benin":"Benin", +"Bermuda":"Bermudy", +"Bhutan":"Bhutan", +"Bolivia":"Boliwia", +"Bosnia and Herzegovina":"Bośnia i Hercegowina", +"Botswana":"Botswana", +"Bouvet Island":"Wyspa Bouveta", +"Brazil":"Brazylia", +"British Indian Ocean Territory":"Brytyjskie Terytorium Oceanu Indyjskiego", +"Browser":"Przeglądarka", +"Browser Families":"Rodziny przeglądarek", +"Browser Family":"Rodzina przeglądarki", +"Browsers":"Przeglądarki", +"Brunei Darussalam":"Brunei", +"Bulgaria":"Bułgaria", +"Burkina Faso":"Burkina Faso", +"Burundi":"Burundi", +"BW":"Pasmo", +"Calendar of Bandwidth Usage":"Kalendarz wykorzystania pasma", +"Calendar of Bandwidth Usage this Month":"Kalendarz wykorzystania pasma w tym miesiącu", +"Calendar of Hits":"Kalendarz żądań", +"Calendar of Hits this Month":"Kalendarz żądań w tym miesiącu", +"Calendar of Page Views":"Kalendarz odsłon stron", +"Calendar of Page Views this Month":"Kalendarz odsłon stron w tym miesiącu", +"Calendar of Visitors":"Kalendarz odwiedzających", +"Calendar of Visitors this Month":"Kalendarz odwiedzających w tym miesiącu", +"Cambodia":"Kambodża", +"Cameroon":"Kamerun", +"Canada":"Kanada", +"Cape Verde":"Republika Zielonego Przylądka", +"Cascading Style Sheet":"Arkusz styli CSS", +"Cayman Islands":"Kajmany", +"Central African Republic":"Republika Środkowoafrykańska", +"CGI script":"Skrypt CGI", +"Chad":"Czad", +"Chile":"Chile", +"China":"Chiny", +"Christmas Island":"Wyspa Bożego Narodzenia", +"Cocos (Keeling) Islands":"Wyspy Kokosowe", +"Code":"Kod", +"Coldfusion script":"Skrypt Coldfusion", +"Colombia":"Kolumbia", +"Comoros":"Komory", +"Congo (Brazzaville)":"Kongo", +"Congo (Kinshasa)":"Demokratyczna Republika Konga", +"Continents":"Kontynenty", +"Cook Islands":"Wyspy Cooka", +"Costa Rica":"Kostaryka", +"Cote d'Ivoire":"Wybrzeże Kości Słoniowej", +"Countries":"Kraje", +"Countries":"Kraje", +"Croatia":"Chorwacja", +"Cuba":"Kuba", +"Cyprus":"Cypr", +"Czech Republic":"Republika Czeska", +"Daily Average":"Średnio dziennie", +"Date":"Data", +"Day":"Dzień", +"Day of Week Average":"Średnia dni tygodnia", +"Day of Week Total":"Podsumowanie dni tygodnia", +"Dec":"Gru.", +"December":"Grudzień", +"Denmark":"Dania", +"Description":"Opis", +"Djibouti":"Dżibuti", +"Dominica":"Dominika", +"Dominican Republic":"Dominikana", +"Ecuador":"Ekwador", +"Egypt":"Egipt", +"El Salvador":"Salwador", +"Entry":"Wejście", +"Equatorial Guinea":"Gwinea Równikowa", +"Eritrea":"Erytrea", +"Estonia":"Estonia", +"Ethiopia":"Etiopia", +"Europe":"Europa", +"Exit":"Wyjście", +"Falkland Islands":"Falklandy", +"Faroe Islands":"Wyspy Owcze", +"Feb":"Luty", +"February":"Luty", +"Fiji":"Fidżi", +"File Archive":"Archiwum", +"File Not Found":"Nie znaleziono pliku", +"File Not Found URLs":"Adresy nieznalezionych plików", +"Filetype":"Typ pliku", +"Filetypes":"Typy plików", +"Finland":"Finlandia", +"Flash Video file":"Plik Flash Video", +"Forbidden":"Zabroniony", +"France":"Francja", +"French Guiana":"Gujana Francuska", +"French Polynesia":"Polinezja Francuska", +"Frequency":"Częstotliwość", +"Fri":"piąt.", +"Friday":"Piątek", +"Gabon":"Gabon", +"Gambia":"Gambia", +"Georgia":"Gruzja", +"Germany":"Niemcy", +"Ghana":"Ghana", +"Gibraltar":"Gibraltar", +"Greece":"Grecja", +"Greenland":"Grenlandia", +"Grenada":"Grenada", +"Guadeloupe":"Gwadelupa", +"Guam":"Guam", +"Guatemala":"Gwatemala", +"Guernsey":"Guernsey", +"Guinea":"Gwinea", +"Guinea-Bissau":"Gwinea Bissau", +"Guyana":"Gujana", +"Haiti":"Haiti", +"Heard and McDonald Islands":"Wyspy Heard i McDonalda", +"Hits":"Żądania", +"Honduras":"Honduras", +"Hong Kong":"Hongkong", +"Hour":"Godzina", +"Hours":"Godziny", +"HTML or XML static page":"Strona statyczna HTML lub XML", +"HTTP Status Codes":"Kody odpowiedzi HTTP", +"Hungary":"Węgry", +"Iceland":"Islandia", +"Icon":"Ikona", +"Image":"Obraz", +"India":"Indie", +"Indonesia":"Indonezja", +"Iran":"Iran", +"Iraq":"Irak", +"Ireland":"Irlandia", +"Isle of Man":"Wyspa Man", +"Israel":"Izrael", +"Italy":"Włochy", +"Jamaica":"Jamajka", +"Jan":"Sty", +"January":"Styczeń", +"Japan":"Japonia", +"JavaScript File":"Plik JavaScript", +"JavaServer Page":"Strona JavaServer", +"Jersey":"Jersey", +"Jordan":"Jordania", +"Jul":"Lip.", +"July":"Lipiec", +"Jun":"Czr", +"June":"Czerwiec", +"Kazakhstan":"Kazachstan", +"Kenya":"Kenia", +"Keyphrase":"Frazy", +"Keyphrases":"Frazy", +"Keyword":"Słowo kluczowe", +"Keywords":"Słowa kluczowe", +"Kiribati":"Kiribati", +"Korea, North":"Korea Północna", +"Korea, South":"Korea Południowa", +"Kuwait":"Kuwejt", +"Kyrgyzstan":"Kirgistan", +"Laos":"Laos", +"Last Visit":"Ostatnia wizyta", +"Latvia":"Łotwa", +"Lebanon":"Liban", +"Lesotho":"Lesotho", +"Liberia":"Liberia", +"Libya":"Libia", +"Liechtenstein":"Liechtenstein", +"Lithuania":"Litwa", +"Luxembourg":"Luksemburg", +"Macau":"Makau", +"Macedonia":"Macedonia", +"Madagascar":"Madagaskar", +"Malawi":"Malawi", +"Malaysia":"Malezja", +"Maldives":"Malediwy", +"Mali":"Mali", +"Malta":"Malta", +"Mar":"Mrz", +"March":"Marzec", +"Marshall Islands":"Wyspy Marshalla", +"May":"Maj", +"May":"Maj", +"Mexico":"Meksyk", +"Microsoft PowerPoint file":"Dokument Microsoft PowerPoint", +"Mon":"pon.", +"Monday":"Poniedziałek", +"Month":"Miesiąc", +"More than 1 hour":"Ponad 1 godzinę", +"Moved Permanently (redirect)":"Trwale przeniesiony (przekierowanie)", +"Moved Temporarily (redirect)":"Tymczasowe przekierowanie", +"MPEG-1 Audio Layer 3 file":"Plik MPEG-1 Audio Layer 3", +"MPEG-4 Audio File":"Plik audio MPEG-4", +"Nigeria":"Nigeria", +"North America":"Ameryka Północna", +"Norway":"Norwegia", +"Nov":"List.", +"November":"Listopad", +"Oceania":"Oceania", +"Oct":"Paź.", +"October":"Październik", +"Oman":"Oman", +"Operating System":"System operacyjny", +"Operating System Families":"Rodziny systemów operacyjnych", +"Operating System Family":"Rodzina systemu operacyjnego", +"Operating Systems":"Systemy operacyjne", +"Other":"Inne", +"Other Browsers":"Inne przeglądarki", +"Other Countries":"Inne kraje", +"Other Filetypes":"Inne typy plików", +"Other Keyphrases":"Inne frazy", +"Other Keywords":"Inne słowa kluczowe", +"Other Operating Systems":"Inne systemy operacyjne", +"Other Referrers":"Inne odnośniki", +"Other Search Engines":"Inne wyszukiwarki", +"Other Spiders":"Inne roboty sieciowe", +"Other Status Codes":"Inne kody HTTP", +"Other URLs":"Inne adresy URL", +"Other Versions":"Inne wersje", +"Other Visitors":"Inny goście", +"Overall":"W sumie", +"Overview":"Podsumowanie", +"Page Views":"Odsłony stron", +"Pages":"Strony", +"Pages":"Strony", +"Pakistan":"Pakistan", +"Panama":"Panama", +"Partial Content":"Część zawartości", +"per Visit":"na wizytę", +"Perl script":"Skrypt Perl", +"Peru":"Peru", +"PHP script":"Skrypt PHP", +"Poland":"Polska", +"Portugal":"Portugalia", +"QuickTime Movie":"Film QuickTime", +"Referrer":"Odsyłacz", +"Referrers":"Odnośniki", +"Referring Domains":"Domeny odsyłające", +"Referring Pages":"Strony odsyłające", +"Referring Search Engines":"Wyszukiwarki odsyłające", +"Romania":"Rumunia", +"Sat":"sob.", +"Saturday":"Sobota", +"Search Engine":"Wyszukiwarka", +"Search Engines":"Wyszukiwarki", +"Sep":"Wrz.", +"September":"Wrzesień", +"Serbia":"Serbia", +"Service Unavailable":"Usługa niedostępna", +"Session Duration":"Trwanie sesji", +"Session Length":"Długość sesji", +"Sessions":"Czasy wizyt", +"Singapore":"Singapur", +"Slovakia":"Słowacja", +"Slovenia":"Słowenia", +"South America":"Ameryka Południowa", +"Spain":"Hiszpania", +"Spider":"Pająk", +"Spiders":"Roboty sieciowe", +"Status":"Kody HTTP", +"Sun":"niedz.", +"Sunday":"Niedziela", +"Sweden":"Szwecja", +"Switzerland":"Szwajcaria", +"Syria":"Syria", +"Taiwan":"Tajwan", +"Text file":"Plik tekstowy", +"Thailand":"Tajlandia", +"The password you entered was incorrect":"Wprowadzone hasło jest niepoprawne", +"There is no data to display":"Brak danych do wyświetlenia", +"This Month":"Ten miesiąc", +"Thu":"czw.", +"Thursday":"Czwartek", +"Top 10 Referrers":"10 najczęstszych odnośników", +"Top 50 Referrers":"50 najczęstszych odnośników", +"Total":"Razem", +"Total Visitors":"Wszystkich gości", +"Tue":"wt.", +"Tuesday":"Wtorek", +"Tunisia":"Tunezja", +"Turkey":"Turcja", +"Ukraine":"Ukraina", +"Unauthorized":"Nieautoryzowany dostęp", +"Unique Visitors":"Unikalni goście", +"United Arab Emirates":"Zjednoczone Emiraty Arabskie", +"United Kingdom":"Wielka Brytania", +"United States of America":"Stany Zjednoczone Ameryki", +"Unknown":"Nieznane", +"URL":"Adres URL", +"Vatican City":"Watykan", +"Venezuela":"Wenezuela", +"Vietnam":"Wietnam", +"Visitors each Month":"Odwiedzający miesięcznie", +"Visitors each Year":"Odwiedzający rocznie", +"Visitors from Africa":"Goście z Afryki", +"Visitors from Asia":"Goście z Azji", +"Visitors from Europe":"Goście z Europy", +"Visitors from North America":"Goście z Ameryki Północnej", +"Visitors from Oceania":"Goście z Oceanii", +"Visitors from South America":"Goście z Ameryki Południowej", +"Visitors over 24 Hours":"Odwiedzający godzinowo", +"Visitors per Day":"Gości dziennie", +"Visitors this Month":"Odwiedzający w tym miesiącu", +"Visits":"Wizyty", +"Waveform Audio file":"Plik audio WAV", +"Wed":"śr.", +"Wednesday":"Środa", +"Week":"Tydzień", +"Week Total":"Tydzień łącznie", +"XML file":"Plik XML", +"Year":"Rok" +} \ No newline at end of file diff --git a/jawstats/languages/sv.js b/jawstats/languages/sv.js new file mode 100755 index 0000000..fc9d0d1 --- /dev/null +++ b/jawstats/languages/sv.js @@ -0,0 +1,494 @@ +// JAWStats sv translation file +// Last Updated: Sunday, 25th January 2009. 04:11:42 +oTranslation = { +"0 seconds - 30 seconds":"0 sekunder - 30 sekunder", +"10th":"10", +"11th":"11", +"12th":"12", +"13th":"13", +"14th":"14", +"15 minutes - 30 minutes":"15 minuter - 30 minuter", +"15th":"15", +"16th":"16", +"17th":"17", +"18th":"18", +"19th":"19", +"1st":"1", +"2 minutes - 5 minutes":"2 minuter - 5 minuter", +"20th":"20", +"21st":"21", +"22nd":"22", +"23rd":"23", +"24th":"24", +"25th":"25", +"26th":"26", +"27th":"27", +"28th":"28", +"29th":"29", +"2nd":"2", +"30 minutes - 1 hour":"30 minuter - 1 timme", +"30 seconds - 2 minutes":"30 sekunder - 2 minuter", +"30th":"30", +"31st":"31", +"3rd":"3", +"4th":"4", +"5 minutes - 15 minutes":"5 minuter - 15 minuter", +"5th":"5", +"6th":"6", +"7th":"7", +"8th":"8", +"9th":"9", +"Active Server Page":"Active Server Page", +"Adobe Flash file":"Adobe Flash-fil", +"Adobe Portable Document Format file":"Adobe Portable Document-fil", +"Aero/Travel domains":"Aero/Travel-domäner", +"Afghanistan":"Afghanistan", +"Africa":"Afrika", +"Aland Islands":"Åland", +"Albania":"Albanien", +"Algeria":"Algeriet", +"All Browsers":"Alla webbläsare", +"All Months":"Alla mÃ¥nader", +"All Operating Systems":"Alla operativsystem", +"All Referrers":"Alla referrers", +"American Samoa":"Amerikanska Samoa", +"Andorra":"Andorra", +"Angola":"Angola", +"Anguilla":"Anguilla", +"Antarctica":"Antarktis", +"Antigua and Barbuda":"Antigua och Barbuda", +"Apr":"apr", +"April":"april", +"Argentina":"Argentina", +"Armenia":"Armenien", +"Aruba":"Aruba", +"Asia":"Asien", +"Aug":"aug", +"August":"augusti", +"Australia":"Australien", +"Austria":"Österrike", +"Average":"Genomsnitt", +"Average Size":"Genomsnittlig storlek", +"Azerbaijan":"Azerbajdzjan", +"Bad Request":"Ogiltig förfrÃ¥gan", +"Bahamas":"Bahamas", +"Bahrain":"Bahrain", +"Bandwidth":"Trafik", +"Bangladesh":"Bangladesh", +"Barbados":"Barbados", +"Belarus":"Vitryssland", +"Belgium":"Belgien", +"Belize":"Belize", +"Benin":"Benin", +"Bermuda":"Bermuda", +"Bhutan":"Bhutan", +"Bolivia":"Bolivia", +"Bosnia and Herzegovina":"Bosnien-Herzegovina", +"Botswana":"Botswana", +"Bouvet Island":"Bouvetön", +"Brazil":"Brasilien", +"British Indian Ocean Territory":"Brittiska territoriet i Indiska oceanen", +"Browser":"Webbläsare", +"Browser Families":"Webbläsare", +"Browser Family":"Webbläsare", +"Browsers":"Webbläsare", +"Brunei Darussalam":"Brunei", +"Bulgaria":"Bulgarien", +"Burkina Faso":"Burkina Faso", +"Burundi":"Burundi", +"BW":"BW", +"Calendar of Bandwidth Usage":"Kalender över genererad trafik", +"Calendar of Bandwidth Usage this Month":"Kalender över genererad trafik denna mÃ¥nad", +"Calendar of Hits":"Kalender över träffar", +"Calendar of Hits this Month":"Kalender över antalet träffar denna mÃ¥nad", +"Calendar of Page Views":"Kalender över antalet sidvisningar", +"Calendar of Page Views this Month":"Kalender över antalet sidvisningar denna mÃ¥nad", +"Calendar of Visitors":"Kalender över antalet besökare", +"Calendar of Visitors this Month":"Kalender över antalet besökare denna mÃ¥nad", +"Cambodia":"Kambodja", +"Cameroon":"Kamerun", +"Canada":"Kanada", +"Cape Verde":"Cape Verde", +"Cascading Style Sheet":"Stilmall", +"Cayman Islands":"Caymanöarna", +"Central African Republic":"Centralafrikanska republiken", +"CGI script":"CGI-skript", +"Chad":"Tchad", +"Chile":"Chile", +"China":"Kina", +"Christmas Island":"Julön", +"Cocos (Keeling) Islands":"Kokosöarna", +"Code":"Kod", +"Coldfusion script":"Coldfusion-skript", +"Colombia":"Colombia", +"Commercial":"Kommersiellt", +"Comoros":"Komorerna", +"Congo (Brazzaville)":"Kongo-Brazzaville", +"Congo (Kinshasa)":"Kongo-Kinshasa", +"Continents":"Kontinenter", +"Cook Islands":"Cooköarna", +"Costa Rica":"Costa Rica", +"Cote d'Ivoire":"Elfenbenskusten", +"Countries":"Länder", +"Countries":"Länder", +"Croatia":"Kroatien", +"Cuba":"Kuba", +"Cyprus":"Cypern", +"Czech Republic":"Tjeckien", +"Daily Average":"Dagligt genomsnitt", +"Date":"Datum", +"Day":"Dag", +"Day of Week Average":"Veckodag/genomsnitt", +"Day of Week Total":"Veckodag/total", +"Dec":"dec", +"December":"december", +"Denmark":"Danmark", +"Description":"Beskrivning", +"Djibouti":"Djibouti", +"Dominica":"Dominica", +"Dominican Republic":"Dominikanska republiken", +"Ecuador":"Ecuador", +"Egypt":"Egypten", +"El Salvador":"El Salvador", +"Entry":"Entré", +"Equatorial Guinea":"Ekvatorialguinea", +"Eritrea":"Eritrea", +"Estonia":"Estland", +"Ethiopia":"Etiopien", +"Europe":"Europa", +"European Union":"Europeiska unionen", +"Exit":"UtgÃ¥ng", +"Falkland Islands":"Falklandsöarna", +"Faroe Islands":"Färöarna", +"Feb":"feb", +"February":"februari", +"Fiji":"Fiji", +"File Archive":"Filarkiv", +"File Not Found":"Filen kunde inte hittas", +"File Not Found URLs":"Filen kunde inte hittas URL", +"Filetype":"Filtyp", +"Filetypes":"Filtyper", +"Finland":"Finland", +"Flash Video file":"Flashvideo", +"Forbidden":"Förbjuden", +"France":"Frankrike", +"French Guiana":"Franska Guyana", +"French Polynesia":"Franska Polynesien", +"French Southern Lands":"Franska sydterritorierna", +"Frequency":"Frekvens", +"Fri":"fre", +"Friday":"fredag", +"Gabon":"Gabon", +"Gambia":"Gambia", +"Georgia":"Georgien", +"Germany":"Tyskland", +"Ghana":"Ghana", +"Gibraltar":"Gibraltar", +"Greece":"Grekland", +"Greenland":"Grönland", +"Grenada":"Grenada", +"Guadeloupe":"Guadeloupe", +"Guam":"Guam", +"Guatemala":"Guatemala", +"Guernsey":"Guernsey", +"Guinea":"Guinea", +"Guinea-Bissau":"Guinea-Bissau", +"Guyana":"Guyana", +"Haiti":"Haiti", +"Heard and McDonald Islands":"Heard- och McDonaldsöarna", +"Hits":"Träffar", +"Honduras":"Honduras", +"Hong Kong":"Hongkong", +"Hour":"Timme", +"Hours":"Tidpunkter", +"HTML or XML static page":"Statisk HTML- eller XML-sida", +"HTTP Status Codes":"HTTP-statuskoder", +"Hungary":"Ungern", +"Iceland":"Island", +"Icon":"Ikon", +"Image":"Bild", +"India":"Indien", +"Indonesia":"Indonesien", +"Info Domains":"Info-domäner", +"Iran":"Iran", +"Iraq":"Irak", +"Ireland":"Irland", +"Isle of Man":"Isle of Man", +"Israel":"Israel", +"Italy":"Italien", +"Jamaica":"Jamaica", +"Jan":"jan", +"January":"januari", +"Japan":"Japan", +"JavaScript File":"JavaScript-fil", +"JavaServer Page":"JavaServer-sida", +"Jersey":"Jersey", +"Jordan":"Jordanien", +"Jul":"juli", +"July":"juli", +"Jun":"juni", +"June":"juni", +"Kazakhstan":"Kazakstan", +"Kenya":"Kenya", +"Keyphrase":"Sökfras", +"Keyphrases":"Sökfraser", +"Keyword":"Sökord", +"Keywords":"Sökord", +"Kiribati":"Kiribati", +"Korea, North":"Nordkorea", +"Korea, South":"Sydkorea", +"Kuwait":"Kuwait", +"Kyrgyzstan":"Kirgizistan", +"Laos":"Laos", +"Last Visit":"Senaste besöket", +"Latvia":"Lettland", +"Lebanon":"Libanon", +"Lesotho":"Lesotho", +"Liberia":"Liberia", +"Libya":"Libyen", +"Liechtenstein":"Liechtenstein", +"Lithuania":"Litauen", +"Local Network Host":"Lokalt nätverk", +"Localhost":"Localhost", +"Luxembourg":"Luxemburg", +"Macau":"Macao", +"Macedonia":"Makedonien", +"Madagascar":"Madagaskar", +"Malawi":"Malawi", +"Malaysia":"Malaysia", +"Maldives":"Maldiverna", +"Mali":"Mali", +"Malta":"Malta", +"Mar":"mar", +"March":"mars", +"Marshall Islands":"Marshallöarna", +"Martinique":"Martinique", +"Mauritania":"Mauretanien", +"Mauritius":"Mauritius", +"May":"maj", +"May":"maj", +"Mayotte":"Mayotte", +"Mexico":"Mexiko", +"Micronesia":"Mikronesien", +"Microsoft PowerPoint file":"Microsoft PowerPoint-presentation", +"Moldova":"Moldavien", +"Mon":"mÃ¥n", +"Monaco":"Monaco", +"Monday":"mÃ¥ndag", +"Mongolia":"Mongoliet", +"Montenegro":"Montenegro", +"Month":"MÃ¥nad", +"Montserrat":"Montserrat", +"More than 1 hour":"Mer än en timme", +"Morocco":"Marocko", +"Moved Permanently (redirect)":"Permanent flyttad (omdirigering)", +"Moved Temporarily (redirect)":"Tillfälligt flyttad (omdirigering)", +"Mozambique":"Mozambique", +"MPEG-1 Audio Layer 3 file":"MPEG-1 Audio Layer 3-fil", +"MPEG-4 Audio File":"MPEG-4 ljudfil", +"Myanmar":"Burma", +"Name domains":"Name-domäner", +"Namibia":"Namibia", +"NATO":"NATO", +"Nauru":"Nauru", +"Nepal":"Nepal", +"Netherlands":"Nederländerna", +"Netherlands Antilles":"Nederländska Antillerna", +"Network":"Nätverk", +"New Caledonia":"Nya Kaledonien", +"New Zealand":"Nya Zealand", +"Nicaragua":"Nicaragua", +"Niger":"Niger", +"Nigeria":"Nigeria", +"Niue":"Niue", +"Non-Profit Organisations":"Icke-kommersiella organisationer", +"Norfolk Island":"Norfolkön", +"North America":"Nordamerika", +"Northern Mariana Islands":"Nordmarianerna", +"Norway":"Norge", +"Not Viewed":"Ej visad", +"Nov":"nov", +"November":"november", +"Oceania":"Oceanien", +"Oct":"okt", +"October":"oktober", +"Old style Arpanet":"Arpanet", +"Oman":"Oman", +"Operating System":"Operativsystem", +"Operating System Families":"Operativsystem", +"Operating System Family":"Operativsystem", +"Operating Systems":"Operativsystem", +"Other":"Övrigt", +"Other Browsers":"Övriga webbläsare", +"Other Countries":"Övriga länder", +"Other Filetypes":"Övriga filtyper", +"Other Keyphrases":"Övriga sökfraser", +"Other Keywords":"Övriga sökord", +"Other Operating Systems":"Övriga operativsystem", +"Other Referrers":"Övriga referrers", +"Other Search Engines":"Övriga söktjänster", +"Other Spiders":"Övriga spindlar", +"Other Status Codes":"Övriga statuskoder", +"Other URLs":"Övriga adresser", +"Other Versions":"Övriga versioner", +"Other Visitors":"Övriga besökare", +"Overall":"Totalt", +"Overview":"Översikt", +"Page Views":"Sidvisningar", +"Pages":"Sidor", +"Pages":"Sidor", +"Pakistan":"Pakistan", +"Palau":"Palau", +"Palestine":"Palestina", +"Panama":"Panama", +"Papua New Guinea":"Papua Nya Guinea", +"Paraguay":"Paraguay", +"Partial Content":"Ofullständigt innehÃ¥ll", +"per Visit":"per besök", +"Perl script":"Perlskript", +"Peru":"Peru", +"Philippines":"Filippinerna", +"PHP script":"PHP-skript", +"Pitcairn":"Pitcairnöarna", +"Poland":"Polen", +"Portugal":"Portugal", +"Puerto Rico":"Puerto Rico", +"Qatar":"Qatar", +"QuickTime Movie":"QuickTime-video", +"Referrer":"Referrer", +"Referrers":"Referrers", +"Referring Domains":"Refererande domäner", +"Referring Pages":"Refererande sidor", +"Referring Search Engines":"Refererande söktjänster", +"Reunion":"Réunion", +"Romania":"Rumänien", +"Russian Federation":"Ryssland", +"Rwanda":"Rwanda", +"Saint Barthelemy":"Saint-Barthélemy", +"Saint Helena":"Sankta Helena", +"Saint Kitts and Nevis":"Saint Kitts och Nevis", +"Saint Lucia":"Saint Lucia", +"Saint Martin (French part)":"Saint Martin", +"Saint Pierre and Miquelon":"Saint-Pierre och Miquelon", +"Saint Vincent and the Grenadines":"Saint Vincent och Grenadinerna", +"Samoa":"Samoa", +"San Marino":"San Marino", +"Sao Tome and Principe":"São Tomé och Príncipe", +"Sat":"lör", +"Satellite Provider":"Satellitleverantör", +"Saturday":"lördag", +"Saudi Arabia":"Saudiarabien", +"Search Engine":"Söktjänst", +"Search Engines":"Söktjänster", +"Senegal":"Senegal", +"Sep":"sep", +"September":"september", +"Serbia":"Serbien", +"Service Unavailable":"Tjänsten är otillgänglig", +"Session Duration":"Sessionslängder", +"Session Length":"Längd", +"Sessions":"Sessioner", +"Seychelles":"Seychellerna", +"Sierra Leone":"Sierra Leone", +"Singapore":"Singapore", +"Slovakia":"Slovakien", +"Slovenia":"Slovenien", +"Solomon Islands":"Salomonöarna", +"Somalia":"Somalia", +"South Africa":"Sydafrika", +"South America":"Sydamerika", +"South Georgia and South Sandwich Islands":"Sydgeorgien och Sydsandwichöarna", +"Spain":"Spanien", +"Spider":"Spindel", +"Spiders":"Spindlar", +"Sri Lanka":"Sri Lanka", +"Status":"Statuskoder", +"Sudan":"Sudan", +"Sun":"sön", +"Sunday":"söndag", +"Suriname":"Surinam", +"Svalbard and Jan Mayen Islands":"Svalbard och Jan Mayen-öarna", +"Swaziland":"Swaziland", +"Sweden":"Sverige", +"Switzerland":"Schweiz", +"Syria":"Syrien", +"Taiwan":"Taiwan", +"Tajikistan":"Tadzjikistan", +"Tanzania":"Tanzania", +"Text file":"Textfil", +"Thailand":"Thailand", +"The password you entered was incorrect":"Det angivna lösenordet var felaktigt", +"There is no data to display":"Det finns ingen data att visa", +"This Month":"Denna mÃ¥nad", +"Thu":"tor", +"Thursday":"torsdag", +"Timor-Leste":"Östtimor", +"Togo":"Togo", +"Tokelau":"Tokelauöarna", +"Tonga":"Tonga", +"Top 10 Referrers":"Referrers 10 i topp", +"Top 50 Referrers":"Referrers 50 i topp", +"Top Bandwidth":"Mest genererad trafik", +"Top Entry Pages":"Populära entrésidor", +"Top Exit Pages":"Populära utgÃ¥ngssidor", +"Top Page Views":"Flest sidvisningar", +"Total":"Totalt", +"Total Visitors":"Totalt antal besökare", +"Trinidad and Tobago":"Trinidad och Tobago", +"Tue":"tis", +"Tuesday":"tisdag", +"Tunisia":"Tunisien", +"Turkey":"Turkiet", +"Turkmenistan":"Turkmenistan", +"Turks and Caicos Islands":"Turks- och Caicosöarna", +"Tuvalu":"Tuvalu", +"Uganda":"Uganda", +"Ukraine":"Ukraina", +"Unauthorized":"Ej auktoriserad", +"Unique Ratio":"Andel unika", +"Unique Visitors":"Unika besökare", +"United Arab Emirates":"Förenade arabemiraten", +"United Kingdom":"Storbritannien", +"United States Minor Outlying Islands":"Förenta staternas avlägset belägna öar", +"United States of America":"USA", +"Unknown":"Okänd", +"URL":"URL", +"Uruguay":"Uruguay", +"USA Educational":"USA/utbildning", +"USA Military":"USA/militär", +"Uzbekistan":"Uzbekistan", +"Vanuatu":"Vanuatu", +"Vatican City":"Vatikanstaten", +"Venezuela":"Venezuela", +"Vietnam":"Vietnam", +"Virgin Islands, British":"Brittiska Jungfruöarna", +"Virgin Islands, U.S.":"Amerikanska Jungfruöarna", +"Visiting Spiders":"Besökande spindlar", +"Visitors by Continent":"Besökare per kontinent", +"Visitors by Country":"Besökare per land", +"Visitors each Month":"Besökare varje mÃ¥nad", +"Visitors each Year":"Besökare varje Ã¥r", +"Visitors from Africa":"Besökare frÃ¥n Afrika", +"Visitors from Asia":"Besökare frÃ¥n Asien", +"Visitors from Europe":"Besökare frÃ¥n Europa", +"Visitors from North America":"Besökare frÃ¥n Nordamerika", +"Visitors from Oceania":"Besökare frÃ¥n Oceanien", +"Visitors from South America":"Besökare frÃ¥n Sydamerika", +"Visitors over 24 Hours":"Besökare per dygn", +"Visitors per Day":"Besökare per dag", +"Visitors this Month":"Besökare denna mÃ¥nad", +"Visits":"Besök", +"Wallis and Futuna Islands":"Wallis- och Futunaöarna", +"Waveform Audio file":"Waveljudfil", +"Wed":"ons", +"Wednesday":"onsdag", +"Week":"Vecka", +"Week Total":"Veckototal", +"Western Sahara":"Västsahara", +"within Family":"inom familjen", +"XML file":"XML-fil", +"Year":"År", +"Yemen":"Yemen", +"Zambia":"Zambia", +"Zimbabwe":"Zimbabwe" +} \ No newline at end of file diff --git a/jawstats/languages/translations.php b/jawstats/languages/translations.php new file mode 100755 index 0000000..ea4b202 --- /dev/null +++ b/jawstats/languages/translations.php @@ -0,0 +1,362 @@ + "de-de", + "name" => "Deutsch", + "translations" => array( + "[DAYS] days ago" => "Vor [DAYS] Tagen", + "[HOURS]h [MINUTES]m ago" => "Vor [HOURS]h [MINUTES]m", + "[MINUTES] mins ago" => "Vor [MINUTES] Minten", + "1 day ago" => "Vor einem Tag", + "1 min ago" => "Vor einer Minute", + "1st" => "Erster", + "2nd" => "Zweiter", + "3rd" => "Dritter", + "All Months" => "Alle Monate", + "An error has occured" => "Es ist ein Fehler aufgetreten", + "April" => "April", + "At least one file required by JAWStats has been deleted, renamed or corrupted." => "Eine Datei, die von JAWStats benötigt wird, wurde gelöscht, umbenannt oder ist beschädigt.", + "August" => "August", + "Browsers" => "Browser", + "Cancel" => "Abbrechen", + "Cannot find required file [FILENAME]" => "Die Datei [FILENAME] wurde nicht gefunden", + "Change Language" => "Sprache ändern", + "Change Month" => "Monat ändern", + "Change Site" => "Seite ändern", + "Countries" => "Länder", + "December" => "Dezember", + "February" => "Februar", + "Filetypes" => "Dateitypen", + "Friday" => "Freitag", + "Hours" => "Stunden", + "January" => "Januar", + "JAWStats cannot find it's configuration file, [CONFIG]. Did you successfully copy and rename the [CONFIGDIST] file?" => "JAWStats findet die Konfigurationsdatei [CONFIG] nicht. Haben Sie den Inhalt der Datei [CONFIGDIST] korrekt in die Datei [CONFIG] kopiert?", + "JAWStats could not open an AWStats log file" => "JAWStats kann die Log-Datei von AWStats nicht öffnen", + "July" => "Juli", + "June" => "Juni", + "Keyphrases" => "Suchaudrücke", + "Keywords" => "Stichwörter", + "Last updated [DAYNAME], [DATE] [MONTH] [YEAR] at [TIME] [ELAPSEDTIME]. A total of [TOTALVISITORS] visitors ([UNIQUEVISITORS] unique) this month, an average of [DAILYAVERAGE] per day ([DAILYUNIQUE] unique)." => "Zuletzt aktualisiert [DAYNAME], [DATE] [MONTH] [YEAR] um [TIME] [ELAPSEDTIME]. Insgesamt [TOTALVISITORS] Besuche ([UNIQUEVISITORS] individuelle Besucher) diesen Monath, durchschnittlich [DAILYAVERAGE] ([DAILYUNIQUE]) pro Tag.", + "March" => "März", + "May" => "Mai", + "Monday" => "Montag", + "No AWStats Log Files Found" => "Keine AWStats Log-Dateien gefunden", + "No individual AWStats configurations have been defined." => "Es wurde keine individuelle AWStats Konfigurationsdatei definiert.", + "November" => "November", + "October" => "Oktober", + "Operating Systems" => "Betriebssystem", + "Pages" => "Seiten", + "Please enter the password to update this site" => "Bitte geben sie das Passwort zum aktualisieren der Seite ein", + "Please refer to the [LINKSTART]installation instructions[LINKEND] for more information." => "Bitte lesen Sie die [LINKSTART]Installations Anweisungen[LINKEND] für mehr Informationen.", + "Please select the month you wish to view" => "Bitte wählen sie den Monat den sie sich ansehen möchten", + "Please select the site you wish to view" => "Bitte wählen sie die Seite die sie sich ansehen möchten", + "Please select your language" => "Bitte wählen sie ihre Sprache", + "Powered by [AWSTART]AWStats[END]. Made beautiful by [JAWSTART]JAWStats Web Statistics and Analytics[END]." => "Erstellt durch [AWSTART]AWStats[END]. Verschönert durch [JAWSTART]JAWStats Web Statistics and Analytics[END].", + "Referrers" => "Herkünfte", + "Saturday" => "Samstag", + "September" => "September", + "Sessions" => "Sitzungen", + "Spiders" => "Spiders", + "Statistics for [SITE] in [MONTH] [YEAR]" => "Statistiken für [SITE] in [MONTH] [YEAR]", + "Status" => "Status", + "Sunday" => "Sonntag", + "The variable [VARIABLE] is missing or invalid." => "Die Variable [VARIABLE] ist nicht definiert oder ist ungültig.", + "There is an error in [FILENAME]" => "Es ist ein Fehler in der Datei [FILENAME] aufgetreten.", + "This Month" => "Aktueller Monat", + "Thursday" => "Donnerstag", + "Tuesday" => "Dienstag", + "Update" => "Aktualisieren", + "Update Site" => "Seite aktualisieren", + "Wednesday" => "Mittwoch", + ) + ); + + $g_aTranslation[] = array( + "code" => "fr", + "name" => "Français", + "translations" => array( + "[DAYS] days ago" => "Il y a [DAYS] jours", + "[HOURS]h [MINUTES]m ago" => "Il y a [HOURS]h[MINUTES]mins", + "[MINUTES] mins ago" => "Il y a [MINUTES] mins", + "1 day ago" => "Il y a un jour", + "1 min ago" => "Il y a 1 min", + "All Months" => "Tous les mois", + "An error has occured" => "Une erreur s'est produite", + "April" => "Avril", + "At least one file required by JAWStats has been deleted, renamed or corrupted." => "Au moins un fichier requis par JAWStats a été effacé, renommé ou corrompu.", + "August" => "Août", + "Browsers" => "Navigateurs", + "Cancel" => "Annuler", + "Cannot find required file [FILENAME]" => "Le fichier requis [FILENAME] n'a pu être retrouvé", + "Change Language" => "Changer de langue", + "Change Month" => "Changer de mois", + "Change Site" => "Changer de Site", + "Countries" => "Pays", + "December" => "Décembre", + "February" => "Février", + "Filetypes" => "Type de fichier", + "Friday" => "Vendredi", + "Hours" => "Heures", + "January" => "Janvier", + "JAWStats cannot find it's configuration file, [CONFIG]. Did you successfully copy and rename the [CONFIGDIST] file?" => "JAWStats ne peut retrouver son fichier de configuration [CONFIG]. Avez-vous copier ou renommer avec succès le fichier [CONFIGDIST]?", + "JAWStats could not open an AWStats log file" => "JAWStats n'a pu ouvrir un fichier log de AWStats", + "July" => "Juillet", + "June" => "Juin", + "Keyphrases" => "Phrases clés", + "Keywords" => "Mots clés", + "Last updated [DAYNAME], [DATE] [MONTH] [YEAR] at [TIME] [ELAPSEDTIME]. A total of [TOTALVISITORS] visitors ([UNIQUEVISITORS] unique) this month, an average of [DAILYAVERAGE] per day ([DAILYUNIQUE] unique)." => "Dernière mise à jour le [DAYNAME] [DATE] [MONTH] [YEAR] à [TIME] [ELAPSEDTIME]. +Un total de [TOTALVISITORS] visiteurs (dont [UNIQUEVISITORS] unique) ce mois, une moyenne de [DAILYAVERAGE] par jour (soit[DAILYUNIQUE] visiteurs uniques).", + "March" => "Mars", + "May" => "Mai", + "Monday" => "Lundi", + "No AWStats Log Files Found" => "Aucun fichier log d'AWStats n'a été trouvé", + "No individual AWStats configurations have been defined." => "Aucune configuration individuelle de AWStats n'a été définie", + "November" => "Novembre", + "October" => "Octobre", + "Operating Systems" => "Système d'exploitation", + "Pages" => "Pages", + "Please enter the password to update this site" => "Veuillez entrer le mot de passe pour mettre à jour le site", + "Please refer to the [LINKSTART]installation instructions[LINKEND] for more information." => "Merci de vous référer aux [LINKSTART] instructions d'installation[LINKEND] pour plus d'informations", + "Please select the month you wish to view" => "Veuillez choisir le mois que vous souhaitez consulter", + "Please select the site you wish to view" => "Veuillez choisir le site que vous souhaitez consulter", + "Please select your language" => "Veuillez choisir votre langue", + "Powered by [AWSTART]AWStats[END]. Made beautiful by [JAWSTART]JAWStats Web Statistics and Analytics[END]." => "Propulsé par [AWSTART]AWStats[END]. Embelli par [JAWSTART]JAWStats Analyses et Statistiques Web[END].", + "Referrers" => "Referrers", + "Saturday" => "Samedi", + "September" => "Septembre", + "Sessions" => "Sessions", + "Spiders" => "Robot d'indexation", + "Statistics for [SITE] in [MONTH] [YEAR]" => "Statistiques pour [SITE] du [MONTH][YEAR]", + "Status" => "Statut", + "Sunday" => "Dimanche", + "The data file being looked for is [FILE] in folder [FOLDER]" => "Le fichier de données recherché est [FILE] dans [FOLDER]", + "The problem may be the variable [VARIABLE] in your [CONFIG] file." => "Le problème peut provenir de la variable [VARIABLE] dans votre fichier [CONFIG]", + "The variable [VARIABLE] is missing or invalid." => "La variable [VARIABLE] est manquante ou invalide", + "There is an error in [FILENAME]" => "Il y a une erreur dans [FILENAME]", + "This Month" => "Ce mois", + "Thursday" => "Jeudi", + "Try changing the folder to [FOLDER]" => "Essayez en changeant le dossier par [FOLDER]", + "Tuesday" => "Mardi", + "Update" => "Mettre à jour", + "Update Site" => "Mettre à jour", + "Wednesday" => "Mercredi", + ) + ); + + $g_aTranslation[] = array( + "code" => "pl", + "name" => "Polski", + "translations" => array( + "All Months" => "Miesiące", + "An error has occured" => "Wystąpił błąd", + "April" => "Kwiecień", + "At least one file required by JAWStats has been deleted, renamed or corrupted." => "Przynajmniej jeden plik niezbędny dla JAWStats został usunięty, przemianowany lub popsuty", + "August" => "Sierpień", + "Browsers" => "Przeglądarki", + "Cancel" => "Anuluj", + "Cannot find required file [FILENAME]" => "Brak niezbędnego pliku [FILENAME]", + "Change Language" => "Zmień język", + "Change Month" => "Zmień miesiąc", + "Change Site" => "Zmień witrynę", + "Countries" => "Kraje", + "December" => "Grudzień", + "February" => "Luty", + "Filetypes" => "Typy plików", + "Friday" => "Piątek", + "Hours" => "Godziny", + "January" => "Styczeń", + "JAWStats cannot find it's configuration file, [CONFIG]. Did you successfully copy and rename the [CONFIGDIST] file?" => "JAWStats nie może odczytać pliku konfiguracyjnego [CONFIG]. Czy plik [CONFIGDIST] został poprawnie skopiowany i przemianowany?", + "JAWStats could not open an AWStats log file" => "JAWStats nie może otworzyć plików z danymi AWStats.", + "July" => "Lipiec", + "June" => "Czerwiec", + "Keyphrases" => "Frazy", + "Keywords" => "Słowa kluczowe", + "Last updated [DAYNAME], [DATE] [MONTH] [YEAR] at [TIME] [ELAPSEDTIME]. A total of [TOTALVISITORS] visitors ([UNIQUEVISITORS] unique) this month, an average of [DAILYAVERAGE] per day ([DAILYUNIQUE] unique)." => "Ostatnia aktualizacja [DAYNAME], [DATE] [MONTH] [YEAR] o [TIME] [ELAPSEDTIME]. Łącznie [TOTALVISITORS] gości ([UNIQUEVISITORS] unikalnych) w tym miesiącu, średnio [DAILYAVERAGE] dziennie ([DAILYUNIQUE] unikalnych).", + "March" => "Marzec", + "May" => "Maj", + "Monday" => "Poniedziałek", + "No AWStats Log Files Found" => "Brak plików z danymi AWStats", + "November" => "Listopad", + "October" => "Październik", + "Operating Systems" => "Systemy operacyjne", + "Pages" => "Strony", + "Please enter the password to update this site" => "Proszę podać hasło w celu aktualizacji danych statystyk", + "Please select the month you wish to view" => "Proszę wybrać miesiąc, który chcesz zobaczyć", + "Please select the site you wish to view" => "Proszę wybrać witrynę, której statystyki chcesz zobaczyć", + "Please select your language" => "Proszę wybrać swój język", + "Powered by [AWSTART]AWStats[END]. Made beautiful by [JAWSTART]JAWStats Web Statistics and Analytics[END]." => "Statystyka generowana przez [AWSTART]AWStats[END]. Pięknie zaprezentowana przez [JAWSTART]JAWStats Web Statistics and Analytics[END].", + "Referrers" => "Odnośniki", + "Saturday" => "Sobota", + "September" => "Wrzesień", + "Sessions" => "Czasy wizyt", + "Spiders" => "Roboty sieciowe", + "Statistics for [SITE] in [MONTH] [YEAR]" => "Statystyki dla [SITE] w okresie [MONTH] [YEAR]", + "Status" => "Kody HTTP", + "Sunday" => "Niedziela", + "There is an error in [FILENAME]" => "W pliku [FILENAME] jest błąd", + "This Month" => "Ten miesiąc", + "Thursday" => "Czwartek", + "Tuesday" => "Wtorek", + "Update" => "Aktualizuj", + "Update Site" => "Aktualizuj dane", + "Wednesday" => "Środa", + ) + ); + + $g_aTranslation[] = array( + "code" => "sv", + "name" => "Svenska", + "translations" => array( + "[DAYS] days ago" => "[DAYS] dygn sedan", + "[HOURS]h [MINUTES]m ago" => "[HOURS]h [MINUTES]m sedan", + "[MINUTES] mins ago" => "[MINUTES] min sedan", + "1 day ago" => "1 dygn sedan", + "1 min ago" => "1 min sedan", + "10th" => "10", + "11th" => "11", + "12th" => "12", + "13th" => "13", + "14th" => "14", + "15th" => "15", + "16th" => "16", + "17th" => "17", + "18th" => "18", + "19th" => "19", + "1st" => "1", + "20th" => "20", + "21st" => "21", + "22nd" => "22", + "23rd" => "23", + "24th" => "24", + "25th" => "25", + "26th" => "26", + "27th" => "27", + "28th" => "28", + "29th" => "29", + "2nd" => "2", + "30th" => "30", + "31st" => "31", + "3rd" => "3", + "4th" => "4", + "5th" => "5", + "6th" => "6", + "7th" => "7", + "8th" => "8", + "9th" => "9", + "All Months" => "Alla mÃ¥nader", + "An error has occured" => "Ett fel uppstod", + "April" => "april", + "At least one file required by JAWStats has been deleted, renamed or corrupted." => "En eller flera filer som JAWStats är beroende av har tagits bort, döpts om eller blivit förstörda.", + "August" => "augusti", + "Browsers" => "Webbläsare", + "Cancel" => "Avbryt", + "Cannot find required file [FILENAME]" => "Den nödvändiga filen [FILENAME] hittades inte", + "Change Language" => "Ändra sprÃ¥k", + "Change Month" => "Byt mÃ¥nad", + "Change Site" => "Byt webbplats", + "Countries" => "Länder", + "December" => "december", + "February" => "februari", + "Filetypes" => "Filtyper", + "Friday" => "fredag", + "Hours" => "Tidpunkter", + "Is the specified AWStats log file directory correct? Does it have a trailing slash?" => "Är den angivna sökvägen till mappen med AWStats loggfiler korrekt? Slutar sökvägen med ett snedstreck?", + "January" => "januari", + "JAWStats cannot find it's configuration file, [CONFIG]. Did you successfully copy and rename the [CONFIGDIST] file?" => "JAWStats kan inte hitta sin konfigurationsfil [CONFIG]. Har du verkligen kopierat och döpt om filen [CONFIGDIST]?", + "JAWStats could not open an AWStats log file" => "JAWStats kunde inte öppna en av AWStats loggfiler", + "July" => "juli", + "June" => "juni", + "Keyphrases" => "Sökfraser", + "Keywords" => "Sökord", + "Last updated [DAYNAME], [DATE] [MONTH] [YEAR] at [TIME] [ELAPSEDTIME]. A total of [TOTALVISITORS] visitors ([UNIQUEVISITORS] unique) this month, an average of [DAILYAVERAGE] per day ([DAILYUNIQUE] unique)." => "Senast uppdaterad [DAYNAME], [DATE] [MONTH] [YEAR] kl. [TIME] [ELAPSEDTIME]. Totalt [TOTALVISITORS] besökare ([UNIQUEVISITORS] unika) denna mÃ¥nad, genomsnittligen [DAILYAVERAGE] per dag ([DAILYUNIQUE] unika).", + "March" => "mars", + "May" => "maj", + "Monday" => "mÃ¥ndag", + "No AWStats Log Files Found" => "Inga loggfiler frÃ¥n AWStats hittades", + "No individual AWStats configurations have been defined." => "Ingen individuell konfiguration för AWStats har definierats.", + "November" => "november", + "October" => "oktober", + "Operating Systems" => "Operativsystem", + "Pages" => "Sidor", + "Please enter the password to update this site" => "Ange ditt lösenord för att uppdatera denna webbplats", + "Please refer to the [LINKSTART]installation instructions[LINKEND] for more information." => "Se [LINKSTART]installationsmanualen[LINKEND] för mer information.", + "Please select the month you wish to view" => "Välj den mÃ¥nad som du önskar visa", + "Please select the site you wish to view" => "Välj vilken webbplats du önskar visa", + "Please select your language" => "Välj ditt sprÃ¥k", + "Powered by [AWSTART]AWStats[END]. Made beautiful by [JAWSTART]JAWStats Web Statistics and Analytics[END]." => "Baserad pÃ¥ [AWSTART]AWStats[END]. Snyggats till av [JAWSTART]JAWStats Web Statistics and Analytics[END].", + "Referrers" => "Referrers", + "Saturday" => "lördag", + "September" => "september", + "Sessions" => "Sessioner", + "Spiders" => "Spindlar", + "Statistics for [SITE] in [MONTH] [YEAR]" => "Statistik för [SITE] [MONTH] [YEAR]", + "Status" => "Statuskoder", + "Sunday" => "söndag", + "The data file being looked for is [FILE] in folder [FOLDER]" => "Den eftersökta datafilen är [FILE] i mappen [FOLDER]", + "The problem may be the variable [VARIABLE] in your [CONFIG] file." => "Problemet kan vara variabeln [VARIABLE] i filen [CONFIG]", + "The variable [VARIABLE] is missing or invalid." => "Variabeln [VARIABLE] saknas eller är felaktig.", + "There is an error in [FILENAME]" => "[FILENAME] är felaktig", + "This Month" => "Denna mÃ¥nad", + "Thursday" => "torsdag", + "Try changing the folder to [FOLDER]" => "Prova att ändra mappen till [FOLDER]", + "Tuesday" => "tisdag", + "Update" => "Uppdatera", + "Update Site" => "Uppdatera webbplats", + "Wednesday" => "onsdag", + ) + ); + + $g_aTranslation[] = array( + "code" => "jp", + "name" => "日本語", + "translations" => array( + "[DAYS] days ago" => "[DAYS]数日前", + "All Months" => "月", + "An error has occured" => "エラーが発生しました:", + "April" => "4月", + "At least one file required by JAWStats has been deleted, renamed or corrupted." => "少なくともJAWStatsに必要なファイルが削除されたか、改名されたか、破壊されました。", + "August" => "8月", + "Browsers" => "ブラウザ", + "Cancel" => "キャンセル", + "Change Month" => "月の変更", + "Change Site" => "サイトの変更", + "Countries" => "国", + "December" => "12月", + "February" => "2月", + "Filetypes" => "ファイル", + "Friday" => "金曜日", + "Hours" => "時間", + "January" => "1月", + "JAWStats could not open an AWStats log file" => "JAWStatsがAWStatsログファイルを開く事が出来ませんでした。", + "July" => "7月", + "June" => "6月", + "Keyphrases" => "キーフレーズ", + "Keywords" => "キーワード", + "March" => "3月", + "May" => "5月", + "Monday" => "月曜日", + "No AWStats Log Files Found" => "AWStatsログファイルが見つかりませんでした。", + "No individual AWStats configurations have been defined." => "特定のAWStats構成を定められませんでした。", + "November" => "11月", + "October" => "10月", + "Operating Systems" => "オペレーティングシステム", + "Please select the month you wish to view" => "参照したい月の選択", + "Referrers" => "リファラー", + "Saturday" => "土曜日", + "September" => "9月", + "Sessions" => "セッション", + "Spiders" => "訪問/訪問者", + "Statistics for [SITE] in [MONTH] [YEAR]" => "[SITE] のアクセス分析 [MONTH][YEAR]", + "Status" => "エラー", + "Sunday" => "日曜日", + "The variable [VARIABLE] is missing or invalid." => "変数 [VARIABLE] が欠けているか無効です。", + "There is an error in [FILENAME]" => "[FILENAME]にエラーが見つかりました。", + "This Month" => "今月", + "Thursday" => "木曜日", + "Tuesday" => "火曜日", + "Update Site" => "サイトの更新", + "Wednesday" => "水曜日", + ) + ); + +?> \ No newline at end of file diff --git a/jawstats/readme.txt b/jawstats/readme.txt new file mode 100755 index 0000000..2ae9a60 --- /dev/null +++ b/jawstats/readme.txt @@ -0,0 +1,2 @@ +JAWStats Installation guide can be found at: +http://www.jawstats.com/documentation \ No newline at end of file diff --git a/jawstats/swf/bar_graph.swf b/jawstats/swf/bar_graph.swf new file mode 100755 index 0000000000000000000000000000000000000000..280fa6391cdb8a52f5538e98e114b704f056cadb GIT binary patch literal 22280 zcmV(oK=HprS5pYJl>h*Eob0@JR8!m5H#`#vB@_V(RghjnZ&CzL=nw@%Na!FUSP&Ey zkYd>&C|y({sGtx*Q|O8!MFR>dHc&u7;Q)dHHbk+XbKV{AQ|>wUd!KQ??~Z%N`Nn-1 zgMW7BUUROwX8Fyv=Gq8g!$<(3JP^l#i!`8r&e-43Kbeeu02s)?2(90_Wql01hZ)Qq zW+~Pcdl}0Vs1hu}HR3+weiAAZx-RriNI+OtSWmc9_?_@x5ogieqQ8jV#0!gk7P}|@ zM%+-sOJci3p@hEV^(9!TE~$0W&!r`0Ol6+SNGw%dny|ETY3tIjOP9;G$Z8Ru6H?_i z$!EyV$}1?OD0C})RnS*-RSZ(xtyrwcR=lcMr(~tvqU^rx(K20?ITc6M2-Od`2 zk>#VyBh)^s?N#qkKcVqn!(TH~^O2^U)_$!ft?k-r+V(nUb-HzCb;NZ|bg8-tx+S`; zx?{Q+JuN+Vy=c9By?VVzdLQ)^_3ic7>8I;g>EF_SsV_-1BhrYwi6@Ee#Brj4fsTQm z0o6d-@U3Bq(OV-aW3tIslarXKh{%Za2<;8qH%Nh$1Y4-U{Xr|`QR2Oo4RWK^jql%HzY{7q zFSd*aE4TkLl(wxOlemtB5>9M3N=yB0em3+{`74rqbim5bUqVLZH;dhN55~Toh|W(O zInV&1?C`gfxLxt6rAbL-i7#KLej)5ipW&!wXz%CIuG=ccJ>2-d-4Tmz2k#|+a(a`z zutnUsTQ^zaXAkFaUJf)qD`GQ-H6A!eU-Ff> zx|3R%k(-Ri4vCS=JN*x~07xG5S)14pjO=jJAX z{VAIaD`%X%{jT^*3pU(UAb8rOq>T@ZM$EerKZ-pazt?*n6S779kv+|gO~X;PVZR

3cdHn{Yl}r|E#{ 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 literal 0 HcmV?d00001 diff --git a/jawstats/swf/line_graph.swf b/jawstats/swf/line_graph.swf new file mode 100755 index 0000000000000000000000000000000000000000..d68aafcba4268cac7f85661d64812811fd9047bf GIT binary patch literal 22516 zcmV(oK=HprS5pYkmH+^Fob0@JR8!m5H#`#vB@_V(RghjnZ&CzL=nw@%Na!FUSP&Ey zkYd>&C|y({sGtx*Q|O8!MFR>dHc&u7;Q)dHHbk+XbKV{AQ|>wUd!KQ??~Z%N`Nn-1 zgMW7BUUROwX8Fyv=Gq8g!$<(3JP^l#i!`8r&e-43Kbeeu02s)?2(90_Wql01hZ)Qq zW+~Pcdl}0Vs1hu}HR3+weiAAZx-RriNI+OtSWmc9_?_@x5ogieqQ8jV#0!gk7P}|@ zM%+-sOJci3p@hEV^(9!TE~$0W&!r`0Ol6+SNGw%dny|ETY3tIjOP9;G$Z8Ru6H?_i z$!EyV$}1?OD0C})RnS*-RSZ(xtyrwcR=lcMr(~tvqU^rx(K20?ITc6M2-Od`2 zk>#VyBh)^s?N#qkKcVqn!(TH~^O2^U)_$!ft?k-r+V(nUb-HzCb;NZ|bg8-tx+S`; zx?{Q+JuN+Vy=c9By?VVzdLQ)^_3ic7>8I;g>EF_SsV_-1BhrYwi6@Ee#Brj4fsTQm z0o6d-@U3Bq(OV-aW3tIslarXKh{%Za2<;8qH%Nh$1Y4-U{Xr|`QR2Oo4RWK^jql%HzY{7q zFSd*aE4TkLl(wxOlemtB5>9M3N=yB0em3+{`74rqbim5bUqVLZH;dhN55~Toh|W(O zInV&1?C`gfxLxt6rAbL-i7#KLej)5ipW&!wXz%CIuG=ccJ>2-d-4Tmz2k#|+a(a`z zutnUsTQ^zaXAkFaUJf)qD`GQ-H6A!eU-Ff> zx|3R%k(-Ri4vCS=JN*x~07xG5S)14pjO=jJAX z{VAIaD`%X%{jT^*3pU(UAb8rOq>T@ZM$EerKZ-pazt?*n6S779kv+|gO~X;PVZR

3cdHn{Yl}r|E#{ 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 literal 0 HcmV?d00001 diff --git a/jawstats/swf/pie.swf b/jawstats/swf/pie.swf new file mode 100755 index 0000000000000000000000000000000000000000..1432477efd704e7531179d2f3620ee279954ac93 GIT binary patch literal 4265 zcmV;a5LWL)S5pW`BLDz+oUNJNQ`Bdc#~=9pq#FTk0l^n!x_MD!8p3-AA%up;mklo# zp;Y!_k`A=eTLc(Dg{@R37jAYhTqC9BIw4bTcEB>#v%8s!YZ6QXi4KezhMkLC?A7jH zuv^*MWTOJjp7UuMiEb)e)^hRX^m)$nJ?DGQ^Zb6;j+n&%FedYeF{ueAu*JwvW8%un z%JbHz8;$v^y@}PPrT=s|)YuyyFav}A!~Mgf10mBr7(8<<)O|8!dP99DhkMMc{ij16 z{iY=-cJP%U(-jK$ny&sKGZgMKuY^v9`woPAdrfb+Ps6%S4H6#e>&88FcsTT`In~!4 zIw1kwW~ifoIM{0{E2}HZN{rvz;BE8><$O}gu~zcXTh$J?rs|x=pPCXhs;3#88h^=L2(I}&~&~K8a2Z`;UUu-d?nOt zUK$=5Hp3wSDR?+I9PaNkFO8U&MvdcgqH&rW#e`PH#PdF5944#KB##*9sM#{4rNwG+ z1qZv##z86M)R1wEw#SUEU3BD_b=fv{qSI=wzO!CX!-R^8<^V>|6+ zN22)c1gG7eec3X$!#b=n8;xYPH~wXUab#<>7@2XyiW_#^NQxVq<3>i@NRJzv;znxR zNQ)aO*_V@z?Q$eYCC&{fPiohad&F~6%Skiwj}q?sq3|Mcq+NEH^(&6{SXt5tm%TYH zro&~D%<7Mw>A0cWQiL;U(UV-ittilu8dJGGY|9UXNe@zty?HH=a{o0!D@=}W`re*L z>T|Z!=+uL;rs+)9B~4LTKgy8|hXamu>eMBFhBMg#hV?5JiT}oqX+A4R_ zBiypp@grO1kZmz`s=dihvC|xOtQo1&45@3w5!&#JMDtDbk!z7c10Rkg!I{>c-KNBw zasv8mGxue$cFpN>ZrP>3H#yV!o#D*n_f}^Xzq6g&cEz?T%C%fK2oBCgTl6`%J9oqs z#Nu|g?^170+?%o9yDRS9y5`+vDBhVH`}GqR+@fRCYGXW)E(lNFS|L=L?{wv?HL~D2 zQWdTXk&nB-|8dXS$6BS`1NrtWDdH(-9-(`4 z)E_&6^zSJge;V&vwuwbQbf@f+S$?%5lXLD%I`D5}&sYDl{qJO5c$1CuX`Y47eL0UE zl~nDX)9ctS&RCP4CMfY?P*HozBioAGsrDIXVGc%#b9c_VGMnX(fJ5ocTIg1jz3Tto z;B~3c#5pwL>70YBRI$%q`7DauKN1w{&aSooZZ(ecszhNepR_YY17f``0iQvogHwYe zk&EHX&UqpZ&l-o6m$x>>Sb2GLBAeRE0OxooOh9ZXg0+8J+KU3D0z&v8jS>m1KM zba+JF-C;zqOHhyz% z(QP`+*{Iuef^S;t83QkYvM~KVNm-hc+5DL{lcd9Y2oyn zGvFw=-R*jCK>iHe_T2$f3~CL{!sA?ShNl^xX5mrn1V>rj?moA8L?X{dj|jv2-yRVL zMZd(fqoQ5*Djow>Q3vrIWb80SlB?u}QQ=n%u^N_)M}=AKL1IpUqu}e7bNQICom)I6 zY-gj#giY=J*nXp{K`?|TEOR|3Y-$gJr@&FuymCy~&PF@wLnnRf6wd4SI_X}gaGqQ2 zq{2=r>=aI2RqdU^srCT=pJAUO{xtZyb?3neb3&L;$aG#y7^LPwsvQ*1y~NYvaXmOK z9@m32te#MRJ>_@3eE|hlbGJ+^VS7x zBI&#}CNbx&OW+l2WbwQ;j(rvT8u*^&T{>_51O9)M4xhJvV|{Y(y!9cTkMT@le*#Xk zdK;VtzqG!x&Rg?hza`n-(YK^FcXZ6sTQG)-F;tA9Vhj~ys2D@V7%Ik4F@}mUOK-$Q z%WJ&fU9^h93sz6kMNxG9-bGQQI1YYnU0Av(H4KPXGhQO&B{E);j7P+y884CRiZGmw zUXfVEaZo#UMOJ&4-&`n9zbeOr2>cmuo%egu97PJ_3>S@1464=xCf zQ`d)Lyl`mXfk&bRMMPZV{&?=s(ane4Bu z8JXs51AOVE+^LhgN~?)iX08r$y~grH2#JA6>l-{?>9!{4DkytG^@iOX~SOZ1b%CLF`FX zOrmVbfFD@{(d)va_HA$$ zybI2Q3xe-)gWlr?MbIAME=N!oL0trO5!6Lc7eQSFbrIA>P!~a61YHqyMbH&NR|H)V zbVbk=;Vwteb;G(PHQ$gE^_AcqaL)SU@=a0q&V!qhiSHL-M4lsaYgL;N2} zB{wCb+Ed`C#7q-EgMAzO4)!eeU2q;;5d4T5rnrMs+`%dC;1qXoiaR*P9h~A0PFY`o zx4~KPE;tYBO}r&+GlIVXZ-AeH)8H4<`CG!E_HV6J!C9&Qmhh-&9{dCT1+hO9wm&X^ zCTxl~z?F_iio)ONkqBFv&coUokzW{H8v*2BDLGW|f zK8Njd*zUk{2cA1po8nDy8vFvh4bFmhL1mkTZ5Fm!*k-A14!v{eokQ;&dgo9&htfHe z&Y^TpI2Gr?1;M*8--Y=u%y(g)$3KsM9{)W41^f&67w|9Ow`{Me{cp=I1|#O32bO&c z%yd^olkM&9nfn_B-+AD&Gwth%E<4+Ht+?!+_I!fN&b2F|F8e2VJlJ{m%zc-gZ@;$W zvJ33v%PxBlo+4ID?5~Z>ZoqD2R{&27Y}?%aSpLE!cpk5xWUIh^I~L3_6@ahcoDK1|80jsuVN9Y^f?k>KR$guyaIX zhE%1tNAhNnF+;kio-(k4U6tUocxu2}@Hw!K)q3nk>=&?`!B(&>R)fqsQ&fL#GDWr8 zd+fk+rtOo7X9|z{8)ZgYsdKCC7hPG*D2p?Y#f-9~dtaL@;h9g!l3pp6;Hk8iB&LoS z?NT!0iM(6I9S^vw| zZke^>ep3;3%dAHh-S+F2+B$JJ6L$;0#%n*_%-t<>S5Gb;54N6pH`(1Na#Mqw>~7I@ zeAz8E%-na2y4S>C2ez=r#$q~ zV^_&cJ#;M3)_?Wn*~MVQytb4lN)`34N9vs@RZrQ zw^Fj_$$3_LKUl+REq0wK&9k4!t|!tDHiAv~4}&j&&0s6oMvR{Ge5w59Z}X*cMV(PT z_2*0dJ%T!^d?uAID%7Jh%BOGnJS+04Kc8n>J}UC%>?!Kq%(u(grE|&WhUQD(G~UPR zv#eI**^gaAOfB|vU>%<4vFkxUo+j)A;34oZ*b27AYIeI;3YdEVQz)SF0-5s2Vu4J# zXQ_ZQTp*PP#9t$;g=j29T_I1xLNpeN#(<#S+(MqEyE!wvWoq*YPjM=q;>oa&XVgC4 z6kf7>Idxt+1IL%WoB^*?5)eBFe=g_&^XzZF^K!Pmyf3_*I(Lzg3JR?l~h%Pt|Fe#MLdU#Ihn=6^V(7|x4T#vdc@9U)dOmmim9ZSTTm>V zYS)0uRw8p$)VEj(PqPxa5f#x=>4sZS<4a}ku9Z@$MA64;4gOkeKmJDS0Ctn)D&?(F zYX1q?g1=2-%7odqQYL3iu>!0Ft3V%EBiYNSu#9*Z)RJr7;h?b+GT(YR`Bc=ws4)lY%w?cR-q7^(pE2*%Or(z|wRieF;Syb|ttfXU= zqF4Q@w~FU>6;Ig)Y0ua>Z#+6PzOW3#JdGG zvR)zs%k@Oo6IoAW{c5Ck)z2CBQ-hzL_^GOar)~pJ-3CrY182U0{xrz0>xm6i(m;P2 z=uZPRH_F~`zH5}dinokqm*h2qXsI8UwRwmm@WGfwLC9;*sR_ggF{roBYyub~* zzzw>7(p1jJQ#r&LPj%&GQdNb;;7s z%j@anI)&4gzTAbv@uRup@b2oC%kwyR(&*>rXPn*o`uY%9#5!rl!^+bRNWAv<_37#8 zXRG4x?(L_v%JTB^?(FQMuf_ZN_w4HF+1S^4zVTI#%#o)S$}hfUw@V(&amJzpA>|D`&}orpd*~ z%K!iWA^8LW002J#EC2ui01p5U000Jyz@Kn9m<)!IYgMl2A zozU)qAfvoUk>@11sBADFKQt2tE;c+C7BdtSCI%!VA2c*N5;zPD zH5>p93N#-=5IrmaHykMk4g?cv1vm~7B?l!p1%OBpJ`Dg7Ejd0TRUirl0R;*mRYF%J MM#)4mUr0d!JGQ8{rvLx| literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/firefox.gif b/jawstats/themes/default/browsers/firefox.gif new file mode 100755 index 0000000000000000000000000000000000000000..399da01ceb6bf19c8fa1ed7ac834c7d7fc1c96b7 GIT binary patch literal 381 zcmV-@0fPQVNk%w1VGjTg0M$PLpQN3!b}?pRXqmFhDO--H6czpb{>V!t*mx)M(pz1T zr=nIx&ccG(a3SM%CH1*6>8*t!Ax!Y<-TTKm*0r+H&ok9p19$6+YDH5Pff!?mAuxqE@~?eE&&>Op;^+TrVeEFI$A)BF1Q)1W@? zeIc@=H|ewyhK6v$b1n1o_4xYx$gN8M(H(-s+^oOXujTFA#GvZMpKGqsHiW}#w#Rb5 z-2eaoA^8LW002J#EC2ui01p5U000J>z@KnPED{Z<+u&w07!4WB#)jJo0IMTJpcsj4 zK1CoQ8Lldh76{P$U0fhcXNk%w1VGjTg0M$PL{py=cJS~fDP|C@)`_gT2S}3Wco0N%h=H}+cyte%J z>izxvv3C&vyF>JGGXM9px}1vt+Y0~Gj^x|NW-lJ$;NOsTGX2X3|Fs&pt)BhI8_LSb zsFHa9raFof7rv)l zb7b#~JJ-aK|L}a?&#BOsL;vzg)~s0nxOe~j^?zd-*{m_ieh2??1jc+s|4l&jXJqW@ z-v9sqA^8LW002J#EC2ui01p5U000J>> zEe9q;2`nr*9-$Ng1_v8M6&eu?d?FWZ2L?nk7ZJ4)s{#@NBts(%8W^xm%Js+F_F=XC`uqFF)#;1Q{pIE4|NHi`+xyPV*L=D5 z+Sb~gvDNba{=>n^?d|VdwEqTE;P&?TrQrUn)%vjE{o&r=qr>Zar03`7>13qzah2er zzvw}9+$B}u&*JF+BzZB@YoV4n;>NDJ29xJ_IHk02fE1Har;;Fa{9;G6hBl3kM$o r9Ssc~009aBMLr+_0U#$eGXN^r01LYmKO+koA4&=~QwJKkNkITRxgg3n literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/libwww.gif b/jawstats/themes/default/browsers/libwww.gif new file mode 100755 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/lotusnotes.gif b/jawstats/themes/default/browsers/lotusnotes.gif new file mode 100755 index 0000000000000000000000000000000000000000..fb48b9f8c733aa4441130729eb163b6ba1f1726f GIT binary patch literal 399 zcmV;A0dW3DNk%w1VGjTg0M$PL=-bTw{Qc|W)%mhm`pJj*-lz1`c>L$7^5ezk)TH&c zN$b>>`nhTRYy$eJSpVUQ`r2yzcm?{E68Xe&>gC`3*ID?aIQH}N`+6hww>bF1TKDqo z@Y}rY*RS>Mk#&=SIY literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/mozilla.gif b/jawstats/themes/default/browsers/mozilla.gif new file mode 100755 index 0000000000000000000000000000000000000000..39c07f08404e27c7ad0f9d081e2d65be206d0176 GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGjTg0M$PLF*-X%NJ^8Jm^KUwvJwF7?d@?|S=rgy`}_N3W@e`o z0+N(BJ=8UX(o00aXB7zqfj4gd@h65|&D z=jZ4D902n2@?#i5^>iF#F2KkTCKQV7MQmv( zl?Z{r7+eG+VTyH;_$m{|W1+}2OS=F@(Ref(3lbY07BM6(D+4|o5fwfZ7Z(dCJ|`Rr z8Uzh;eGC#91285YE?;jO3^Nfp3=uK{KLr648$KNj03aR*5CuXa2@;MQ5(h{;Gz$(l RBwR>82Py_N&(%Xg06W}TgV_K8 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/msie.gif b/jawstats/themes/default/browsers/msie.gif new file mode 100755 index 0000000000000000000000000000000000000000..6b304b177a88cb2511ba42031055943245f8983e GIT binary patch literal 390 zcmV;10eSvMNk%w1VGjTg0M$PLQ>gRp?e2$?xjBm7OMJ+@$mHMO+jXVa=k4_YN4Ye2 z%6XR3hq>`4Ys6!=^hu7_DtXlY{{E-6*SW;d;MmxzwaQe6$CaVQ#>?CD_4-Sc9|dal|oXyg!4`9%aIsxXkU;Cq$AIc~sF zg45*T>|U47|McdcvfXQfzr4K5%GBhNpVdosyxQXNx4GTZ+u_mP?)v)rY?aDpkka}0 z`2YX^A^8LW002J#EC2ui01p5U000J~z@KnPycG&2;xL0k;VzSkPD!dQt};wyMF)c^nh literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/netscape.gif b/jawstats/themes/default/browsers/netscape.gif new file mode 100755 index 0000000000000000000000000000000000000000..cb10ebafda4ee7efc8fc1f2622e527f43f732ef6 GIT binary patch literal 377 zcmV-<0fzoZNk%w1VGjTg0M$PLT8WRau&_F!sS^_vI%#sHrly{|yLGm;*4EZjU}Qmi zh5r8jXJ%%Gii&jD*HTkcw&>>W?(TE1t$LQ62LuHzD=W&%%Y>+_^78WI>+CjOW*Sac zG;w+P`T35qy>6D8=I7`DB`p^@L4JUMmB7EfzrXSM_mPyA-|z4rQ(R%5pkj@bkgu`h z_xD+#pd%w9b8>Ri-{5tNk%Pg&ncdrKr>x`R;$!+d z#YSlIQ2;(HLdY@%iBbR)fTJ*IQaGOQwjlsWF#rlI3IrP;ALMRS9C@~E^Fb$14dOr%Pyp6uG%23qu$c0|PG=6)yt}y+jxd X3=hr>0kK63AP5!+7|BiBLO}pKzb2h+ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/omniweb.gif b/jawstats/themes/default/browsers/omniweb.gif new file mode 100755 index 0000000000000000000000000000000000000000..1635fb2e915dd71b09c74776b2c4b019e4e34c64 GIT binary patch literal 378 zcmV-=0fqiYNk%w1VGjTg0M$PLuGlCtm++?a`_a|n#QOZr*2rne@{+8cnxo+`mIM9% z{^aZRAZwOSta(qC3Q(<1SI+tA{{ICQkO&TNaq0aMD#lp5#*6CyCT|28a`5u=^D;;< zmehVATV4=g<4UkA5klR&#_T+lt!$HvsJ^{CXg`A8+GNk2zu((NRnuO%_u1g#zTwzM ze*o_A^!5Ds`T6)hn>5z>Bs_tYaC4eRtiODLz31rYX1rA6_3VYghjGDZfX$_WmjGkH z=KufyA^8LW002J#EC2ui01p5U000J;z@KnPEEZj>g;HVs!ALP33uQRKii(2+$I0ac zjmK4}81z1$-76wEB}l`?$nh`{2m%VPG1CY`3^hI%0v8kz761S%LI@r;Dh37+5CI%A z00n;_B0D|-pcyy-4w^qMDIEzP0UjA13=AE9LIV;Q7%?*-ycKXn2pbqJB^4DCHcUh? Y2OAU56EtH)3JORA12@V|+(JPBJBS#gP5=M^ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/opera.gif b/jawstats/themes/default/browsers/opera.gif new file mode 100755 index 0000000000000000000000000000000000000000..3a6b1f36fe8f3d0192bcc953074dad3525150886 GIT binary patch literal 379 zcmV->0fhcXNk%w1VGjTg0M$PLxC#U5Mn~4x)%m8U``g>_wYdKM{n>47;qv{ZvC;eW z^{Yxu)w;T}$l~JW?bqJzz8VyqrpWB3r|6fM*EcrK*5~}h$I~e&mzc8hu(0&?`SJe$(ZIj> z(a@N(+}a=?)|sUFadnMFO_E}7@895)dzAK&j$$$k%i90{ z|NsC0A^8LW002J#EC2ui01p5U000Jr~ z6j71p(S>}z9RQGO4tbWr1kD0KFjwIyq>D+=0uT@sEk7L&6&x2YFbF;yCl?er4hazr z9D+M8H$4~u0TvYz5jS5D1tc0MDIOUFBRvrbIcqjPBsBv#DPjhr8ZrO@3Jwby5@JIt Z4-GRA7lRWDP6jIu3=A7?PTfC206RlYu}}a2 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/otherbrowsers.gif b/jawstats/themes/default/browsers/otherbrowsers.gif new file mode 100755 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/safari.gif b/jawstats/themes/default/browsers/safari.gif new file mode 100755 index 0000000000000000000000000000000000000000..310a8a6bc6447eb151c94ea037b4a9f8759481d5 GIT binary patch literal 386 zcmV-|0e${QNk%w1VGjTg0M$PLg@lA_$Ml?;mx6tFbZl(5wzOAQSF+aZ^78W4)znC- z?Ee1#bDO|%k-Rpl=0S?edx)lpiI2s^!;7cMt-9FV-QAg}w8_iLT$|2Ytl39 zgtB*ooT7Vxj>hSmSwh+1;<;W-)z{a1wBW|h(ucj;own61VyujqwM(YbN3z~rp~&aw z=KufyA^8LW002J#EC2ui01p5U000J`z@JbU+AN01#7Ck#24;=!29Tpxb3>g7D4lo3nKMMc?HyI8N3M2tEBYl1<1qT7XB{C{3 gNhTw+HWvaa9b`fu5e5bX05sM^Ar&SxA7nuQJAP}ZKL7v# literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/unknown.gif b/jawstats/themes/default/browsers/unknown.gif new file mode 100755 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/browsers/wget.gif b/jawstats/themes/default/browsers/wget.gif new file mode 100755 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/changemonth/first.gif b/jawstats/themes/default/changemonth/first.gif new file mode 100755 index 0000000000000000000000000000000000000000..9d816ad2574a4fe24cf8ccc3dec0e199cfd48f86 GIT binary patch literal 117 zcmZ?wbhEHb9~Kprkylt)Q4^b(oLf>J5*{8998^?U7Zw@i z7Z^}d)5rh@ia%Mvv<`>_nZdxKRG{njGGnsRA_MQn3nkrwCK=@m)|^^4<7O47!lbLq LJf?~=GFSru5i=x& literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/changemonth/first_on.gif b/jawstats/themes/default/changemonth/first_on.gif new file mode 100755 index 0000000000000000000000000000000000000000..93e696a6d4ec8143199027b82bc1785a0c46c5f6 GIT binary patch literal 117 zcmZ?wbhEHb!i%DeaPzkdB% zSW@g481Vo9e+Dp6{K*2QbwDJ@39~Kprkylt)Q4^b(oLf>J5*{8998^?U7Zw@i z7Z^}d)5rh@ia%Mvv<`>_nZdxKT(H6NdJxOSt0BUUhYI2@i?C&`bKgEIw{qD!hK`hN Lrb4EAf(+IGE+Zq7 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/changemonth/last_on.gif b/jawstats/themes/default/changemonth/last_on.gif new file mode 100755 index 0000000000000000000000000000000000000000..e07ecfbe2f7462b9a9eaf6bd07453553c99730cf GIT binary patch literal 118 zcmZ?wbhEHb!i%DeaPzkdB% zSW@g481Vo9e+Dp6{K*2QbwDJ@3J5*{89926E6Ra9A5 zQq$-c7{CAqia%Mvv<`>_nZdv!AF$Q)w$h3yGp9w|%3{Yvx*jc@^FndMl9P<{J2NL; Ib78Os0Gg~LjsO4v literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/changemonth/next_on.gif b/jawstats/themes/default/changemonth/next_on.gif new file mode 100755 index 0000000000000000000000000000000000000000..d694142617b0cdbde4a2412f6db91314d94e4e7b GIT binary patch literal 114 zcmZ?wbhEHb@-o1OrPaF@6jF>!i%DeaPi_1#C ze*OCY|9`*000uBn{K*2QbwDJ@3J5*{89926E6Ra9A5 zQq$-c7{CAqia%Mvv<`>_nZdxKu;JuQk=%|oGY=(1CyV&()No&^=d`Nn(vG47;(j-M IH3b>00ov6g%K!iX literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/changemonth/prev_on.gif b/jawstats/themes/default/changemonth/prev_on.gif new file mode 100755 index 0000000000000000000000000000000000000000..b9a8e372884b1747c72741f75be2e948506384c6 GIT binary patch literal 115 zcmZ?wbhEHb@-o1OrPaF@6jF>!i%DeaPi_1#C ze*OCY|9`*000uBn{K*2QbwDJ@37#Qm$ zB&f9J_V!($tK;oCIQ#o}?d>T0`)!t_;nc5ru)FHewutjcNcHtl$p8S!x>NI3P38aq zUUJmBrF!#PT9l#P?(ReFLPFR80Hd$vS8UWRNWPJu-?qQ(>C<7Js_4pNny+2sd`ao z&-3wbA^8LV00000EC2ui01yBR000J%z!hgm5*Uv(+Gfc)IVprF;qeFrJf2N+F-kom zzZm0UvDiGK=BS~IR4S7k*=Ep)NEEgt(hHze19UAGB0dy45+)22C@wcF1}zF9B0LL; z1uz{hI0!P52@V)93nm2x7aa(z5DEzi1{gadr!@mC85s}|uL&&}C2SuB3}XWzAP$kg RI|t4OGtmIk7}eE506T1-p$-55 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ae.gif b/jawstats/themes/default/flags/ae.gif new file mode 100755 index 0000000000000000000000000000000000000000..78d15b67dcba8937b13dd3a4514037af411e38b0 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h{#{)FXaLsM)&N)l07n4){QUF)02US&L_|bQwM{!a zJ1#CRQnykxG&K7~MF4vM{#jZ7dwc$OclrPT?f?J)bO8HGNevAR^78Wg`}@(+(fm(O z`aM1TR8;{7Oq@ zz-9buYW-7FAt514OG{zCU`Vq_{&I8u008sz^ZNSw`1ttw`T6(v_w@Ai_4W1k_V)h( z00000A^8LV00000EC2ui01yBR000JtK%dZ8dps(YfO5bj_#zRHBt&hsWTg=!;f$OB z5N%?XN|`>NnbQOA6bhMJ4yWt!dV-n+(jmd+bap#Dc{DE@EOB#nJUccj8Z|T<77l=n zju<-{6E2k;i-I;77&aiC4jdc}3nDNu2L~4y3qJ-YCo3H&F$f3>3Jt8a2E`Nn2%x z*e)ma?d|GgUfMJ*;#5wpU2^H5pXC4me0OEedwMwl0Kvb2w=Fw?004up-P^%bgn)75 znVGe-Ym9$Uj(dB5Z#G7R%u$crhciH4k<0CYeBZx4Wny4moZreMBhqK1`Xu~6I^ zV1mz)AV^<}%Vie>(<}uCucDHiBm%+1HK+W={*92I(D{i^@+;so| zRIAVK01}EvipKwjichuW0048F%I#yL(PX{m{gRegoX&i(*{xWCU7*mff}Com)BpfG zGK0ndBboN*r#gkiP?gI^k;y)Z$NId%)XLm&snlkm&w;bs?}3Qrlb!#?%J_(o@AUcq zt+48#s{g94G=IbS+~ro4$6B7xk(<4+kg5PKqAh^LT86lYsLr0T(npcU-;|;E;+Dy5 ziPBVUA^8LV00000EC2ui01yBR000J#K*Hg0xf~k4PKUvSI1#bMNU%^vEEYpaqme*< zFN$NlLYXR>EJmUrkVX_r%T=2NScL*>rZ^OIJSh?A6Z8;wq83-~oAR!(A z2_69oHYXAoGZls*A`_+$AR8SPprQjIq#_RwHv_5`p`#5VA21vo2qCHlT3w&HAg?LB(9j#x(?I|`wXLLC literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/al.gif b/jawstats/themes/default/flags/al.gif new file mode 100755 index 0000000000000000000000000000000000000000..c44fe0a0aec913b8667d8d4f97acb82bb5b33db5 GIT binary patch literal 370 zcmZ?wbhEHb6kyz3*}0WNQQnvVdvF@dpO9#693UzcW`aWZ|>R$Cbv9v>Zj zRafpT1H&yhiwBXux0xBPnW*0JvAA zyIK1a6Z5xF`pJP4pI&E-JAhTIwFxZ(2F);`!Bq4Wte13okgB~V^5PN-pf{h*p zAteG86(=ezEhsMpAT$_0Jer-Kp`)c3rxy$`FghC>92^n5A|eY59}El+!~wgvzV&T?|aJ3FiQL`3`h z`_}*fy1U{404(+O_3Z!vAt9Xr0Cq%0u~byK{7g*uFfjHiD)l5J`9D8TPqy~<_WMUi z;o;%v=jYws-QVBe<>lq$Dk%YNlCM|w%ym)?La`QHa4b+iq7-%^Y{1n`1ttC%gg%u`ttJf`T6<&{{Hdt z@&Et-A^8LV00000EC2ui01yBR000J!K%Y=}dKe#_4k*O=_#~nZLK!| literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ao.gif b/jawstats/themes/default/flags/ao.gif new file mode 100755 index 0000000000000000000000000000000000000000..8c854fa1084eb333de9df427f96983a28cf4e35c GIT binary patch literal 244 zcmZ?wbhEHb6ky+^Ctb=TzxAm zD>E~*kIgX~pw=%k)gc|Ao`~`SG%K%Jl$* z-r4N-Dzo>~)6@R`{sEio;qv?T_VyE}@Al(K)#>w#)Ax+l{F&PMqu%_G)%W`P`sMci z^YioH@%e+!^Z<D}-6A+PhVGu49(E0Y`USYuTe9rimz0Ujl`@h=fpTgCg+xq(Jb)Mb)3#0Az_4WMx z{PgtnA^8LV00000EC2ui01yBR000Jyz?WfY2pItY1_Py%s0^uSYCy%5cDc)H^#~0> z;6T7)IUHiNMCH+PZQi31q|-T(77G&2&ge>OT369R@m9Ep65 z8VE8n2!|XTKMgl9a&&fh6sf5-3_E6M39$sTGcySa3?*4x85I>Q9v%h53II$JJP*nu MA|D?L&>uknJCLTx^#A|> literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/as.gif b/jawstats/themes/default/flags/as.gif new file mode 100755 index 0000000000000000000000000000000000000000..d776ec2711bcd6ff8f0451188b0d3c739c309e70 GIT binary patch literal 365 zcmV-z0h0blNk%w1VGsZd0M!5hRaEwDEp<;cvh zmg&=GczFE-1N~@c`kMd%Y#p=i+=i}ivibS>_Vx7WjD6^Ue7Tf#+fG92l$7$Pp!)If z0RZgw%*BU?{gY2F>dj8UqI{sBo&W%!m2%IZQ?T#W%Cmn}&{}ieU|-a1ec)YD`Q+Tb z004VpPuE2}qKtt60O91|;+lr(@aV!rLGuFu0DJ%fyH|#HRm|hs(;*@M@Z_)f@#z2n z`4JKSA^8LV00000EC2ui01yBR000Jxz};{7Yxs`H(XG|`1)fiX)Ii8&G#!|e!F4z! zs)6NTQe0eH21#YHXnGUH=@Sw;32hB)!k1s@2oM==8+?2b6bUi{bsRGi76TO>6cZFY z5eXqWB0dHV0691*D-|Xb3m_m7ody7}H8l_gFBlaG2{fG^9$j9qB`7Nc2c1V8$jC9v LF(WoN4?zGsMO>ji literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/at.gif b/jawstats/themes/default/flags/at.gif new file mode 100755 index 0000000000000000000000000000000000000000..87e1217365c869c8bf2fa6a35cd597108dbe47c5 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h`uh6#`1tGq0P_F<`ZYEEqN4V4a`#J1_V)JrL`3v6 zGxFNCd z0RI30A^8LV00000EC2ui01yBR000Jtz@PBvEBa2zfl?s&HJ+0Rj=?aEP&Ce=+0bZe zF&it9SP&GXEujEwK_IJ7NOm)nGM`5;mGba-F8}}m0T&lN4j_AefP#bwhKP!cfr9}E z4i_7UGdTqj5pi>McNiElDkmmoW+XZ;6%``07O7V>9a<6+6ch>y78W~715Cyb$SNv3 H%s~J<(#ocW literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/au.gif b/jawstats/themes/default/flags/au.gif new file mode 100755 index 0000000000000000000000000000000000000000..5269c6a0e0a2c5ff0554266d9fdb854c5e8c2807 GIT binary patch literal 378 zcmV-=0fqiYNk%w1VGsZd0M!5hthUorYNpAFmH;h|$9IETa;%q+vf+)8=jrf|D@Z|H zod5tb002@WL5j)H;s5{=<7sHLz0`J#yGmoCo2knH0%eb#!f1W6HBp!Grld`4sybGg zi*}uDfwPsQ#=67WMPHtAg}5+Hlu2TrK3SXAW@_hgZ|Ka?-NVdvJ!zq$!lkm%e~Gu{ z-R7UU+uf|Qvx1nUkgSJ)r?+v3=()aYMRnfc>)>y2ws2+)GW3#LM5@q^ivc z3EsHAA^8LV00000EC2ui01yBR000J;K!R+LNDNZ5ijpy6EEc<5>(xW)0Fuy!=U5dM zz5@;dG2Kc9&Ex{W1QrQe28YWWU;)a6gaLFGEGH@g0xmx>6dxZL77-B(H3kPCM3J(k+1vUs2B&Z?{ARY}Qx>_DQ Yq5-4|5jGYZx(rTFPY>D;4ckEgI~~rLTmS$7 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/aw.gif b/jawstats/themes/default/flags/aw.gif new file mode 100755 index 0000000000000000000000000000000000000000..27fdb4d13906897b572573cf0364bb72d800054b GIT binary patch literal 365 zcmV-z0h0blNk%w1VGsZd0M!5hVy@I}wAfRm&H!$=eY@L?#Ns-Z#*@h7^4~=A+$(ao z+WhWz06LcW*Z@PD$p9&oS*g-$v)5g!(faFb`{`8xSE~8uOZMVC0DQavW3K>8n)&Ht z4Ti$^=34gSQsQoIPNB?(!QOVd+upGNg1_EXrq4;9%K%uj0CTkyip2m(sT+~W^x{gM z#NB4F)enlq06n7UiHUr_;Bd9rXs^>~vDg3~h5PDU27$ly-!xdL&>@k>Tc^(eGL-k@ zLtd-XA^8LV00000EC2ui01yBR000Jxz+GyU;&5;n3<@>KWGb0gD|V&_xBzzL_Kr{{KP*w!!KXxD{01P+XD|HEL{k zjt)FM4GT9E6c!df7Z*7Rs0bqiB$aC=m<|TB0ydo!6B`>H9UdMmEC|A@87C(dDk?BA L3_TCe&p`k?K;@jA literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ax.gif b/jawstats/themes/default/flags/ax.gif new file mode 100755 index 0000000000000000000000000000000000000000..0ceb6849f49d128216572e9fa7d9b6318090c31b GIT binary patch literal 376 zcmV-;0f+uaNk%w1VGsZd0M!5h?7K+=N~&j+%0+m&{TK{}s@VA2hVsK$H*K~jXt|NH z*!$9ZbezokXJve&((W`Y_FGi|B$ogHY}Rc6>$pGw08Ri6i#&3*p1k7uuoGU5$|z#4 z05+msio*PRbWwx8{gjVZg~j`IZy#d4OMbrm+m-ZEN$tT}^TuWQ#Bcb`Z1>`#>&s@^ z003f-#r)x&X_C?H(Rm(Qt;<;e^k`r3(rfm*VENB=?Mg!PNkdP8!|Aa!@k2cHz9{g% zPS1@1A^8LV00000EC2ui01yBR000J+z{F_SBV+;r4kr?^I1`xY3RF@Q3JwQDAdrkO zSA%E4fC)4q9Z4gBhDEontMefZI+EVYU|2L#DkujBJ^&Oa69gb0A`J}?5GFZ150yAA z86^uhDiAh8Z0J0uLubnGBOtx99ax8G$$0b#*@te literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/az.gif b/jawstats/themes/default/flags/az.gif new file mode 100755 index 0000000000000000000000000000000000000000..d771618498ded597d5d95979e455fa797e77c0cc GIT binary patch literal 370 zcmV-&0ge7gNk%w1VGsZd0M!5hG_KcFw{-xD#p8>NNwwNmx!VAJ0NiwR0Biu&Vqwip zOaM;+E~Zu5Yiu^ETmW~t(_38SmzV%D07tWGlK=qTdwV^wV#`ED^V-|$xVX?#Q2=DD zSH9tA!QLC9M*vu;a>n9b!Q*<$8VuqG3ax&5B2k|~b7DarE_DPRAqW#ad>9cw5)Cyk1OyBqhCC;V zAsIZ4kpK)Ih8>tVHVYdRF#s~32o@U=A*2fn9u=so3#}U!23?pSJP-}DtrkyEPzcHn J2M)?X06XGIopAsF literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bb.gif b/jawstats/themes/default/flags/bb.gif new file mode 100755 index 0000000000000000000000000000000000000000..b7d08e57e3686b1fcec0bf4668fd99ffa8bcedb2 GIT binary patch literal 368 zcmV-$0gwJiNk%w1VGsZd0M!5h001id$12hmiRI literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bd.gif b/jawstats/themes/default/flags/bd.gif new file mode 100755 index 0000000000000000000000000000000000000000..0fd27ecabe8d3014611684d8d81a1c6a8529fce3 GIT binary patch literal 361 zcmZ?wbhEHb6kyB6foGBf_Bm?D%#Qiu>wVkbDPVFy-ika1 zX9gfp{K*2M7<51c$WIJxZ4UD_jU#(5bnG@?xbvhkx3Yz_p}ajOznr?2L~$dpks%9PyRABpNuLt0 zm@x~7tUWs;4}+)%_iQmeRSsc=MIsFHY(l1Ubk+(BGcAg*v01u>ErV&V7pu>y)2AI7 FtO3oAcfkMv literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/be.gif b/jawstats/themes/default/flags/be.gif new file mode 100755 index 0000000000000000000000000000000000000000..ae09bfbe149911d7877616273c87935511426dbc GIT binary patch literal 359 zcmV-t0hsb-^(-t(N=ow_9P#e}`}=eD?6 z@&Eu-R8;%>M_5@|_xCUM_9{9$I{f@h_4Oo0MMeGT0QvJh-_Zc{?K$}JHsRv{)!_j4 zH#bjDPyPK-`S$?N+W`0XF!|^JKtDhG_F(+{W%TVI(cb{u-2kNk0Q2)e_Vz;Y@ih1G zFaQ7mA^8LV00000EC2ui01yBR000Jrz@JcfFqvks8E44}{2ovS0s(>8YJ;r6`Jhlf zn%Bs4Ikf_g7Fa+1{qEacm)!07%~Zffld)F1tmLtAR!3` z1{E!iku(k%l_WQr6#xo96D2evJ)sQ^6&o9-sB9V%5u0s6) z0RI30A^8LV00000EC2ui01yBR000Jqz@PBvD;5z*WFqlfI2VIKr2>KQL;wnNVXfZ4HdccqdBJh?EiD(F7ySJE-0a-*78Xf) z6z22hJghuTxlQu&@=LW#?(XjD_UiguTl{2X9HSg9sxA8Z`uF$uYLh+rQd8>c>iRuB za+*i>_V(W1-s}JXC88zuJ3I3L0ObGxVT&^JG&JM!<3O`O@eK`9xKaRw0015UE2S&o z002g_Mp(L7AfF)M?cXq`Ft^jU(dW_l0000&0QfXCJFq(7@8IA^8LV00000EC2ui01yBR000JsK%Y?PC_;`JO=CpZEXdlVD~0yZ`T z92^)JBqRf$3ZWz`H4^|EAvXmDIywmnC@2Ljr4kYu834K=AtfcNJR-s$#Ka@VEiF9D GK>#~f5SPFJ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bh.gif b/jawstats/themes/default/flags/bh.gif new file mode 100755 index 0000000000000000000000000000000000000000..56aa72b2b645a4054500f28e6c2336aafc8ab784 GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h_bn~@K|%RaQv3V+@-8m@0Ri?ZD)>7){p#xK>gx0$ zAoV3B@eK|4MMd{ZOY;B#@(>XHYH9U8KIQ-b_%=4`0092|{rpQy`$tFa0092b(EV<1 z_b@R0W@YprAM+U*_%t;7008+{SK?}vx}hKAh$0Q&m+{QUg#^78)v z{{R2~A^8LV00000EC2ui01yBR000Jzz@D&ID;Nu*&|{g&^nOqaA_v<$0=*^74@Y0EW_r?D_Tl*4*fbh-<`Z*OQ9fXJ`8Q z`T%4A_w4fHc6QubTh#;u$Lq@T#l>^Sa^>jUSiV?Nx>Lyj00372o7Cpiup3;{PE7apk*31SHeBncV- Utrs{bA<@wS)YLLEFgig1JGeZe&;S4c literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bj.gif b/jawstats/themes/default/flags/bj.gif new file mode 100755 index 0000000000000000000000000000000000000000..e676116f8ea589be623ced9474ae95d26b409ae1 GIT binary patch literal 368 zcmV-$0gwJiNk%w1VGsZd0M!5hRJK(0^&~s1I(o@^_e41WQ~>+?0A9UbvXB=jF2-~a&g z85!s20Q>t#_b)H?^*>0kM)vkZSh`kXzhXnJKwQ0Ca>jG^Ha7P=F#P;XPO?isuRq-Y z004;qA^8LV00000EC2ui01yBR000J!z@PBvC>oBLj7IbMI0n!Y^zleoArQvqH#po( z-rY+S8j(uc=htJRjmzi2%;h+lJSh)=Y%T=?F?2Y16)8Lf1UeED78V2u4GJk09ThS; zFeoZ3EfYDA3Y0w^Hkq596ALU2H61+yubP|_ARrhl5j6)K0K60w7Z(c)7#Kbc5fKH; O1qjXvEG$0LK>$1EJ(0`+ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bm.gif b/jawstats/themes/default/flags/bm.gif new file mode 100755 index 0000000000000000000000000000000000000000..9feb87bc9e846584ff47884f0b08b21637a36896 GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h%NG}sahT%O-_0y6<%NaQJ3M;2WAotO+PA@tO>&t4 z0P)({gu!msuDRZ0W6m)#=zMvq0081^YK{N^wg3RwN=fmkrF9`q+gn@JN=nc*HQsD& z*i}_+#O2mSMaB*e$6;;MKtQ>Jn$tx^&pJBGAt5v-P1Hg{-@(h7i;IzlvBP|hgBLyM z&(`L)*me*ge$*`cb~Pfy=?di3Y#kD$!}09k(( zJ%<1QA^8LV00000EC2ui01yBR000JzKv3Z3WA!c|ijop(Mocb21BYnAHVy}d!^tTC zGQvy((QQ1Zg61*EC@wAwfnce{(!2a&q@bZxA|gBu0cr;w9Sb27FDnTkAPF`zYYQeR z3nUX1GdUF=A!=+42BjLC5}%=K10^M-9}hni4xnlStt9{eAF;DqTR9mcX(VfGvrZ8T N%oENNKhZxy06PV_l#2iW literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bn.gif b/jawstats/themes/default/flags/bn.gif new file mode 100755 index 0000000000000000000000000000000000000000..b7b6b0f9199a96b4ef57eb4cac7413fe8a71793a GIT binary patch literal 373 zcmV-*0gC=dNk%w1VGsZd0M!5h*@ScBy8zjGWz@n?Mn*{IW$=0|4^4?A^E-v-e0KTa|+?tW#iFo|`==t;W?$|Hn z-uU+CRPy)t@7qi8-B9t*0QKfQiHC=(s;czoc(aE9QBhI&?M?OB0QK_MVPRqZ{{8>} z0RR90A^8LV00000EC2ui01yBR000J(K%Hr5su*RLOJf-b{C*G!V><10G8u!x`RjRA z48!Aq!7LVt3C-K%xD}|w;mjgUd>@`j!C9pMEiV!~F(eLnI5-3V03Zc_5)vU21tvBF z1epL76ape3A(I6a3@$kb11ACk6c(-oH43B%2N5$G9v%s5gG|6 TzDf;E0Ta;<4ih8SH$eb9y}PV* literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bo.gif b/jawstats/themes/default/flags/bo.gif new file mode 100755 index 0000000000000000000000000000000000000000..4844f856924ae58edfb7fba44e7f5c448a2409cf GIT binary patch literal 359 zcmV-t0hs4vV(D)Xgb0J8x6j)oh?9PI!A>Dfc;*-7r+SMA+W=+{2y)j90jO;OfS+aCb+ zZ2+~@I#HDX`@xU-Yhm@MWcaUe{SE+6*-y~rdg<6v>DpD3#Q^l7S@h_CxYj>a*j4D* zPX84HA^8LV00000EC2ui01yBR000Jrz@P9(D-Mpwk#h8VI3JN{C=>`BuFOZ(dMJ2f zF@>TqYQZ?1nMNb~=yZbkhc)S3E)GY9H53#K02vt#up%M=2&W4R8yh_+f5#0kd62+7Jp F06Q~Io@M|5 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/br.gif b/jawstats/themes/default/flags/br.gif new file mode 100755 index 0000000000000000000000000000000000000000..8c8661626bae57026266d56824709a9283d8c7ff GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h*yZ@7)EQ*1WcKzcVzE>JD*$C`>Gbp+sM%CSoJIWn zQhU35Q=?NucKT?rY5e?309XJTgBo9}UjRe^CWu`v2kCd}8kT1>3rugqR`S3bi zgXwK^s&kt8u;D^CmlU4TF*&3(uH8eG%5(PeNv*7*{qs>jm_YUIMD*z&EnxTj{8|8G z00000A^8LV00000EC2ui01yBR000JzK%YxI2Q|##o}-XBqc_nX~imf zicKPi(J(H}D*|_FGz=@5CIvz-2nvM?01#zd0|OKZ7Z5dh4=oKZ93dtH2L~iS5FP{% z8z>nK6&yE_F&%{?3?MWt20T0lI{^_97(WvuAPEUG12#Gb6t58)vRzpWG%#ai8o)?P NOBc>R(9u6Z06T&Vj4=QJ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bs.gif b/jawstats/themes/default/flags/bs.gif new file mode 100755 index 0000000000000000000000000000000000000000..c0a741e5ca69ebadee7774120d87675df8f6671f GIT binary patch literal 351 zcmV-l0igazNk%w1VGsZd0M!5hMwYHDg_-ri8!;Q+I)&W*gF7+nE;!qRZKOZCw|d!C*;+}}yn+fUcmx}HB1#?JuD%K#f2#Hvf&yg>cgPCviDJJ8U&oE3tS1(vB1E9iJ}{c4-fTIVo~<2!MAGgDgFLhzJ)0iw_wz xkbjbsiy1pHWd{cv8#N#x2P!{4BvmsX9v(bA6ciyL1UCgs1p&Uk1i`{V06Udwm5Ej<$3qzlIq*j_PPM<>g?U%;q-DH zHz@pY7YC=NAd&!=j7w<4FL0hGvELK*3i%RX*Bbn0QcQj_}5dq zmwf!+Nalz{@sUyQ6#(zM0PNRa-@8`meof^k6VUOkydMcq-6}VrsEW3M&=`)TtD{ zkw~S{$joSq1J_#!yF{6IX16(Ty6p%d*8_Z7HV|nXKMG+4A`cH5A0#9j8v`5|h6FA( z4;L2(5HAQJk{AL67Ca~h3=07oI1(WyCkX-y5DY0AHwzmGpCJw>KLR=w!~rk|0|O=| X4h}vlBO@^-B_JRi*e54G+(7_4r_HFM literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bv.gif b/jawstats/themes/default/flags/bv.gif new file mode 100755 index 0000000000000000000000000000000000000000..6202d1f3a2df4184878f5ed8bc23aa630d43c061 GIT binary patch literal 376 zcmV-;0f+uaNk%w1VGsZd0M!5h01vKZmEH98^zCF}`uh6sZENy;dei^_23FAb_xIv4 zFM6fq>gwv0xa;FBE9*^5?Ot5H007+=6wLqt>r_(O008MkL-O+Sq$r8H8S8KAKx4qwEzI+G%}a&g)Y3x25QbD!hlDJJ;%`1$$yu>b)6{{G_A^8LV00000EC2ui01yBR000J+K%cOO_*IUTgL1<384SHfuU06)29OoSwQzVEFmNnFct&>I;*X(EH(-}2Ut4`IvFn*G%YA0 W3NpY46Bhss8xhtKBqTiBK>$0|z?fYC literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/bw.gif b/jawstats/themes/default/flags/bw.gif new file mode 100755 index 0000000000000000000000000000000000000000..986ab63c2764732ffd789269068ea5b033c3ace0 GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5h0Ega4$@D@(LOaCqa&mL>^72YbN;5Mv0JHX7()euE z_k-U2W7PVV<^THn`u6tr0G;YpRaJ`N{r&y@`1tr`()K$$I{>coe&7CS*7_2|{`B

v=j^b6%_x}F=0IBa4#s7NR`F`B`Pft%J z$^T%_^Z>W_Z`k~L-2TnY%?ZH$?d|PR&GwVz{*U7Ra@Y5B*!XkW{dU{^)z#IA-~0i+ z{Qv*}A^8LV00000EC2ui01yBR000Jwz*cIgnazBo(F<|8pir7d!)CkPB)!FAr6S=V zQ4A)w)4?(sMj~NSKnkb$WbUX_9{30EM~FmN1_A;W2L~J>Ap$>qe}RLAhanvniv)mz zgocP69S1)&6LofZ8wI8XGA|2hYbG@TumiFp00>)MISL9D6)qkgBD60}C?FsZ5FZ~U KB>>I$03T&+g{ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/by.gif b/jawstats/themes/default/flags/by.gif new file mode 100755 index 0000000000000000000000000000000000000000..43ffcd4c7168eed43697af80901f59eb800c8d2e GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h^B5TYTU+S>093qGEvhXRp%(m0OZPA^^#B0Ij1oIEdc!h z0RI30A^8LV00000EC2ui01yBR000Jtz)u48^BIkZWKtmbxf~9RbTUaK0<@V#a5Iep z0SL*!xnx3z#r7u*kIUz@Vke-0Mi3R*j9w@d8Uj8aG?sYQ0`8CB=w=;M2%_}ui@050@}uG%YO>r938jh^H}W7}|?_-K3K zM1A#akM4Aj*@T_#<5Dho0|wkLR+Wj%A4LZh+xDUfJE%({`-8pwZ9f z{Ndf=;q&d~$@RWoci%R5=|6Golc2NI>C&_C&Srt-fT#OlgzToYz=W6VaHPjheDCQ1 z0Qmp_A^8LV00000EC2ui01yBR000J!z@KnP@c9VHqA^5jek3~#rqn@gHZc$d2LOlw zESpVnnI#fE!PYA}v>K7g;gPVUDH4&W!gwtlDlj}277uE90W2*A4kiT?2o@tVY8n9n zd<{A@5ezFM5R@U77Xb$~5iSb{2@nto0;3lk92W`(1`0B+uL1%c9Va;fHy$1_4;jiS OAV$tU1JTmcK>#~z$E7#` literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ca.gif b/jawstats/themes/default/flags/ca.gif new file mode 100755 index 0000000000000000000000000000000000000000..457d9662d54d976cdd5b4f4d8e480831995d9af1 GIT binary patch literal 376 zcmV-;0f+uaNk%w1VGsZd0M!5h_3Z8L?(Xu0iRy=l@p^jcX>8{c8~XbC@H|54tgHR~ z{p{o9^^lbH_4V@d^4S0Y+eAs^MMu~qDBL$X>Rw;?qo?RyWA1ZyrT_rA008Uj>+XGl z$p8S=85!+vbKXr;=1x@WC@jm%%f!UQ?PX@=VP@_yIonlP;%sf|SXl8(Q|!II=^rQF zYHQTg)b-HQ_nxBe&dtBSzw`C=^ox+{QeE3CFX-Ld^p=?QnV#ZRTln|*=)l3>GB@Ep zK=kzVA^8LV00000EC2ui01yBR000J+KotTJ`WcN5N8rKam?{;VVhR8p4!gp|!$DLS zo9SV&nKc>_P{CQD5frZ&iNaese34Sd1QT2iS{?-@5Dq;)78xNq0v=;27Bvwq0X7pl z87w#(BnJQ}ARs3T0TMkQ83qg&6gv$72??Yc9X1~r4>TSr4L=Syv$PTrxB?pmy-ESg W8WRx2Ob;9`BGn_;G8ozzK>$0p52i2x literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/catalonia.gif b/jawstats/themes/default/flags/catalonia.gif new file mode 100755 index 0000000000000000000000000000000000000000..73df9a0498e644d740d4b977b750e7c2f81c6777 GIT binary patch literal 238 zcmV>2R(OZZtg{&-mI@-yij3G>G+^+_kur3&)* zRQT&N?ejb0wj1j3Dd+AZ_{=f;YDez$MDjlu?7$`U=P22&66m}k?^h%Ay9L;CJOA^8LV00000EC2ui01yBR000GRASa4Yd7M;wH4xyw+omXjATbR_ z?0n>Vg8^n>fW%@nfksm(I2?ssXFBx&2Z-zhVK{ug;Ll=Fsbn%03&zS0Vzt}ua>-~u oAAx)zv9`Li2or*W1{5_m40TQqczFpa6e|sr7L^tWmZ&#vi!oWTyicM>= zhmfsIOrUA~?N;j4Rj|#BG>=sgeLO*$Wh{(RN}X%~76AYBesQ#oRG(};m|-=NS^!f3 z07L*pms~xQRYsj?Ih9>zu7hB!eoUQS=FC1!n^Iq*gHNGvceRn>%}V3YQ{vNQ?9xyE z-B^6BU(voNRhBx+#7NJ{QUF~SLYHNzx=l@-V*pPXW1vrLt#M?oaMHv-+Q~uM%1;1Y z0{{R3A^8LV00000EC2ui01yBR000J%K%Y>!DRPd2jX+TGJuCy%<)To8M1@u1)Et-! z4FCZ1kz_!)38gZ#7z|;GLzP)TCJEQ?_GmS92P!fdH9QLmFg-~ZIRFP3EF&Ey2nhiJ z1V0-WClm}eDKQ>+moFMW9109&9UUY)mH`nF5U3#^XBr-Nmk}@#6R090Vx1o}X9PQG RKTAs$&=o(^Kho1d06YCiiGu(D literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cd.gif b/jawstats/themes/default/flags/cd.gif new file mode 100755 index 0000000000000000000000000000000000000000..1df717ae5cdacf3d7ea543831aaf2fdb0f94262a GIT binary patch literal 243 zcmV}Nk%w1VGsZd0K@0RL4d|2GYA-u}p90A|GB{{Rq6xZ3|^8TV$2-0BSTOZ tJ`>D_6ZdB5brBvA8-;Rze|2hu4{{fe7ZH+^gBA%3n3x5d9-W;b06Q}=W@i8Z literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cf.gif b/jawstats/themes/default/flags/cf.gif new file mode 100755 index 0000000000000000000000000000000000000000..35787ca489da892f75fb431d52e85ad726b85b3d GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5h`b9-Fr!*Lr7?RSH`T1A%_4V}hIiuO501eXV>6HEb z{f4IZ3O(rdDk{6;F$7`+i^_{+i1YaP_?Wc%`8YY$)BsDmOGURuCY&a1$Zh20=d#-z z1~B0LYiod^_`|~h^71dM)(v`{_TJtA03+Vc&H(ZN001BW*#H3h`~AS?Tbi4q&y8{3Je{YcVx#GE#tooSGnC6XK%v(QD>^g>goG3n0|O9?HV+RO78VydITQ^T z7y_CBCy$bp0S%X$n#~#3Y`-G literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cg.gif b/jawstats/themes/default/flags/cg.gif new file mode 100755 index 0000000000000000000000000000000000000000..e0a62a51cafbd00551b5258b17284e542272d4d3 GIT binary patch literal 359 zcmV-t0hsg*-+&G0P{37UEWHq-x`d#!NAM+U*-~a$r+f?z%0s8ts^UDeL zvnuz?OHkNM%JOCP%@Oy}7yJ8Qtm|UG@JH=Q0Qas=P1OMRQ%3E-0QS8pX5D6<=tSKB z006@PA^8LV00000EC2ui01yBR000Jrz@Kn9C^BR*mWpEg1)d7UWio-yN|?%x-i_`v_xJf&S^aWy{$F4GWo7tRSoJ+U`$V)sTy`awef zdwTg;So~^g^&=zw{Qdb`TlOj{_b)I0d3pQ$`~G@*?EnDy`1tzz`uzO-`T6<%{r&v_ z0RI30A^8LV00000EC2ui01E&M000JQz@PBvEBY7&!0&LV-EJ8Ts8aZ~C=NldmkO8` zznY`7-33@Eg|DWK?QA-ptl_)$cJFv@g!4^yCvZGD5e5(pFBl?vG&3Fp1SKCNgApMx e4+#J&94-$1Sv6Q#~ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ci.gif b/jawstats/themes/default/flags/ci.gif new file mode 100755 index 0000000000000000000000000000000000000000..844120a52b2ace1595d581a03c564d71d3f14f0c GIT binary patch literal 368 zcmV-$0gwJiNk%w1VGsZd0M!5h`m8gwt)$}Rwl0QB_q($doZhX69oGW>l24Z{ucWdQrJMgIQ&Ce0=`%{KnKS^c`}_R-{Py=9HV>Qy5;rs^761T%qz?}T6ci0NGb$-49Dtb*84?W*9y1jc3JND8 O%n%R`H#Z&*K>$0Fexktu literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ck.gif b/jawstats/themes/default/flags/ck.gif new file mode 100755 index 0000000000000000000000000000000000000000..2edb73994c90da240f120ea7a3143da4fd1b0723 GIT binary patch literal 362 zcmV-w0hRtoNk%w1VGsZd0M!5hixQZ�Ba-d*wp60o~!^6Yf z)83@4%IKArdyBAef1%iKb3RdjrBiL=Y-?zGr1<#wL{@{-8yPn@f!UCkyJvfopvUIJ z$^ZZWA^8LV00000EC2ui01yBR000JuKpslu@tis|!iT^lC=@zhtI;TsTrt6jVUws7 zxfdW%3j}1K2jyUJWPY9%1^~e9OqatA;@}v50|f~c6+I0lI1zjt3lu*c2@)0-4-6qQ zZHx#9EFUl_8EOZLeG3Q(5kH=xYY`fK2B#Ynssf^}rKb}c8me1eDy#>i5U)Q?PftI~ I%*;UmJAFx!?*IS* literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cl.gif b/jawstats/themes/default/flags/cl.gif new file mode 100755 index 0000000000000000000000000000000000000000..cbc370e6ca757d338d851e78a257338c5088edff GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5hRHfwoZEXNt#rj)Y{A6Tir``HdQS$Qg>gwwG^78T% z6WQwbRFu-}008$yMC1Sf^*cNC008nXF7)l~g}mnO@9*&q4f_B9d$#5KMMd~DH1{tr z_9`m%Bqa17ANe{u`btXkGBWcS8Q%Z^=jZ48KR+|dD`anSRHa6wc(|D`gRGQiV zKd)P$+t=y#k;CU(nAH9K{@?BRcd_F4@bLKf`1SSm-2edm{QUOz_Wk|+`uh6&`}_I% z`S#~9+pog_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cm.gif b/jawstats/themes/default/flags/cm.gif new file mode 100755 index 0000000000000000000000000000000000000000..1fb102b295c86d04176b567ac795d92913dd23c8 GIT binary patch literal 369 zcmV-%0gnDhNk%w1VGsZd0M!5h_AD&?YG?LHIOgU6^Ya||J2?0EN$l+aXu@dsc60gp zR{(|p_4OoEyHoo_MMZ!}X15^;I|>4pih*93Mh&*jH7OM41RiNO4Iv>JI2af>8Vm%10~a?T4;>i= z6EOf9j}$tQ2$eiJ1pojrA_No^Cn*;Q9Uve%rZA`!B_$jw8(ceVG$bT&JtrI-J{KD+ P%ry|t&nYQB)Ik6{8V!;B literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cn.gif b/jawstats/themes/default/flags/cn.gif new file mode 100755 index 0000000000000000000000000000000000000000..b052530978823707ba275dd861a188e55cc0f181 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5hs{jD)lSsJ$0Ony~-8MD*C@0eNB6BFS@ zMa=*J+b=KPKtS3nE7mS9;ZRW6B_-onSmsz(_Rmq*ARy5V4c|&i>2Ge`MMc&hANt&Q z;Z9E4Iy&AuI^aS=)fpMW008J}YW2)Z`zbm)I8f18ZBYhGiKN`WYtZ3-}cTd005pyci#QlQT^Lg`Poy8aNCjBL@cn87O~(gocQU000aq zE(MW?BZ-TZB`6LOEgvrf12zf@7$PD(0|ui3v>+g*rl_g14!yk)z`zE>!$AN$75JQN literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cr.gif b/jawstats/themes/default/flags/cr.gif new file mode 100755 index 0000000000000000000000000000000000000000..0728dd6a498c4c3e2a69652e0476a60aafe60171 GIT binary patch literal 359 zcmV-t0hs42Jdg_UT4O>Pkug0516X`S5ac002{7e7D^g z7-xgL<~uv>q@;wL%<=N_f0xSk`T3Km)a_MO?yRf(%F5v-CF3hA004OLuC0xu(fP&1 z`~Cg)zP|Rny8r-X{Qmy+xwyFi0C$nbbdJMriNM|f0Q0uB^|!X)X=nMNq3cgi<>~3? zKtSE!-{2n~@rQ+ppw81lKlj4H>!6?d$jI})zWmhGdz8rG008;?{Q3X?^Rlt?^z`$z zv-|%3A^8LV00000EC2ui01yBR000Jrz<^MQDHcD-4+0U8I3*fQ%;A9GMx+vA2kQPf z9G%V(i3rXt)vZ#iZ8oz`#}hjFY^mH~GFcG@Eerqv7ZxuqA|`u&fP#dE3Ji${jDduO zFA53(A}}>{C_X$H6ci1oG!!xh90sliX97JBw6rc5R909eB?}7)zzGFNOT`EU$jQh- F06PNatDgV> literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cs.gif b/jawstats/themes/default/flags/cs.gif new file mode 100755 index 0000000000000000000000000000000000000000..101db64939d70025b6a4712466a58640ff4023b7 GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5hb92T1{{HrJb6{Y-^A;8W0Eb*$yLx)b`uh6#`1tnr z_U6mWOiZzCY{7nh$ogAb`htS}=;-`pWJN`<002mXgUk6+Q}k?X`aM1Sii%THw(I}^ z_(VjCiqAAOru92J^8f$<0C@5)F7xyA@?~Y^00000Wb-sM@eK{&008^@`}Zy`kC4)& zq}umOOIcXC_%t;5008wNAvrm%^>}#re0(e{q4_B(Wo5wQ$H(;b_57fq_4W1L008{_ z{PgtnA^8LV00000EC2ui01yBR000Jwz=CjC2pL1BWU_E*9sqzw12-_dGz92g%kD>pJS1OzB3BBl}#4;B_K92_4XCnq8zJs`##$jBwj KDJebAK>#~H;F-+; literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cu.gif b/jawstats/themes/default/flags/cu.gif new file mode 100755 index 0000000000000000000000000000000000000000..291255ca3f7621e4af8eec0a3239a7f75d22a6a9 GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h`T6<%$jA9;XxiJ|_Jq?EnA(CY< z^Mktn01D^oEiL{1{bi~BYNytGv)%LPT>u#CPn-Fj#LM*b^z!oZ@kmH@vHX0t{$Zv0 z_xJYzDDRrW$MaHBY^?fdsrf&V_C}QTL6Gu?z5f6J;cKn_Pnz}XMn-6>{zR1b-T(kg zm-P30drFx2Zm<52y217DZ~XhZ06QEjsZsy{ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cx.gif b/jawstats/themes/default/flags/cx.gif new file mode 100755 index 0000000000000000000000000000000000000000..a5b43089b01283eabb0e53b270e414575d24679b GIT binary patch literal 363 zcmV-x0hInnNk%w1VGsZd0M!5hXV+)rR004|-W!KN{ zNC0jCCsdO~%|(se94IKpt*z%-a!RsRc0B{%_xkE$J z01Qw}%}f)z6QJZj005*@(oRo|A{h)Y9}6Tm7Z(8=IXf#Aehv;jf&nNIC>uCB zHYx*-9uf;62?P)j1qCfG4-7mWou8o_r4OFew3<>lq3*RJB@;{4ib^W~d`$By{bNBYx1_V)Ar{rvs$#re}e`qx+D<%^c7!WanIvNN(RvjoW z5F08akT^R6JXkUrFcA$A5j#3KI649bIW<}XAut}QI6^ox0AgcgkS(k;NlOj^1P28L L2m%5#&_Mt@EbY{X literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/cz.gif b/jawstats/themes/default/flags/cz.gif new file mode 100755 index 0000000000000000000000000000000000000000..0a605e581dee0f0d8500f0f0d67d7feb3f1d6f03 GIT binary patch literal 362 zcmV-w0hRtoNk%w1VGsZd0M!5h$^Za_s@~NB0d}k9<{23PM6~kq^6u{Lz0&OJ>gwd> z<@B4I-QC^sl$7NY6Yq-RdeT z=_DlWG&JlxI_New+5iCPA0Kg@*yu7c>@P2RquY_Z>Wi=7@Q;t}OH0n(^6pSjm$>Bp z{r>ANF4x!BW1ZgbnVD^*;lkDL$Ay{x{{H*>`}p|y{QUg+`T6$t_Wk|+`uh6A008&* z_x1JlA^8LV00000EC2ui01yBR000JuK+EYzG#C%aL_)!|m{hfBYlp+xc)6R8VSx;0 zwH@`E_35_VzyLAEYIQ#ymle>+5ac)U_o}coB^fX@3kwYmC=U-Y0u>X1A{QPVBpVzd z1P&hn6(<>yla-g54kG{sC!ifJmY5D07!*AP0W=a4D=85X9v&Yf6tV?9ARq$A0szX& IJeDRmk~Z$xI*esy^4v)C;Ck|#M6-%7SXfx=i6{ABV78<$X*oGRKRWhOQtvY}y1KFV zSy{b7F`I-h{MDq&xUcenaD!W0=FJ`I9v)^%Jm`WQ@8E5%t)rE4a)5z>`|+ZjoRH|x zB0oPbA^8LV00000EC2ui01yBR000Juz>Q<*Nd1n;q=UsQ6mn1oqt{z3e#_l%GHG~8 zq|GLU_}O9-iB9+V%pPzQs_d!=1Q?2`r8*oeD-bdPb$EJwet-~ygcW&veSd)vHG>2& z3JM9EA|f3fB_%fs0Vg~e85$ZOARZnZ96mHSFDC=H0};9*ya2uc7bC(W1Ox`hF9a9L I7Z*VQJGrf#Gynhq literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/dj.gif b/jawstats/themes/default/flags/dj.gif new file mode 100755 index 0000000000000000000000000000000000000000..212406d973881f3be2b8c1f4cc4bbed17bf29119 GIT binary patch literal 369 zcmV-%0gnDhNk%w1VGsZd0M!5hvFoud%q>TR{s5@}G|e*rmH>^h`X9+3l(+oH+5S}6 zRQ>$@iLLoMdHZFo#G1PLro;XGn3y@xIeet{jH&k|YV@ne{w>ih07~f+#S(<1_x$qm zMAJn1`uTmH^&`zAak9z{!wnf?@PVoKO4dn)tN5V5{29p^`uh9#_xJPn|6QiQzvI@8 z-;I^$mj1!P6J75BNr5eK_jKNL6v`Co_vw_h`PStA>hb+slm7rY=iT(({{H>|hXDKg z`~Uy{A^8LV00000EC2ui01yBR000J#z(h_!BsPw+N<{<{{Zt8y)B=H+Opgb`hWY(? zHxpuPFfdA^iJ{AD<1A$}dZNZG7O%|$m9SAL8X6uR6gqej5eq&jEFd5bkSicDiV+(= z9RMU37at!dG!g|qiat9t1OWjb2PYXB1U(&lngkcCtr;O90X-=-E(*dV92^o71gX6( P1I^6^(9k{8(?I|`axbfZ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/dk.gif b/jawstats/themes/default/flags/dk.gif new file mode 100755 index 0000000000000000000000000000000000000000..03e75bd297377de3d398b7c36a613ae283ca64e2 GIT binary patch literal 374 zcmV-+0g3)cNk%w1VGsZd0M!5h@KjXydV2Tk>-Tnb?>;`x008evN%!~n^<7=$LMcM0086-4e2E%>pnj6VPWhsG4xqk z?Kd~;D=YMBYV&4h@?Blw008hoLg*hK=NTFK`T6wp^yo4&{{H^%PEN=G0QL3t`{(EL zR8;Nl?dUZ%@mN^t&(G>PIqy3=`}_OyPfzgx0Ql_A^8LV00000EC2ui01yBR000J)K$~wk`LQOGN+ra6JbZ!Z0HqsvJ{b@UkZM2? zh|Mq8a)@ReO~=rf1j4PKqIOPqE{nosuxZtJ3Uz81BNzogC_g+rG&m(Y2L~%A5i1El zii{ACk&_V-CJ7ZD1`Y%zHyn2(BoY!QDit55GdnjL6s!^!77RTVSz9{-DGL}fFDDGX UOCb*pE-?)S)G8`HJt{!}JEF&=EC2ui literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/dm.gif b/jawstats/themes/default/flags/dm.gif new file mode 100755 index 0000000000000000000000000000000000000000..2f87f3ca6a52c118cdfe6bc0a6dbc623025db1a8 GIT binary patch literal 368 zcmV-$0gwJiNk%w1VGsZd0M!5h0BZng!fANOcuk|@^oCLV{QPvaE&x*iRLC-1x?DV} zJY&COmA5ucv`vA{f&J}j^z`(2cXIaSTlV2N04@MOtv~a0HZ`d=OG-l;8rvDgkm9|A-a-SpKT&M)l)gBIsMxJ{ow$M z%uC&3AK>~-_2NPAW-IDzF!Xak@og&eZ!urKUH){MK+`4=x$Z$a8m$@ z00000A^8LV00000EC2ui01yBR000J!K%Y>k(X4(2fD&*x_#9A&KyZr`0t;IL=X3_N0|+uPBp@IdNClP! zB@7l52nHh%pc@(jI1LRs9t<=FE+{4$3KSXvre`5FBqOdFuoM7T3keA#5*QF?3MwkT ON=;3M8x+#hK>#~#;)-ej literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/do.gif b/jawstats/themes/default/flags/do.gif new file mode 100755 index 0000000000000000000000000000000000000000..f7d0bad39e027d93dfedfed5b001b2f32ff31205 GIT binary patch literal 362 zcmV-w0hRtoNk%w1VGsZd0M!5hQ*62Y{r&1hL|}Np=Q=v}`22Z}&g@-X00372A)xo| z>*6FN=QcIe005Mv*vtR`=RQ8}^Y)FN)mwADIaaUaEG+u=_4M`i`SkPYQc~+ySNi(; z`1ttt_V(KV0C9)Q=SoWLVPU-h0K@q<#=ip))CxkzKSY=X$< zL_~g)(AnST003d>)zR>8Z~XW7^YioV^ZoB?YU)o_;9x^v5Wds;H z04ggcClfFpHk1%@3K5!|6g&tXC6x>nr9G$=00<3N8X7ksr2`WaJOH&zOd}&PFEGjo I%m_gMJNYW5asU7T literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/dz.gif b/jawstats/themes/default/flags/dz.gif new file mode 100755 index 0000000000000000000000000000000000000000..ed580a7cec832efa9c9aa4900ddfef45d938e132 GIT binary patch literal 370 zcmV-&0ge7gNk%w1VGsZd0M!5h+S=Oe?CkdT_Kmuu<#K4(d2Vc{iBy$ylfS9*)z#Zr zP|?xR;o{=wj)z;Dd-Cn=`TF_*Tqpob5aC-;jhKPlQ%7Q zXrzXIvX}y9HFT?xhPIz!o`89-ly9hv^Yin@$;i&m&eqn}A$d)7dtl~!bnUsgMUH7q zk#6YE%<9?K^~=la^zu%kfVpj8RGfPC@bGl1kIrskW}19HgERA^8LV00000EC2ui01yBR000J$K$LEn@kBffjgr9t05XW^U;qL^u2=y;hv3lSh3Ar3bR z2QDf#BxXJ)5gnBWDGC(?Fc?0KK06X34hJnPIVmfujXgiEHiV-zF(f2DK0iMt5*NxF Q%o`;O3nn`|B_%-sJGCdIJOBUy literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ec.gif b/jawstats/themes/default/flags/ec.gif new file mode 100755 index 0000000000000000000000000000000000000000..9e41e0ec8c22fba363719ef9ba536c7c168e0ac7 GIT binary patch literal 362 zcmV-w0hRtoNk%w1VGsZd0M!5h=)C~--(>ULTIq6f$N&KQ>yZEeTiZH1)+#FZ<5&06 z4<}}}?#2N0SW`xQ!*rUrS%aqSH!=C;b=Lp@_v3o@;cYr}zHF1RT#e23;dA=uW9R?? z`{;r7-%R=Def;Tb{p)l1=Y@Ks*JF*X;Y&;N&I9sFMEdEB@IpHPDWd%Cmr;etFm1b4 ziONiY#{J(5e4o4#Q;DSj0N+DH{_J>xqrTK1ALCL|{_v0TP)qgVVnTYs_hVg`w94VK z0QuJ$A^8LV00000EC2ui01yBR000Juz@Jd4P?V00Bw+bdIaP(i=@bfiD3lDK$>DfB z5=o^J2nYljANLy`m(PNV?}ej*K%b9BljwIkIsh>}H83y_4;L3BBM^=k1}P#K7%eL< z4m%bWEG!ESk&~8~nw*{sI|c*;HzXu82eAmVHZ}(`8$7xV4LK$zC@2xb5fd8|$jJoD I%*;UmJDaVaZU6uP literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ee.gif b/jawstats/themes/default/flags/ee.gif new file mode 100755 index 0000000000000000000000000000000000000000..9397a2d084aa397846d125405e06e31f81ca3eeb GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5h04K9&qux6^JMr=HUY_3K;^K64b=un6(b3TWH@g4; znaaw_QkB_ElGrLMD;O9UA|fIH7OP51N&pF@S)1KGh}1?#Mm9D!KtMoLR8%*F(lLS1 zDtpcN`1tnr_Vo1hd$8pD`}@DYzxDO?071XS#l=rgPyGD+LyOc$kJnU~+b}RN!NI}9 z!^3#4gpdSZ}D|-{0T)`T6tn^ZNSw_xJbm^6~&f zzW@LLA^8LV00000EC2ui01yBR000JwK%dY@N*DpiNMtfm_&^|+OLn^j0tDKO(QtwY z1d58ALRB;yPE0{^g~yHZIn6;Seg<2{B(Y!w7b^}B5EwsrdwqX_gAfk_hcA47fP#b% z4;Mc*Cm|s_IUPJ6BOf|FJvuD~Cp(~`q^3Os13fGSpE;pCqot>)A~**JFfa(m3kxMB KEi57;K>$0OoS+N< literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/eg.gif b/jawstats/themes/default/flags/eg.gif new file mode 100755 index 0000000000000000000000000000000000000000..6857c7dd57a75a6232f2ce346c8183f63a0686fb GIT binary patch literal 363 zcmV-x0hInnNk%w1VGsZd0M!5h@ZEI!`uZ&`E%IYy^Wl9wJUsGTToDoxf`WqTG&Ji; zN$_%V?nOoOYisp-df&`s?Q3gWTU+Jj<>deX?p0Owii(PgiuQJPQc_df008#(_Ve@e zL_|dLQ&VeeZ0P_1G&D4OdwXJHW7PlvOG``det`CnkoJy_`}_OyyLRnZ0j?@dkV*@n*m0QjV&>^wd7_4WMx{Pgtn>i_`#{rzTU zW&i*HA^8LV00000EC2ui01yBR000JvK%S8I`Am+-j50IgIi8oxqR|)(3=|5j=`eUZ z9U6myOC($h+v;XIRVuPl%CT5LAgWPs-_z*=Ed(zb8aX>T5`2CrEGz&3g*zLFdy4@C zH8lW+8yhKMfJ|ZDMKRz4<1t0FMbfn-)8(JO2LuNwG=Z?A-bJ z`E+!2M@L5hY5-$nWBSR-;~Eq4$V;^5%--{3K$FCm^G`jL_HFE9K2`{FDt`eI@-rZV17Px0~b_w(}-mJa;< z`~Uy|A^8LV00000EC2ui01yBR000Jrz@KnPEQ)@BBw)b|g&YovL`OkFrJW9AdpfN& z6xa?#1`*CG6>Jp&a}IEy??J05c7AP^QL9~22K zE*l#uDFU7X2@sS64Hz#k1}qsFGcyGRJp(nQ7!wm07YGQbsW~z?qzwVX!zRWf$jBl= F06Y6ZlW+h4 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/england.gif b/jawstats/themes/default/flags/england.gif new file mode 100755 index 0000000000000000000000000000000000000000..933a4f0b3dbe2f328d15f73895ba576aa78295ed GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5hm;eCXgM;eo>f(xu{r&yob#>cSRqLap(9h55o}SDo zDA{sy`}Oto^z`}j^Sl56&oMFg@$uMAP0=E`CvM@Qe^-`(Ba z<>lq!;o;-s_-l#}!9?AJ#~)l5v{hKBF&@$K#H{P_6M zRaMcyzvk!aN=?0fyu0Xnen4Z^|l!7&RRaciTXx zJp#iZacpmv+sp?hh$SZn*V3@eTC~F)cv28j}X6%!B&kQV?jG$JK3 zGAWG|6e9}@0RSrmHCa3njvx&-J3BTA0t7l*I1!H~tU^0E0;XFLC?qDUAFVk{O&S|9 N001rs&^gjU06PoNyxsr+ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/er.gif b/jawstats/themes/default/flags/er.gif new file mode 100755 index 0000000000000000000000000000000000000000..3d4d612c774fd0e2af39995926d21a3c0b8c33fb GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5hX~bz*eB|_YI{*XE_{357d0X_DP6BTLW{B!MZRY?0 zy6Y(^N3}eC<0QHb`Po6pE007-CF#rGn!wCTDNk;Q#VfK7| z`MFH@&O-o*0Pb8vDyb?uvO2XpU-2?D_Q6E+9UbjoW3d1LRIf<(p;ccs0961%*ok^> za3QR6snbeIineuFWX#1pUi7&-%4kxThfdREezBl<`psB=irs;JII2%5xM4o^M@sas zMlq~0A^8LV00000EC2ui01yBR000JtK#c0(DH;#RgG5=`Y*;rKU^<0Z8Iq=^z@^nt zj8NzY!d50Y90AAaWq3LYsGN-$QiMDwIS9VK0l}>&D+&Y0$O_8K H3PAun=2?lT literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/es.gif b/jawstats/themes/default/flags/es.gif new file mode 100755 index 0000000000000000000000000000000000000000..c27d65e5f1218537ae3dc51733ae628cca95ecc6 GIT binary patch literal 360 zcmV-u0hj(qNk%w1VGsZd0M!5h{9Ii6Q&aWzCHD3!^erv?V`Jv#0RD1w{{D9J78d>e z0Q~$+>;M4s008~{ZSwLH{{C9~`$hLlOZr4a^fNR0JU#I8LG<-I{cCIgdV2RnMC@o) z^*cM|008(lHt`J&_VzII^BMU70QB@9`1m&9008;n?pN$nQT$9y^1ZOY&ZyvwQRJse>&Z*q008{} z0RI30A^8LV00000EC2ui01yBR000Jsz@PBvEBZvphLXYfWuBSC0fQ+N0D*v{nE`mS zx5=d9p%AtT1O!r3$s!RG2{aJM3~2~0wOLu@bOIw6cnByb8!b37b9EyjgbEG|E;=?Z zDuIs=k&`(*J1`cGArB8AGa?0JWCR2(EC~r89|R?;Us@U(92^v81U*U(OvN3?B_%z} GK>$1Bgrgn+ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/et.gif b/jawstats/themes/default/flags/et.gif new file mode 100755 index 0000000000000000000000000000000000000000..f77995d0ab47d81355552a534b769575ffe05d15 GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5hcf00^#no`Bb77rgPLfgiR8&xyi)FFm_4Oy}0000< z5dHmB^z}RVMn?1V9Q^!CnaZ(wy2}7F0RH}S^jJA*ql7PcT3(xf<>df*t&~QKYx`kh zQQBLHOpS(ke6LM7b* z00000A^8LV00000EC2ui01yBR000JwK$v1klo*YvWJ>XRWip*kWqP^rIJ2K3W4&?= z22Ctxv1oofnP4pdxJ`sOVUTJ~7We?b1u;bs2o4Mwb_)*=0elcDCV_&46NiWZiw6-7 zn1d@gA0IUoHU|eZJvSvK6f7$n4IUyVIUylBARs6xB&r)51-%WwBCjVTBt9d@BMHjO KEX_X8K>#~YC5%M? literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/eu.gif b/jawstats/themes/default/flags/eu.gif new file mode 100755 index 0000000000000000000000000000000000000000..28a762a59cae1c775b52f2c26b21ad658632073b GIT binary patch literal 171 zcmZ?wbhEHb6ky8jO69TOFm!wUDVT;A)?!_C{yfy2gaWmCOrR*q$^bR9R{scg(%O@TO|giqzYsR{U*?U8O5D U#0n;zPAS`BTG1CL&&Xg60F0$Rp#T5? literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/fam.gif b/jawstats/themes/default/flags/fam.gif new file mode 100755 index 0000000000000000000000000000000000000000..7d528852dc3f4efe6cec2d7f25e4674816af4c7c GIT binary patch literal 370 zcmV-&0ge7gNk%w1VGsZd0M!5hRNVW-^HgZw`+DR4UETfrREzpag!n;y)AxGU`GuG5 z0Q_s4$@N_T#q;(ub86K9{dc4FD{i6i0O$Y!`2ZM9+WP>!{6yRPS>gWu04n!Og8-@Q zX3_w2;{EtOd&%=?%JpD#+5iBn@?_xt`9y#Kvi8pRX@KVc!SYYc_GI@scgXT(_%w6B z@k@E={?GMu_c?g^J9qp~h{yC7X~pN zixD#c0XPp9k`)&RESV9UC?5|y0u?$m9uW=^5k4p=Eh`))0s?pi8o?w7A0I0{4<#ZZ Q8ygeP&<_tB95+D#J95gS9{>OV literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/fi.gif b/jawstats/themes/default/flags/fi.gif new file mode 100755 index 0000000000000000000000000000000000000000..8d3a1918280816780d79856b678e2ebb5bb76d66 GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGsZd0M!5h{r>*P&)WbiyhL-+$q-dTj%J8aF`-s|}I z_)&e-x4+G6k=`<8%JTB_Re;vK!qWHn`hcS2hNk7+;_YFI*-d)X!O7PE0Etd|&|iq! z005lz_4Q+m-1heNN_f-z`}Xr?J8L`~36s^SQy#NO#iq_xR=O^YZfY{QUg-`ug|x z_y7O@A^8LV00000EC2ui01yBR000J%K%G!05U@^_N+NMGkubX74?uZM06bo(7gP9F zQ2?M}m}$A*k1s$F%gUQnOp^O_3LOlK(r9=#2Q3gHAOk1}5E%j!27d<-3l}&82rdo_ ziW4({gOY{_4h|X_2{m(rAU=0C4g9xlX|nrTtN5Iz&ug^#l$OE(bNB!&-(s`+ z(LFiN`_)KB*mQZ%Q&iJjT~wa<0Dk;Y zc*Ul#)rlEBT(J49dzFJDNq-YNXBkUnu=&@Bj*x$;ak%+jh0f%+zRwvM=aiM^)7oiO zk9eKgA^8LV00000EC2ui01yBR000J$z(?UQdmU(uPA1c6hC&BKFOksoERcZ7B*5V$ zJKh992A~F;4XhHmNMt(DWCF6qJg|>Sk$NnA2sb1o7zsBX6(0(Vem5357#J--E-Miw z4kr#J3oHRR7Zf!EYz7P`92^W9o}r_q1S1X{4kH>F0ivW41_ZtV91sS#TV0^KA|kxQ QO&w1X&EkWpbP#0IBkZG(I zI|I#NsOdxu#!OOa0CKWjOjd$nAd$g9!fBicDjy#mKOiFk5j-s+BMm7kHWn5b9v}e@ zc>*B;6BIoe6&NBAmk1038!Vg@9-*U`4gvxi8V@g>D59he4hRSv8xIc-6AD>dprRuq Sq?g4^4GIm@(-YR$K>$0bS(5+& literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/fm.gif b/jawstats/themes/default/flags/fm.gif new file mode 100755 index 0000000000000000000000000000000000000000..7f8723b7da96997e52b64aa9a90b112828d0c3e1 GIT binary patch literal 377 zcmV-<0fzoZNk%w1VGsZd0M!5hah%8;X0MsK*@LOh2Uethrp>9v;gPl2JAA&LzTSzh z)RVN={QUfetkP|n#`gC1kFwRR$m6EL+`iN1mbcgdG>o~=soV?qm!{D{dLOaapBMH1q}A?D&`J_Xutgouc569)lqu+uPC6(d+B$=jZ3+&CSjG`}^|p^7i)j`uh6!_xJPj z^Z)<S_%x44Qgjl}c&lY3ENVi*#SF`jw zQJXCyqG-9^-Pb2pO=OL2x3{D1Ihy?y-rnB$m5kKX z)Yt$3w8iJV%jsr^%<5`g?(XiPwcY0C=H%q$?sjUj!{w&A-t&HP_xJazz2WW&0CJMj zs?RiQbXoVKJ@hTySuv= zN2U1q__xUC>|Rjp>+3{pyW-;FpP!#^kI|;N;Ipu>uD|3gSFo+9_7 z>~odVA^8LV00000EC2ui01yBR000Jyz@PB9K_CFBujQ zjbnlXC>J5^c-oz zY4-LpRD8_-{&QQrTlMuMUAjEtsVQ89)Jk>C0BQhQfWTjb&-wW~PP9V+MgUT`Qv3Tx`uafl z_%{9h0C&iDRDRK5zF=0lR${+dLvP7|&3P=PEM>u5ZIH=rkkx{r-tzJkag*0|me@V5 zF#v-AA^8LV00000EC2ui01yBR000Jrz@JcfDPBlOi_-G*IA0);Vj6SERFYJ)YQ<(U z8Vtsk{nc(W2xPNCX*9l22$ga*3^ZuCMA~Rr!T{VS~Ynna}=XVtbp!|Lf{JQmlm=H*ti=+u`)AVSnMi-(+*O z!o=O#-R=JV|NsC0A^8LV00000EC2ui01yBR000GnV5Ce?*=1Q51Qm2lOygk;;}L`x zMcji75JjW$iF_oI&!s{5FcJ_(MDzF@0Y^%qa!GVN)-V7Y{&)%*0&>hYxZMEDxBPL3 z5%_H+P@p93bqfgr0u>A&4+I-^1_%`h1P&1b10D|?7Z)C52rC>24jU5(0STrB78V5p KtO)}NApkqQ-f7za literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gd.gif b/jawstats/themes/default/flags/gd.gif new file mode 100755 index 0000000000000000000000000000000000000000..25ea3123187325ea334cd556a8725f10d6d6f1ab GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5h`PfMK+EtFuT8_Lk@?HSvIRN(7DqzG={^NFipiU;F zCK;R=^~gEr002p|M#j@PRk>7Pxj^&N8T;Qyd%9}#%_{qI0R7}u^8f(%%UDdOHb$H> zrNlTjrYKjZMEl)f_-;nm-dg?PYZsyy`QAL&008*hHif@+iNkvM(=_#7H|f_=ugXT( z#UD1X3&(aoaIP6(j4a=YRrX{&i@Q&=#15ajd-KmV;m$br(m?svJpG9PimYPY008{} z0RI30A^8LV00000EC2ui01yBR000Jwz@PB9v-m7Vf(65D_-u%1R3!RX1DS*qB?w)< zlQ7Bjh$0qz?3ck literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ge.gif b/jawstats/themes/default/flags/ge.gif new file mode 100755 index 0000000000000000000000000000000000000000..faa7f126a7eeb2cdd66c8e7d7bae6c19288d00a7 GIT binary patch literal 379 zcmV->0fhcXNk%w1VGsZd0M!5h^J`|q!^7$}FY#Me`uh6v*x2;+^!)7X+S=Ow{{HKU zgyQ1j?^;yL%ggeamFZ|=>XMD}^78baoA-%^($doUzr5z==J?*-?}dT$VqNpPw(o#@ z@TQ^D0RZh(PwfE!<4#BNkd42;zv=1e-{0TY*Vp%_r1Pz)_oJZqq@mf@+3(57?L|NN zuB_s9ZTZg1Edqm6FfT(fIiI{QUg={r&g% z_v`EHA^8LV00000EC2ui01yBR000J&4c69K@%@B50D}3d^dxy0jRWQH6{`n86gfi4j~dT9~*=NI5-0gECQAS zEFA+jC@B(&10EO(qZ<$%7Fil-I}9EMun-Xj0Si1QE*y6rAO;Z%ATSZN1Q!k$cK{Et Z1u!cSB1{M>B@`4L9Ss570U{zn06Tokyea?y literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gf.gif b/jawstats/themes/default/flags/gf.gif new file mode 100755 index 0000000000000000000000000000000000000000..43d0b80172e97a08147c64f811ea5c7775ad46fb GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5hs;a7*ui5eO@$F<*#M13od&TML>hy?y-rnB$m5kKX z)Yt$3w8iJV%jsr^%<5`g?(XiPwcY0C=H%q$?sjUj!{w&A-t&HP_xJazz2WW&0CJMj zs?RiQbXoVKJ@hTySuv= zN2U1q__xUC>|Rjp>+3{pyW-;FpP!#^kI|;N;Ipu>uD|3gSFo+9_7 z>~odVA^8LV00000EC2ui01yBR000Jyz@PB9K_CFBujQ zjbnlXC>|i_4OqFa&sJ> z9G#v)0Biu0l{WVFGxY!f<>dhXdU{*CTlOj{Xu@dxVPWe408+M7M@KpJ^*#4YO#N$X z04V@3r7r+j002h-3zZ81H~=)MG$f)V{7g(UrZOs{DioO%`8+-NH#hzL001BW{8d%` zQBnN-PxkgJ_c1a2{7PtMHDF#Z_C!QLuR!eYHu>~A^6x4Tmk;vt6k)z%_)}Bx^G5vu z0RI30A^8LV00000EC2ui01yBR000Jqz@PBvD;6I}q{Z@!I3tO~W>cvESUe3gV!gIV z1_LSun`oN=FIY^TOlTHWArNrIdW(k5@j?tT5OQ@f2MZV&4SfTDfdzI42RAY^IDP{< z4iF3!0s=JzA{{0p3JNDVB^;ZcprWLvIUpS?3_B7M7Z;tMpe3TT9>E{OA;lcWE6G6s EI~OyF2LJ#7 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gi.gif b/jawstats/themes/default/flags/gi.gif new file mode 100755 index 0000000000000000000000000000000000000000..7b1984bc692fea25c149976f81b83eefe4115c6e GIT binary patch literal 370 zcmV-&0ge7gNk%w1VGsZd0M!5h`FL*WsY>!XF8KKP@?25#^YhgJ0QX)~`D|k9&&~Mc z+9?L`uh9(`||Pe>FMdMX=VCmTk~2$@8aR!Ju%|O>|Rv)6$R*3O1V8X@@io8 z_4VOMJp7c6@l;63$H)7GeDvSm>F4L}<>dDE_T2yg_4W1r{r&g%_w@Ai{QUgy@9+Np z{{R2~A^8LV00000EC2ui01yBR000J$z@D(T*>FIh#e%^wH5$F&&qvMWcs!40Fwi-o zRNvzyQ*667Z!ervAP9#U8fSxSs*eOJq)O;)I6F8H96nb(02me*7!rX6Erf?22`(!o z36CE;5Hvg;9U2lO0W&o_1s@*;F)1$qum}eMBN+r4Fcd5|5eOn82eSbb7K;}G0=y9s Q6U`F_710$p)Hgu@JB@m~0ssI2 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gl.gif b/jawstats/themes/default/flags/gl.gif new file mode 100755 index 0000000000000000000000000000000000000000..ef445be003587758a9c100f3b8f4ba28d7ecf95e GIT binary patch literal 368 zcmV-$0gwJiNk%w1VGsZd0M!5h{JgyUWo7(cUi_n@_4W1b?d|w;bMrJb{QUg;Mn>xD z>gML=`kb8N;^N-k-uIJ}?-CN$*4Ffki~Hf>>;M4d008wnJM;hm`@zBTE-w9UZt)Eb z`v3s^R8{_ylk^`S{7XyU008qD8TlIRt_c0RS`uhztxb4-XQLFAy9W8Y)^` zJuWpLA`k}^93>!Tm@p=s5S}3%0SPt$Fa#4Ms2dv@Ar}GyCLJXtHYgSr2L~A$Hy6qj O%*++fAt5)@K>$0)Ft+3X literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gm.gif b/jawstats/themes/default/flags/gm.gif new file mode 100755 index 0000000000000000000000000000000000000000..6847c5a8c0232d984f7c8569a6f7b89b96736963 GIT binary patch literal 362 zcmV-w0hRtoNk%w1VGsZd0M!5h5tR{Cw^Y_hNB}DU(KIvwPXGl@{oP|@Y?=D{_Vz8K zEdU7Rgsc8MtUN<^^<_5J($?(pt{=R9%q&BwrH{BE81UXb>EsQut;Yv1MHQik(Ziu729_51ku@bd5>o*}!zyZH3;^!M~Kr7~iV z`@;YLA^8LV00000EC2ui01yBR000JuK+|tHq!^E+B~N4wt|z8sdlh&I zV1nSJx|lDwTVlQ2h2E@Ig~5nrKB5=m@qk%g3kD1bE*(A|9w{Io4h}0effX4UA|ePK zeHJw|AP);O7aF2GJR7Ds7^yfqB^(e94JZltZIsglm3;X*=`$a|mSy>dB6#V>6C88zu^&&H-GWYjO`|w8m z@k>OnMEp-r_xCUT>j3rjJ^cJ-ADQ4|UZN~l|!gvlF*DuHr^e2w<21@AEEG#Yme6E6cS92*@l3n(-Of<6(3BsGdK z01J;M1r?G5BoYpb04Wa!CN?Ub7onn0QOco{QUg+`T6xtH1=3N z{{H^@`uYLs0P{sE{&r#j%>aM*bo5g+`)pYGXinn*0Nnrpnf#Fa)@c0_0R8%J@IfCP z?Ev#+Nc3n-{_Tht`2*d*sr$8G{Nri;wS@lZaLKWk0Pz5I_G$i;g8a&V@kS)|Y*74$ zcktZGA^8LV00000EC2ui01yBR000Jpz?Nlb@fbag24abz#86OyR3aG+L?TDd^W%6q zm@uZ3$pFqWmF@uoMM#8Fps=}&dL~uP_J~B{0T2at1}`QFFe@o=a)KKp1_myNJ2W$Z zf`kS<5GM&fjB|Aw1|J_R1t&jaWM*do46(5{I9Co@6BQK)yb8V)N=p>OA;k;F$Uy)* Dz3QR) literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gq.gif b/jawstats/themes/default/flags/gq.gif new file mode 100755 index 0000000000000000000000000000000000000000..8b4e0cc41ecc29ca33c6780e4d3334123a4aae24 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5hgTMYUq%n5LcID;e`TO}0hyB~y+1XT70BGp}efw#` zX^g`9);c;~yk7VB_f51-;%sd5^Yi)k_Ls{20EPenNC2q-07R`s0CxcL_3{8@0P^nc zQ?^t0`S-j40N!F^-AYQ*EG+r(xBUG4)2@!#O!e!cz8 zA0Cg&>FM|To~6)`!;9ZrTfW1<-{s$-(EY{8$%?;)^!M`gF*dl3;n zehU*4oDwT5Dk>YJ8wQIqARr_RtRW#fEiDW`2rv-0A0ILYyd@%R1*_B3)xyo}qO|0?#_IX``tI=dzRBve!R7Gq z^7i)l@$&REUCfQ5+v)A~;pFX!pW6#P!~iM0f|}g`0GExV;q>(NO>)(NgUjvj_M5HX zdz9KOSIL#A-T)c2xy9!I0E*`6^7#4u_xSts_4?!H@B%f$;^N}`{QS4X=g-&gSa!$? zG@;Vg-SYJJy~yXt%GLlFq1oT@=<4&Tu*dA~^78Ze2O+8G=k5S}K;&nLhPNH9Mi1~aOXNQ>;tg^K!o zy} OO#v0p&mq#%K>#}%6u74V literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gs.gif b/jawstats/themes/default/flags/gs.gif new file mode 100755 index 0000000000000000000000000000000000000000..ccc96ec0093b08b01c9324d90d77d962f297755d GIT binary patch literal 363 zcmV-x0hInnNk%w1VGsZd0M!5h#>Uv%tF_jJjVUR4c6Frd>+Sq$P!khzY;2-MM2%x( zpgTK-N=lKOAUxya>SqWx001uP%+g(5obhdC000!HeVPCOQ{{YoFff0MVvA5vlr}Yi ziH5ZE^YlhWeEpe$=UG|P&Z7Bwao*qN_(R_cf=VV}aquXVN$HH7Mwx{F#FkLGXerQFcmx-4h0Af06z@`JsBAuD>oY$ z9Vjg)1wRl78Vm_&mjfdqDlCnkqNErD0|X=m00^E6qiU}M2fe)*w_9DUX_v2_O%y-N J%+1R|06RkFo6i6M literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gt.gif b/jawstats/themes/default/flags/gt.gif new file mode 100755 index 0000000000000000000000000000000000000000..7e94d1dda0ab4a00cf6ce142d317cb66ee3eb114 GIT binary patch literal 374 zcmV-+0g3)cNk%w1VGsZd0M!5h@$~p=rThS0|Aw~zRF?YyHudc9^y=#B07&=%1Lj$o z_fwVj03`2ClKOhD{q^ z-S_wRA^8LV00000EC2ui01yBR000J)K$~D_sU42ASwW>@s04#3NTSi`bd%92gNr~Z zfy~8v>H$h6nZi2=h&C5pc?a;wK8u6^B+A?_b2%6v9~F5PAQ>A36FoaQKNuAiF)t_< z4jUv56OTVU1~DNVEGP&LBm|t0JP!sO933X66sjcvpAW7byeTLJU?VsaKe+}bCMhXC U2ulnRD=rWaFfAx3KG{J4J1s%9mH+?% literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gu.gif b/jawstats/themes/default/flags/gu.gif new file mode 100755 index 0000000000000000000000000000000000000000..eafef683d5f0280f58de5bda5d17a9f6766e1b72 GIT binary patch literal 370 zcmV-&0ge7gNk%w1VGsZd0M!5hLu2wfUGmw{){dk8VSf70S6`E-|AU(R`T+pn0086w z0B(u;VSV*ndHHFC_fc>2?EnC4hWt!y^>T~)W`g^3js1zA{aktVewF-slKS)j09khQ zcaZ*7bM|(R`EZK;R(1DQbMsMf_ET{3dXxU2xQXOyYh`5VW`Ossfq&m)W}v!{w85sr zd7y5H_s4sm-DX2_jQOBSd(Kv6bdLSnyh6udh2m{-jf1Iwb*Wi)_(x~-_W%I#007$n z0R0I7A^8LV00000EC2ui01yBR000J$z@JcvDDrq3O|J)m{0z{+z+yQZFd5Ip|${z=jq{PzuC=Q~5-0B`hi(b~_At1AP$`Hv$4G4-z{77YPU! z3yTCQCpZO?00A2bJO`Q$GdVRflK}xCKBW|AIvoWt0HLlUJ{njaF$)e33=9_=AtMjH QOHB|8&mca zFyyoV_4Onfof$`~LHzt6FQ_jw zrZOL(AN*Na_Vz^e^*<4h0FKKgkj*RpcXwN^Q2P2@{7+C2mk;%Jc8zj#{Az0UZ*Tno z0RI30A^8LV00000EC2ui01yBR000Jqz@PBv%NQj{k7vRBMV_^UX8L&C3I$5Q$>F>{ ztJSDPGM!Lb?kfZym(L7Xz^4Nsa38lB#bCtdI{*L&1_l)s3N$ko78No+J$45U5FIQ7 zDJ~5v9RfZ)2L~7vmYA9iu_0t6dgAvPBml$9+5v;@M!AjQT4$jCte EJ2d&0^8f$< literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/gy.gif b/jawstats/themes/default/flags/gy.gif new file mode 100755 index 0000000000000000000000000000000000000000..1cb4cd71d6fd05fa1d42a8afbfc3d25d4512a43d GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h0B!)EnQ->^IW?y=)#$(Z`^x}K0QyKs$J@E-_10Ck zRFQ`}hRlg$zhl}@PxkqF{&#ow_ALHaR{$~q_V%iD!*>Rh2K;Jj6P6VE`dV^nM7Byu z^YyC4*j*zfYV=QR4sr<|QTZR8-|O zG|T`1^?G{x(b3!h0Pq<)OKR)9c8u3q0?Lk55MMdyoVe2?J@L5^%W@he1Mf7)f?Kn8^N=f7&AM$Ey`@g^S z;opdmE|u59$9OzQ z34=fevWx;4&bCXs%n}pUtb;~`7QYiX(O~6jE&wA4Di#z!8VMgf1QRj@H98n79ubEd zA1Njv1PuT&lO7TZJqIhA9UnFT0xc+_G^7V5CLJRq1_1~Our~!64pwb193eOs5ef)>y2ws2+)GW3#LM5@q^ivc z3EsHAA^8LV00000EC2ui01yBR000J;K!R+LNDNZ5ijpy6EEc<5>(xW)0Fuy!=U5dM zz5@;dG2Kc9&Ex{W1QrQe28YWWU;)a6gaLFGEGH@g0xmx>6dxZL77-B(H3kPCM3J(k+1vUs2B&Z?{ARY}Qx>_DQ Yq5-4|5jGYZx(rTFPY>D;4ckEgI~~rLTmS$7 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/hn.gif b/jawstats/themes/default/flags/hn.gif new file mode 100755 index 0000000000000000000000000000000000000000..6c4ffe8e84324c2ea40f2a50e6e0ab391b0f77a4 GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h{{H^N#KdHN(O7iOJzc|ei`VMx^A9$%dy?7!08#)1 znqGO(CP}>X_4TB);s6q%=H}*wmCI^_)BpgALu1Ik$m;m`_^!I)y2a@L0CTm$sZ_G1Q!otn%E>FI>#O60vzkrt9J5igp zzvo3;r5ixGm#E+K^YhQw@k(dLNN346Sj6My@y5{a`T6<${QQBH*1*c^!OHB#&+fCn z;s5}9A^8LV00000EC2ui01yBR000Jzz=u$%C{B*YpYpM4BA$hUL?T!W1{nonVI7n_ zGzy_+LeWAI*{yft?JAg53k15PTo8bs1moav78?c)gaLT~IUEKY4h|MJF%6N1h&d!1 zfEFD(1~DHE0cj_1DJdEnJ{K1wBR(t>0%Bw+3=A(X2e~K-6I5JY9y1~$1OzH72|p7` N8Oi__SwdDR?U1Oct<>lpbsoy$<%>4ZP`*n40r`}bR()Ttt z`anPc9HdB%(f@9$KW)_t+!_C!SY zNl5@y!TbCB`~3U-OH21xR{#*5_*`5{daY=p+i9fUY^2*!lhgI}_5A<<`OM7p^z{Ax z{r>;}A^8LV00000EC2ui01yBR000Jwz@PB9D;5n%Bn0vcIG-3yqv3GSWXym>Qd(3B zw*qIQNVKxt#Ud8s@W=@h3*!5He3wJ}EjZ|UIuvzyd2Smd0)L5ucrY(IZzKsRJpuwf z6fO}NHUuIyWi=inBNithnw=sKDmf^l7O@&23@a-G6&W}-6RQsz8acEK0L1_u9Wyfs K2q4ZNK>$19yrlgA literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ht.gif b/jawstats/themes/default/flags/ht.gif new file mode 100755 index 0000000000000000000000000000000000000000..059604ab20eb6f3a5063c0321ae2e8b1badc4a67 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h_eVDX5y0py7K@tXbA{g4008b+M)GJ`1187oMl)`K z-2el)YjMhyqv%|5)@6Cx>Od~!002^H)9y?={9H`*b7Wm(#C?w9`%*&y9K`lHCw+s| zWoyXG004!R;`1vPdW+rw0Iq6%+Dl^4TkZPe^MD(g2S=`tUA zis1bK0C;`T3l*p0EmYUr3G9Lf{dG&c}c8K5aU{L*g zZ^ZxrA^8LV00000EC2ui01yBR000JtK!i}3$piw6WM~;eG@dltVBqmwKsy01**8HYX?(2@onPECK=~2^|p?qNJv%sw5;3Kd%S7JvIiTq@}o?5e3G_9myR( H%s~J<4X=$u literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/hu.gif b/jawstats/themes/default/flags/hu.gif new file mode 100755 index 0000000000000000000000000000000000000000..6142d86817c12d74b84a4b19d7f60045bc0dfbd8 GIT binary patch literal 357 zcmV-r0h<0tNk%w1VGsZd0M!5hqT^01W^xjxG*;4(N1r^YimXo<#s90K5PIJ(xW@mOAQtd$j-n05|~QOiVA4FDi~I zB#R{0Dk>j`9~6NU-aAHk%VprRSYEHkW3d1LYzG;FX-Onn zhgF6J3W;1D7W4HDkIUyyCpYMsOugL>bxM^~Bsx4g3U+yWeSd*G5IBW-G<<%5f)Efq z3IsJV5ik`68XFuQBOeYoKLi1tpP{3r4h{{e0RaZLGo2KlHx08Gz!Jg?#6QNzKS2OH D+N+ap literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/id.gif b/jawstats/themes/default/flags/id.gif new file mode 100755 index 0000000000000000000000000000000000000000..865161b0307cfd1609732950cba4d9a6c7999aa3 GIT binary patch literal 362 zcmV-w0hRtoNk%w1VGsZd0M!5h@$vERqMhVoS?qdq@s5YO008Rh>gML=>64A?o|*Eh zrs7RQ+%+oWP)6leP3C4^%m4uEY-Gd$0Mh^f-T(mF008J=SL0Jj?SOgeXkX=AQ{hNG z;Nal={QUj>{p@pV112#cW>!lRp)AA@TZ~kuBz>JZt9nj?3$I| zJu=`!IOdLs@QQ=*jD^)03-0dj`1ttt_V(S~-QNQM`}_O#_4WGt`tfFwS*DGCZG0RagtD+mZL2{IlY9UVA2 zJTyKvIXgW+J0LigmzkTLpFceuJRLfinw*|L002K6KBcCovp+vJIXwU~#0CZj2Ou0A IHqAi*JCOOXTL1t6 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ie.gif b/jawstats/themes/default/flags/ie.gif new file mode 100755 index 0000000000000000000000000000000000000000..506ad285906c72324b51a6d2e9e067177444dbb0 GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGsZd0M!5h?e*;dhXCjR0OsfB^nWvY$$IE^k-~a$hv`X}aJLBWy`k7kwdM5alQDVPh_<}cg z$alWJu+Y%Z_Ixbx`0)4d=;7bnSiD&Ei9hrp06?xk0FeOr`1sub0Qvd(_V)Jr`uhC* z{P*|wA^8LV00000EC2ui01yBR000J%KwMxL7#Ihqnay^&U;>3`%h&1nd_5FOr4m3_ z3Qf#v=xtaOSj1Zhhho0+ZbSH_)`1o+Gy=$TG9L~JHC_*VB>+7;IX^OkASMD03nL{S z0E|C83<)406eN_FHxrFK6$~H;2Lz%k9ybsZn-!@C85trZ5?~q#w6zQb1R^3j4H6O@ R94;>}78WifBs$hX06RAOp?v@V literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/il.gif b/jawstats/themes/default/flags/il.gif new file mode 100755 index 0000000000000000000000000000000000000000..c8483ae52f057c8131c67501b466bd5bdd3e46fd GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h&d$z)rTd+o`NG1&dY<`ek@k(P{eGhQTZQw1l=tW7 z=jG+)m$UxY*Vn(lzst+Z)6>(tySwr6@#Ev;)z#I-#l^k7z2V{E$H&KTkNS$B`(=yv z-{0Tv?)r0>_jQ{1{rvrQj`wtw`-Y$OgPHn>pZZ~l^#@1kYm52m>Gq1J`T!;000706 ztNQZt^z`-h>FN0U`}_F#_}kmt`T6FNFb z{r>*`A^8LV00000EC2ui01yBR000Jyz@AX3SS%(N&TQ78Ku(Nk)L>Al0tW)&!|MIM zKc9~mtI=dOoDJapig}vSIlaR@6mAehL=tRNI6FE!7y?`uh6v^7Hz%001}u^YiprrdUp*P5>YP`}_P! zpGo!Je*W#Gp|je6zJUGUZGV!-`~3Uou>kk60Pv&$_RcK)-)V!4z4y>D`P4o9*i7{F z_5Z&BA^8LV00000EC2ui01yBR000Jvz@JbEDVj_+h2nO5{65f+!y(IMG6aDD_4?|E8002HHJ`#B&EQtsfIthX(C54AHEF=^& zGZsFBkrE6O1_lEI5h(#GEe#DFDIlMsq^78<9UTEH3^5uS8ylgc5v2jQ3?arM$S2Am J%qz}806T|Gt@i)` literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/io.gif b/jawstats/themes/default/flags/io.gif new file mode 100755 index 0000000000000000000000000000000000000000..de7e7ab385eecd5e55ff60cc67e06604c2ca7ead GIT binary patch literal 373 zcmV-*0gC=dNk%w1VGsZd0M!5hk9Dg60*GdAx`nK8)1|q)z}>aD+IFN@_tw~um%5oQ zUH}I&%uGl6=jQ+bZe3-z{imduwur24O~l6HsI1iay1I#n!|l>Z002&Gn@c|@i`(4n z^4;S5oS8~etev6F)Ya=)V6#I@sovo3?bO?TsAAjG&gr(ks>Ph* z!_4l?IpEIRTSuAQ$wl4Gdcnoo*L{uP;PFveu(G9OaGPHBprQ3&U-$C&tbwT4*z2iH zbD59BA^8LV00000EC2ui01yBR000J(KpG&RP!KhNfWxs^I$)d~V#R5E3ZO!S6`4_V z6-cK8$?*h&N9lkYV0?&1C5Jd!D3kT!5c&K_Dg*>6Efx~ T6b2F>xK2wL)Ya4r*g*h0BUh+0 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/iq.gif b/jawstats/themes/default/flags/iq.gif new file mode 100755 index 0000000000000000000000000000000000000000..c34fe3c44ac029c96bbc44f4fd1a814b8235902e GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h>hlr5TwF#*M)d#ytK6*S_2zwh zeZJzt{9|KdV`Mx$JnH}e6ciNp`uTy#gZE5K{cCIcMMeL6diyvyTU%SS;kN#Ec2ZJP z{fdhD{rvodg~H~=oYJ26adPhV@ia6vz2m)XX>5&)jg`-q_vX5cu>1kC^SPodc962ANhPDA|fCG0R(s%EC>rXEG#VxED|S$cs&RS z2`(fg0G*SC0x~8hIynjoHZ?CLB@GHcKMe*B4kH4$5V^Smunia(8yg10v?I2>u*u5H Hut5Mj5z(S@ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ir.gif b/jawstats/themes/default/flags/ir.gif new file mode 100755 index 0000000000000000000000000000000000000000..156040fc578e6a7a1bc2399c40523cfa7f41e945 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h>Hq-wmX^8Wx%8{60E7U`<;$nnr{(44*Y4L!v`WnA z%<_bU{AFhI#l`X!754V_V!mSfy1D>&0Q566089W}yj=SA_It{E0Av9A)YSS!MEYA> zQn*oT!fQOPJaWZz`L(wAP*C$NE%!u3^(7_sJ3I0K0Q&m+^Yioe%+28d0Qdj^`J$q; z-?XpZu|K0fcgT10rKMB0Q&+lI_wn*Es4)09H~Bm~{N?5Q`}_6v_1ypf{QUd?i2(HU z^!@$)A^8LV00000EC2ui01yBR000Jyz@AV@AV`i9j8aLsTwt)zr_+HzDl=Jv(z{%- z98MzP@ziQtfdV05BU%cV!cd^Ue)u1cX90m|4-Yy%ItO`sIRPvY0fIg#g?NZ3CkqQS zgD5CI2Mah68K5931EdWx4Fd}+3>q3YHWMNwBo4L?6FaOM8zH_UBPAshvLZVs$R+^G M%PP()JJCS^JK%<H%{6AP`uh4~io)bW zLI40qah1w#lgUwhyjX(1-Y6#{SfxyOxh`R>^78WUd3Y&Zs6KA9003rQhr$2=S>ro8 zL2b=SW9KbF%;ngZTLPLvXX(003%_#`gC1`}_Mq zZ?Urg0OwX!>R49iO-$wGMR}ioeJSROX0EIFs6(2AHF(e8b8#)k^3NAl< z1uP_igM|PT05Svy84m~wCp8x$2NM$(B?|-|4>LR)J*%x277-{5CRr*xFFg-AI1)4^ TC@l+20RuM!8r2Ke*g*h0+u4{_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/it.gif b/jawstats/themes/default/flags/it.gif new file mode 100755 index 0000000000000000000000000000000000000000..d79e90e99e9cd5e9603313cd6a840bdf23abd8f2 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h_e@Lxg#hB>;@;lg<^TZl6BGGWRrK`q^*uf8008nX zE?Bx*09OF<4GsSO{#?CW^8f%tuR>I|RRDbed&+wNWdKyURP`k#^BEaWwod?d0P`|3 z-~a#si2%aF!uK&TNwi7yA0PHBD|yIybjEb$<>dfx005By^foqFyjac6&GsxT$jHb` zvrG6lH#(|1Xu@dvTwL=tHTFbAV83D8+uQZ^_1ypf{r&y>`}_R-{PydN zd@J3P04Wauo4O>(*?IKSABDqIg2{K~!vN>OBme4q?$1tHSy<-VS(SxFl8t()nOR+_ z82|tPA^8LV00000EC2ui01yBR000JxKu0YFC>9gQ*XA2tx8hJl#0*Mp>0Sg0!8Ut&I4@2FfukLorfVND;ysdus$jd6&pV<1`G%tV`Ly8Bp4YsKNA-K63NLT L%*+xME({S;F)=14CLS9-epOaZVqkDu>-d|2;g6S>^(yPXxw#C% z48dE2V|K+PCnx*(_+)2iU%PfqW03}fJ3~oHiL0w?aB%Q%7Z<77(tm)Ur-#9U;cr+N zgEqsbPoFMcy!f+k;)|T5KXd2*NlS|e4?lnYyy;5Qf3s%Y4fa}6U9C7@@t2F|p9vH8 z#KcUQ9m|lwur<@(V3|SEzNA0?{$IX+wODSE5FK4vS^4?%=N~_QeETpBlj-E-sawYi(g7&(0-fEUvB4T4f<;-Nn_YF|o2; zPR>G=U0K|KnT=D;P)JBiLV{D4T~W`7mzRf!dD(JPQ(0DSeSPjD!ot!gWKYRDGFSru D;P{a* literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/jp.gif b/jawstats/themes/default/flags/jp.gif new file mode 100755 index 0000000000000000000000000000000000000000..444c1d05c59ed6a43e63fc7cc7b809f47422ccca GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h`8zxI_V)Pr`0wxU)6>)K?d|L9>-R4&_%=4><>lAc z*XQTw_9`mr>FM3w-PP6A+uPgwMn>P?-}p5(_A4v+G&KBGRoU6u`8+(~%`awbW*4FfWef0J9{i>?b(b4r)RrXt3`~3U#lau|syY;)f{r&#= zmX-Riul(uh`+0f%et-M>`}Fkm@$vD`&(Hb!`TF|$_xJbw{QUj>{qpki^Yiom{{Hp# z_5c6>A^8LV00000EC2ui01yBR000JyK%Y>^ zZ-qQvx?SNNBcTYxnl_dwY83H$CD#LiO|W?MqSQ008AJGra%+Sy)(L zKtS_hW#AVdH?TYMU14m)ZE#IZ=jh_q*T3uM=grE>+tbJ_q%`yK@!;9cQBhGDp&(aW zTmS$7A^8LV00000EC2ui01yBR000Jsz@KnPEDA};in72gNLW1HQS$WNE|=TG!hQU1 zqmx*N_}3(3k0 GK>$0)Ly?03 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/kg.gif b/jawstats/themes/default/flags/kg.gif new file mode 100755 index 0000000000000000000000000000000000000000..72a4d412c805708b5f27c5a38622a46e86a14cad GIT binary patch literal 373 zcmV-*0gC=dNk%w1VGsZd0M!5h_@ztrYismlWAm3S>^nQ`D=X?MALtqy`N~7;BO~Mh z0Q7}9_QNy!)z^Sy}N#MfiJr@?Bl&Ha7HBRP8Y_^G{Frd3otEG4X{f_I*qA zRZ;RtLgy?j^jT5wKsN4QBk(~w_MSWUl1B1aSopv?^tUSXQ&aVKO6@otQ-kt?Kxm(j!%+|jWD|880;3=hGc0v?6DBMW3lJ+U92_?)1pojJg)9p* zFDNT9Iw}edk_CkpGc_D22{8%@3J9SS4-8^tW;PMGBO^TlAXYzF9ykXF1UWe*BmqiH NOc~A@0nyPx06Qe4k+A>( literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ki.gif b/jawstats/themes/default/flags/ki.gif new file mode 100755 index 0000000000000000000000000000000000000000..4a0751a221904a25343137a7a4a5aef71e112f5e GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGsZd0M!5h@rQbxtlas-yX9F&_U_%w)9PDz%0^j|=-Axod}+hX z=jr9+wZiA)NjCP*$?R@k%m4sugwX&3cIsqPe3aPF*X>qgj_Sf#^yO0uE0F15PK%z~ z-Z&)b-BpmK;Bbl4VSUc>-FyH5SHA!N*4*%_xZmPJFEmV*2Fo_ z*3sn7((l~9Q)#JVahYm_&5fD6=@ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/km.gif b/jawstats/themes/default/flags/km.gif new file mode 100755 index 0000000000000000000000000000000000000000..5859595e809b6e8a98704cc408a7267920ad3e80 GIT binary patch literal 358 zcmV-s0h#_sNk%w1VGsZd0M!5h01oTx)d2YTQ~LV)mxr|gYXJ84_5A#D>GSE^G#2{$ zYS`=8Xr1@rNGhkd+*cC>-6gY0NwH0 z003D4A^8LV00000EC2ui01yBR000Jqz+1paEE)sIKtVU7P!3SVWh$sDAC{b~gnq9G%<3I~Ib&TxZo_Wz4GoNldUwcoQc+PVr+09H^hX}@W4 z$7M{kOuDfv^id$~I{@0++TY*cX=h@foQj5lTxDTNZ)#U`Z$igy0G*nShJt3@0001q z00000A^8LV00000EC2ui01yBR000J$K#gzcix?9~4dBO&K%OUyg~VzZYz-9Z=Ys^k zsf(+i7|j@BxE&= zfD;Y}2OkwG5e67L6dfQd5*3^uo+`r_g2Jw5vA>G4cV05t6HJ39bN@c<6qBz6D!#KiMNMeIXE04C?|QdIlO%H{9> z07CBU008xJbKL0q_H}mli;Lpz{`=nD`qR_j>ip&>-Kkf?qp>#egEhb6n~@L!P)=#kB|46ne}gQ`^d<%&G+_& zgz!;PA^8LV00000EC2ui01yBR000Jyz#3&pF&GI*f<(fR;5N{WXj&?LJ_tlX2FuMr zJ5OM&P-K258UXfsX&j7@#S%%e28qiW#EbECBM)_V2?7lO9Udbj9wZI{c6b7Yh&vTN z6(I}{gp)QdhzAE6438<20yZcuh#(3-4<{E55iTtQCMJ44S6EsF1uDV|#5YPz91su~ M%quGs&?`XzJM&4QW&i*H literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/kr.gif b/jawstats/themes/default/flags/kr.gif new file mode 100755 index 0000000000000000000000000000000000000000..1cddbe75b3087d8abe0be4845b8339b490d1f713 GIT binary patch literal 385 zcmV-{0e=2RNk%w1VGsZd0M!5hbeiF&rli!=)A@*pe0+RUYQ_6SMf>yfXlG~P=jHkN z`NYJ;-sIx-_4V1=+U@f4{Mgv(>FJ7!ipSLL%F4>_4Co$*W>Bw*WcaQ;os%!>*ww5^7Q%Z@$l2x+34={uCTDs*VScizN*CV-{0TH zd6Uc0&-1ah(9q5D_4W1i^R=DBqpaE5+}zL8(a+V>{{H^`{r&Xx^z!oZ_xJbw{QU9v z_5c6>A^8LV00000EC2ui01yBR000J_K%Y?9={z1K%}De~FnqtCW1-9CdcEC-qToG$ z5ecD|gFqAx1i`@z`EU*i>M$@E20IjD(Ez=15iu`z6%_*-4mu4O9XMA#GlePzEj&6I z4IU3y5i%#DGxmY1OX%fq5vlW92*%oB|R(z2m(A46FV>*2oyUO8a)aN fC=on74Gj?iC_BeXO$-bnAQ&bdDK-`sEMJYmMn>ov z8Bb47;^E>l>J20u+s5T1;X@Z*S%*UzWbssOwF!_RG6&GQb!{>9vG+m7@|Vx4Va?&x;h|s8^>EksaoG6! z)kD0~h_BI+aM9+z*OX+^^?1j!Y1aFT%dCRUyWhV6pVFt_$~foGMu({bf!E<)&gZJh zcmu!xA^8LV00000EC2ui01yBR000J)z~48ZQ0cPx# literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/la.gif b/jawstats/themes/default/flags/la.gif new file mode 100755 index 0000000000000000000000000000000000000000..d14cf4d82c62f716ee124e1b2afbf8bd79a41c0f GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h@;N!BW|MW1+gp6p`T6;WLw!AE%7&og%+>Dva&z|p z05o36ggkg`i`%h(sQO}J`dwX}Ta4QP0A+*K004**002pC%;o9xEm*|-Yio;0fSXi= zWQ5rMdV2LlMC||ou5z0I7PwV;)8qgE_fk^#O-=Y#SMe_|03*I%f!Fu<_ic#Qe>8A$ zjoVOl&P#I9?eO<~n&4@O+E8@RvUs17PJ)$HiA-?KpJS82kg@FV_MTsmO#nY_15fb) z0Q~>}A^8LV00000EC2ui01yBR000Jyz@KoaC>DLl&*#@^b`pt9=J9}-NTp9NN27s2 zfxs>j*=%Zo3hK~m$R+{=Vr8it29&j%!+{Y97c&NfA`~G9G8_W}e*`KM3kC}=hA|u| z0|Ppa7ZwW(7&n!eA}<_r1D_Ze78E=VIAb<78U+luEG#t@3RNaoB_19C#3#lQNIps* MBh4cc(9uBvJEn@1%m4rY literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/lb.gif b/jawstats/themes/default/flags/lb.gif new file mode 100755 index 0000000000000000000000000000000000000000..003d83af5e0ac0bb96a30dfa4932a43915e3fba6 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5hD%NwCGBEU>P{CMGEg1KS zeDQ2t^78WW^z_5R!lKNh@M2NS003L0TlxC>(*OYVfpqR(PCb)7+W-Kx0092|{q0*y z=0r06{r$uM0O>_Cz5oD2mPARKO855m_4W1hdTsvx{`2?sg}Q{x-^=AcF8%xb?N~@C}y*Yt0X(b7Px_hsW==K zScqkVAP_zl5J1Dut#+tdU@{^ZNDhF>)amse5+XJyb$5AuelQX`AtEVucLe}_JvR~( zAr~Pu4F(Jbl9e|TCjl214*@(3p9K^p8!TlnA1VR@3Arsk6jxbevSu$FDk{865gr~O M%o)xZKG8t{JI9i#CjbBd literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/lc.gif b/jawstats/themes/default/flags/lc.gif new file mode 100755 index 0000000000000000000000000000000000000000..f5fe5bffd2017b1a599d94b4fd5745098fb0e845 GIT binary patch literal 259 zcmV+e0sQ_)Nk%w1VGsZd0K@-TAu z@%Gn5Hf!~fxAkFQm2{o+Dq`bplkGn{JYR_JahUI(!uQRgGWYE*V~z4EUfn8R;k)Ab zD`W7m!s?EOgeqX$A^8LV00000EC2ui01yBR000GmAO?&;VKN1yG8_X0a8NbdhBOVL zLocom1j1wRpil(7Kn@{Dcsz*+MWH~xbchE*A|YTR3d}%LsOSWU0Jk&1U?vZ;S@1|W zEEY#%!l%dubPWa<7X||W695z$1q}iN3LOWN2OR~85g80V2n(K{3K61=DjXaTs2Uj` J8Lg`!06T6AWa9t; literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/li.gif b/jawstats/themes/default/flags/li.gif new file mode 100755 index 0000000000000000000000000000000000000000..713c58e1df193b0256be462a3437c95af926e600 GIT binary patch literal 359 zcmV-t0hssmzVQaqZh z!vGnld1aW&008t@L+xl)DF~@ zSCHT;5Aa4W>|sowk+<${TPX`+X;O^vO*e2`laHREMR3Hv!KX%Z$msw8@N{DP;A8aM zX8-^TA^8LV00000EC2ui01yBR000Jrz=d$QAQ+E?OlA>Ms8Tt_X2aohIv2n)#4`Cr zE5OHtlNd0c?Wre<+{WcI#k160vSM8vL!sa@Gcf~$0}O^XEi@n?3_m*-BO?wDH8n3K zB?1BvH4O(AFbD|=0R;sUnh-7l6$d1uq^78wE+_@9JTfv5FrlykrMCye4aLR{70Jp$ F06Pnflbiqm literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/lk.gif b/jawstats/themes/default/flags/lk.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b3ee7f572ddb8199166f65e8803233cdaebca1b GIT binary patch literal 377 zcmV-<0fzoZNk%w1VGsZd0M!5h{+C$v(@WyB7rACo`;AEGyd>$jN1;4ZaHnYW)E}!% zW?Y+G^2j5eHA(i>Q0~Vy_uOQ;Wiqo`Z25*h^Up)ccqB}aNb$@)o-{hmhC;)6bf-mJ z#BUqfm@L|xL{*nm?Y}d(V|1=kX0cgR>%uPi*;JV=LjIy<_SHC}K|J~2a`o9;{gO~b zj6~k2Kv9%W%7Rquz-MNmW!9KB$9p@^f)K4vPsoC6u24#^QeDi1F3^N5-J&1%*HqJz zNBP-TA^8LV00000EC2ui01yBR000J-z@P9}>Ny;N0EKe7JRUy;;&f8QG@+10A{zKQ zKiL8RfM{-9MQ$?~?ZV@-L}7q=JQ>`fQW67L5OW47AT~1*dp!#uECeee3Md&M1qnJ0 z6%Gq81Oz<_8$Jx93>YRH0Us6w6Al{(12i2GJf^5GEfW&~BLfY;CKwSZ9274Wx&baD X2f!vN5j9Ls4Oz$U literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/lr.gif b/jawstats/themes/default/flags/lr.gif new file mode 100755 index 0000000000000000000000000000000000000000..435af9e506f70a8cc09022ae3029373facb3ee0c GIT binary patch literal 360 zcmV-u0hj(qNk%w1VGsZd0M!5h;Ami@006B30N!R@(LFP>wA0{cU&H_a-eX$bURAaL z0L}mag@?Gl00885ZR2ri;caExT2b3qO`HG#003CoRZC`RrPfSB{{H^`{r&Xx^zZNW z_xJk9006lF0M}Vh++0%OY-8tyeW0Po+gVT3L^<{6<@f99*ic8`Z)VtERnRakXhcp5e|E(;u`37noK1Oy)wCUthEk~66;OHB$20>uHx6B9o_ GK>$0mai$so literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ls.gif b/jawstats/themes/default/flags/ls.gif new file mode 100755 index 0000000000000000000000000000000000000000..427ae957e508a6c90df90c68f2320b119bf372e7 GIT binary patch literal 369 zcmV-%0gnDhNk%w1VGsZd0M!5h<>loTn-%~u03Dnr01s_coyhC#>_wKu-`(3QhPvwU z^F*&lB9T_py_GPCz4`h1JF7bYL;y65zx(<2`1bNAe4D>{miq3 z-_Wu>lENi^wBggYHmEi;rZV;K<^25nD1x_as?K<^(Hx*0%H8JxF@pd>jnU!i)xevM zzS{Bh_0hVG_wwpkqRl_4Nx00`OQv)D`};(Zy>FefA)7Sq=GVrmdHehO>FMeG{QT|h z?fUxqA^8LV00000EC2ui01yBR000J#K%dZOFz|SQBw{&J`93faXQa{edb{7FRUr5% zuMMY))hZ4N8^O@PSTMEn1Jy~8Yyw1swb43i7#0Q1BE`QJsoDir+URq$bA z_uD)C=X3hyYxl|k{nP;W-&O5BJ%l;7{1gcNpq%=3ZTkB9`1tq$YVH6;-d(c!gv9#*g7BZ7tSf@AJVX6BGjjJwH7-dJBDjfrEu6Jso$1Tgt5T@ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/lv.gif b/jawstats/themes/default/flags/lv.gif new file mode 100755 index 0000000000000000000000000000000000000000..17e71b7eb6bb2dc4f4e63837cd70be048d08f1a1 GIT binary patch literal 363 zcmV-x0hInnNk%w1VGsZd0M!5hu0lhpG&H(YRP5Q=oE#jaGBUzzYjgkrX8-{F{QR*- zMp^&>@!{dhdwRxlbG1=Xtv)`;o}RKwN~JC?>B`FV_4P>r0O{7&zFb^^008>>`uOXBfMEz^Yiom{{EO06y@dR=+o2W&(EqnJnGli#(8&0BdeM3Si~wcH zWdK_MOTJ4`!BBF|a&F9S0A&DS#$i#vQ6;V=O}|YrvoJcgI$_CS08#)|!&QRRg8)SU z089W*z)n}gS2eUXe$#$x%4$KkK_IIjJ+wVHwKqAlIWMsNmIg8Xv}C?!dXPQLsh_4fYX3GxH~nqHaE66Nxn%-yh~lg zT>zN?A^8LV00000EC2ui01yBR000Juz@Jb!7$g#cB9w9}<=Yc$F ziVG}|X;27;)=uKZg;V4P1KlcBD2pHH0x!=EIXV?6G7AF;eR61lgA)Z912JSBb1oJi zjUyr)2@W%q1ePBsDib3BB%BW&JfWAQrT_pY8vP*D9* zQS~Jy`a(kaR8;@^dKPd4Gs57O6~vv^*%l3008@8Ve~pW`bI|jL`3=k0QLX? z@&Ew-Sy}1;0RMY?^dBGd85#F5F#Kw2{AOnQU0vb;0Q^f!`$|dqJU#O=GW}Fk-v9vl zIy(M&dHO#;`B+%Ga_{m6nG9Rd>Ax1Hw1McAs2WLHYgY` z6f`t43y=joCK@A_FD-PPAq530EE*&kr2`0$sSyzdEE`%}2@)6r6c;-x1~NTMO->#j N6%{5XEIrae06XmGiQoVL literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mc.gif b/jawstats/themes/default/flags/mc.gif new file mode 100755 index 0000000000000000000000000000000000000000..02a7c8e1bdcd38bf6ce52dc5662d1d75026b67d1 GIT binary patch literal 359 zcmV-t0hs(J z@$vEgU0w3>^YuSJ>gwwBW@i0#bo***^dKP5&(G)Q=lpMP`cF^&aB=!vT=-K{`Bzu= zL`3{$W&C$|$H&LX%gOm?XZ!p6`1tts_4UQY#rF30`T6<%008sz^ZNSw_xJbo^z`!b z^8Ww;A^8LV00000EC2ui01yBR000Jrz@PA!E9NE>gVJy~{5DXBD0LdS3M$qL<=k{S zh{`3QSTr7xNTLfClg;P|r6tKZ!sGHeO(A{i3=A(KRWbzt00RRFArc$`kTW|tG(0yo zJvu%;8Xy5Pl9ZO1nm#%iCILH>m6w@592`D27@?x0nI1l~7`*}l78V2qB^ogqHZV3p F06Uswuu=d3 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/md.gif b/jawstats/themes/default/flags/md.gif new file mode 100755 index 0000000000000000000000000000000000000000..e4b8a7e3f67097d65193a435018d68d1a0798af8 GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h-B3dS0I{c(RP^B~OJ~w#ecS!+UE*X}+e$s_#sL2E zdxMwa_T@3wGbO120GfwGY=qpl008>wOY_(!ev{(-?r8k%RQufk<-GvrZe-g=IChNQ z;8;xg=tTDAJ=7~4{L%o!0032S)?azq+CVawgFOHMpV&Jsp#T6{b=dgkK=$QK zj7na3)ioRq>SWf5>VEgl*qCmap|6ni3lGcpehgbe_P8#y9A z5-l$}B@8DGl9ZPO9V!o<1E3!WC;<>Y1TQKK6B9hCAFHij1uix=H7g!8Xlbn`$R-I1 N7|j?CDA6cE06R$cn05dF literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/me.gif b/jawstats/themes/default/flags/me.gif new file mode 100755 index 0000000000000000000000000000000000000000..a260453c2f73f32c07a75de3dcc5d990fceff33a GIT binary patch literal 238 zcmVjVnU0|@E6KJ?8$=pz#6vOEuFvF)}# z;jSy>oHOJA2LItkA^8LV00000EC2ui01yBS000GR;3tkw=|CuST?pX5upkRc``kCB zQ&LacI7(;X=?w-y04{*ZbTFMGvZmApHX4mndfx o1nz;Q5ovVj2NQP^Qb%-vf-^D)jE#*G36YTzlo14%m;@mJJHTpU4*&oF literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mg.gif b/jawstats/themes/default/flags/mg.gif new file mode 100755 index 0000000000000000000000000000000000000000..a91b577d138eeaa5d0f9bc8a00cee9ddb3305062 GIT binary patch literal 372 zcmV-)0gL`eNk%w1VGsZd0M!5hO0r5Eo*epARO$c#>gwt}tUXz}TK#Kl05$;iBqaAt zOy=h1HL5k@;^Nxc+S5HKFQqT^007W49sB?Q3zZ81D*ymT0R3iW`$tFmK|=XFJoq;@ z_c1Z{D=Q?TB>YTFGo~^sq$(7d6#4o2?d|Q~-`_T{HrGcp{9s`hq!%KpBKAZ?+fqQA z008=2T<2$9^*=xTaB&cq57$mREw3&6{QLd<{Vbv^{)L76`}_U<{rdX){QUgy@9+Np z{{R2~A^8LV00000EC2ui01yBR000J&z@D&2ni!3dWMnYt{eC_lE_OIvP%eQ$(S$}1 zf)6I6*>F1CUeu?%h{@(oVl^N|bvD$vd`=`_0|ab5JTELWCnpaN5)v~l1Ufu5IR*s` zG&CwIDJdov1Uxx8I|d98Aszt%A~GNd3p_hJBLJwXtTGf36$_*zBL)Bf1(ysU5H}SK S4J8gG7SR?6)D_kUK>$0+p_E1d literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mh.gif b/jawstats/themes/default/flags/mh.gif new file mode 100755 index 0000000000000000000000000000000000000000..92f5f485c3bb6e33dbf40656bda07e3742c071a3 GIT binary patch literal 370 zcmV-&0ge7gNk%w1VGsZd0M!5hxy0R=s?qhQZg-KxskYMq0BsmTlZ|k9L}{`3+q?h( zR7+~BwRBrkbh12StM=p2001wAo5ymG!dYjT_kl4(W29SsxmkI%WrDf@02nq~q5l5< zG+3T%hPy{i_^kXs|~^Yw2A8*Wm7JgR#$@g7wX=EKr+wc$#u) zga8S9A^8LV00000EC2ui01yBR000J$z@Jc9C>9k+r0W*}m?8s-MAX4pF1;1)7uak9 zmqsJxaa3M2*zHH~2F9V9!xy6n9;ZTt0KkM6H4_YWC?6#`1p{Fr2sH;XcON(r7Z3#! zV+eu*2`K;_JR=$z1tNb3oFoArAO^0Z1sFX#I{*?IAi1t192p8MEd&yO3mz2}4jLT2 QHYx>35Yf^Z)YL%$J4-p13IG5A literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mk.gif b/jawstats/themes/default/flags/mk.gif new file mode 100755 index 0000000000000000000000000000000000000000..7aeb8311b2b6a4e18b278d1774459e57335c1b76 GIT binary patch literal 382 zcmV-^0fGKUNk%w1VGsZd0M!5h{8?7{*f{@h0RED8_Bl8G+;I4bGyD4h^Z)?$ye#Pe z0Qq@4_{>KBb#?o_NBKub`-VsR###JvPyA(N_xCySnG)&h0Qash_NpfT`gijf82*1* z_ADp->r?wvO!Pn?_H8-zM>O_oC+#-?`<6rdZCLqcNA`9q-v9vgEga~^0QF4({Wk#o z;{ftO6#bV`_Bbo@S`*#f0Q2S={CH;j@M8XmS@vBk`Mx>y*dOuA4)WtH`maL$zf}6u zUHXiT c9uEu*1koW0J17S$NebF3Dhepy-!ee}J1K9L&j0`b literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ml.gif b/jawstats/themes/default/flags/ml.gif new file mode 100755 index 0000000000000000000000000000000000000000..53d6f490c1777de4f9d44195d5e188cf2a35db0e GIT binary patch literal 363 zcmV-x0hInnNk%w1VGsZd0M!5h?Da!Rv`Xjz0BXW&`22I|=m7luY4kBM_en|lS6BS} z0QD>^^Bf!ihyeE3D0<0y>GL=BBqUL`QS9|j^wb<&y<7l#0CL82I;uJVXaM*3MDi08 z`T0Bg`a$^kHT69`Sh`sNR{-%14e|g0MX^Qu`$zZpFZT8-{QOMy^(0idRNw#r{ryqn zqX6&tQ}py6!4O&4|n0B#;M4t{?E78eo$BmjCQCk_k@ z8#yZ$1CTlp9+W8*m>UP110*^a5TY*>8zLg78C)PL6EPYZH9ci!KNcAoAt5&f$OSDc JD?iRb06S!MmRbM+ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mm.gif b/jawstats/themes/default/flags/mm.gif new file mode 100755 index 0000000000000000000000000000000000000000..9e0a2756d2ebf850087f556cf77289009985f3a1 GIT binary patch literal 365 zcmV-z0h0blNk%w1VGsZd0M!5h`9nkXB_-Y6`1CwI`dwZ000610?d1Rf_%=58OH1ki z0Qx>Y@=a6#0LOiO zmFiJU*Kly;czNVTM%}@|@=HtGMLW(_Sl(S&*Yq|v`$$OfLrQFA+Hq~)c5>d`008X( z0002PA^8LV00000EC2ui01yBR000Jxz{c+1@_u`KpBFCl2H5} z6@dU{a^V0ggeKDchQ~7wS}h4+4h`5NWvInMX&QAM0|z8LHaaI9AvAOW9Up~0Dhv!c zIRh+$kRK2?2OAz|3nh<{5D+3G8z2Cs2oZyx7Z(#F1z8qb2^ataH#Z^^6Fo~!J_-s4 L%p)T`&_Mt@&VP;h literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mn.gif b/jawstats/themes/default/flags/mn.gif new file mode 100755 index 0000000000000000000000000000000000000000..dff8ea5a63f0a3ec96dfd0dcb95a0a7abed8083c GIT binary patch literal 368 zcmV-$0gwJiNk%w1VGsZd0M!5hK|%Ta+GzgCTz7N&^f58_NlE{EdHYpV^(-tZD)v!P z{qr0g`)FH4IPLW$B>d4${Aft?00000>He%%?EnB(N%8z!Tl!r+X=(iC008n66ZJhk zFfaB$J@rRN`ZYE9@eK_C0Q>*|);l}-OicXw001N;_22*iT~hJ;*hC&4^z}A2WnlLn z8SehbdH=P0{@ro=abhYY@cxH(Jvj0tAMZ;`_b@B*`m#j+-ds&V?)h6){ex89008{} z0RI30A^8LV00000EC2ui01yBR000J!z@PBvlZ1{TNn}Z({0uLHVKBg0S(d}0;4}yr z7LX O63r4KCnr7AK>#~`43F&q literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mo.gif b/jawstats/themes/default/flags/mo.gif new file mode 100755 index 0000000000000000000000000000000000000000..66cf5b4f05dc02126365be46762113446f171a8b GIT binary patch literal 378 zcmV-=0fqiYNk%w1VGsZd0M!5htJ5t>eK)_ z0QC0sQngY=u|?YK+Iq=)am8`~g8*H=UAEn}m(P~~SpZMAPXI{(M6N^tbO3P0Y)Y|8 zF{LnGyi7l?KRT*93zZ81EC3pu8d|!738K-oN;DY5a``m@aiMCmJs`=!Yv%|;$A$NP0yis$eeV4+6o4SOY!gi9p zM{BlIcBwmInnGuu001C@l!%F>i0sgicaElSjJR!vwDiBKYoDF;_+o*uV2ZQ2#p3<#r26otkD|Afrn#QA zrT{I0A^8LV00000EC2ui01yBR000J!z@Jc9DGrW@Wby}S0t_sN1J>IRN~QzTvf;G^ zw9^DZx#}tgQ1uJ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mq.gif b/jawstats/themes/default/flags/mq.gif new file mode 100755 index 0000000000000000000000000000000000000000..570bc5dd18a8cd881e03c9a56c3ebcc514191fa0 GIT binary patch literal 379 zcmV->0fhcXNk%w1VGsZd0M!5hTXLl}RGv_4tisCRo~+NNwAAM6@??9o{QUgT*5k_3 z<+j1v03U?2z1I2p`2YfQ=H})A05XA<#O&_!U3RgBn8lT)&AGzb003F^_4Q9`sk+79 z)!F8Zoy5)5<#~_6003wJ07b~q;?UUXLSCYGjK03e-o3`%_xJh$02lxgeZ$M$SaGn5 zoykaLr%7h0`uh5Eh`rk0=-}n>)!poAfw|q{?_YSayv5t;>FMF-?bh4q`}_O$_V)e# z{rC6xA^8LV00000EC2ui01yBR000J)s+bJnQ06YHGuI>N; literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mr.gif b/jawstats/themes/default/flags/mr.gif new file mode 100755 index 0000000000000000000000000000000000000000..f52fcf0933bdd5a8e30a1d2f7d76b97f728c9ed0 GIT binary patch literal 377 zcmV-<0fzoZNk%w1VGsZd0M!5hfXF0h!e{`M05z#K0E7ThwNXT_L_@GK0BHc&>@Y2) zEdV_LGo>>Cc>sFJdH_lQaKv#rmpNj-VqLyn`ujyqt4;6rEkm+HBcUUs*-C4>Yd)?% z09ybVn;9mPCQ7wRAB!JPwogj4N;;}KSh-nLxKwt?b`+Wv04D%Dt~*`4T`rj}g2^NRIXC!;d4wT zq*5W1F>D3{g^24V?FtnNg*G@SFop-gq>J@F1{Wy|3@{!T8w&&wB^5F}G!YRm2{||& zBZ?3qA2SIyEiE+(ARQ+I3k?Au7aI{Q78U@dCpQc~s;wylD;^%SH#Z7D2v=bRA_it7 X0}KiZC=E*-91qqD3qRT@3qb%oq~mv! literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ms.gif b/jawstats/themes/default/flags/ms.gif new file mode 100755 index 0000000000000000000000000000000000000000..5e5a67aa882715433cef156d6586341b5f50c8a4 GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGsZd0M!5hX)9;rcXyqRRA+R#002$RY&qox!(I;tiatq!836tfEpCMGHrtpi#hprWH0 R%*0Gi1Ps#B9@W)B06X1&k5K>s literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mt.gif b/jawstats/themes/default/flags/mt.gif new file mode 100755 index 0000000000000000000000000000000000000000..45c709f2bc68af31bf62940c2765474f1798639a GIT binary patch literal 369 zcmV-%0gnDhNk%w1VGsZd0M!5h{9|M0=H}JY)8gXd+}zyq6BG0D^7T48^Z)?t008nX zF844n^(7_xQ&aH`4fjn=^*%o4008+yLjL^y_A4v&A0PNPHuW|(^BEc9008;`0Qo#U z^D;8u008*-`1kks_4W1d@9*vH?fF+%y|}p4$;rvc$olW^`dnQ3OH1=LHSgWs@$c{U z>gxP*a`^4->+9?M^78um`S?ag`~3U+@bLHR?EUri-2edj`T6_%`}+F&@$vEg{{H;@ z{Qdp?A^8LV00000EC2ui01yBR000J#Kpu-nB(5|Xgc6ZRfMkMSulKvT007je@kkg1 zq!RTPYe+Vh1tsO2n8vwT33!M%Q3az80A1@CO2Pzy23OFzU0RsaB P1SJs>85tco)Ik6{yXCVQ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mu.gif b/jawstats/themes/default/flags/mu.gif new file mode 100755 index 0000000000000000000000000000000000000000..081ab4533607939fa2bb70838fc34e35024272aa GIT binary patch literal 358 zcmV-s0h#_sNk%w1VGsZd0M!5hXLpgiSZP$WRO4r7SZaqkShP8&IRH}tsWeF@M5grg z9I{ASQfj;R_bo=PMwrei`}|AYQ&U4-vj8yw`};!q`8v1&07+!I$^ZcJ@)M-iJ^lS{ z02xc0(JTNK0F%ocb%UJr^fY*j%c=kX=5TR}#tlqfeL7RE=z4lqal!oj0001oFQ6~@ z_%-$QB#@o3T5!GL;Q+~dh!2YZVYvWbx?nF&tVsX>hX4Qo07T(lUZ~kbx!`7w$P=H_ zG{XP@A^8LV00000EC2ui01yBR000JqK+JDAv>1=0ttvyIpt@ zV8r6K62V{$#zi7IootDOBv($Q)aydQ2AAhJFCc;dgan2JCMEzLDjN_G6ciOL4Gk^| z3K=0WjgXR*mY5luF*H0o8X7(w4-X$7JtZX%GY2&_0=W*m2E8o59tXn16UD|J$R0re EJA^uk@&Et; literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mv.gif b/jawstats/themes/default/flags/mv.gif new file mode 100755 index 0000000000000000000000000000000000000000..46b63875b1fb72f602ec068d935042455e4ed795 GIT binary patch literal 372 zcmV-)0gL`eNk%w1VGsZd0M!5huG&JNjG2bX7 zUf*8qWL@xAR&wZd>Hq*(-dlR?e&j4S;mhrjc|>04A$;8)`S z0OtSzA^8LV00000EC2ui01yBR000J&KoICh^cj7XWaYvHNuH9y;BY_?2%g5`;v{rB z7+xY_k&Q@zMWCA#i9Uv10T*cjAc5Ziqk1!D0yZ}hCL0QQ10E z4K5!A3<5L;Aw4e-84i~V69ok&Ius@_FEym52oPo@8ZjFiD-RDoF%A`09$5$1RfRXqB literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mw.gif b/jawstats/themes/default/flags/mw.gif new file mode 100755 index 0000000000000000000000000000000000000000..ad045a09c124c010eeb1ce5adf28a3b5f28fba4c GIT binary patch literal 364 zcmZ?wbhEHb6ky*$`1tskt};Cv73Hj{sjsj9l!1YTh2fi-*-vZhJO+lp3=FYLT>tp{JFRo-FgKeO z8=H10ZDC~Ol9G~$h4%Iv?WGsUM7y{oF853{H?QBG)m2&PGtDq@UsAD?lfhC0<;BVj z#tcB9_>%=hG3bB@ke?XXIuFb*@UWWOb|OASveA--DS+GID~IwG@e>Cgz7aB;c;eS# z$*AZytAk!GPFv(pDNbC$H~Z|;EgM3##FdN7*m-%?YU)H;8jH)@I%?}#SX7mz%uO{7 zB_u34I2ac(TB@+>@f!)t3kcX68#8aR;bOHC5s{SS=hqfqZDS*_m6cWMxa>(;yE9x| Ic8(0z0Cd)M=l}o! literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mx.gif b/jawstats/themes/default/flags/mx.gif new file mode 100755 index 0000000000000000000000000000000000000000..ddc75d04d8f2b05b315d7960abebe0604fd9e1fa GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h=W1?MqI7z=lG`;q09yu2oow7kOSk|4gMO=WUGP6008&*_j9z3-aSIuFE!ygI_=U{QTe5#NOoIjeTn0 zPgCSzWb*Frqq3jR&(FZHllS@f`1JJRN>BCo_B@ne!esC^{avh*CKMIRzCIsgCw literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/my.gif b/jawstats/themes/default/flags/my.gif new file mode 100755 index 0000000000000000000000000000000000000000..fc7d5236148edbed734df8a666731eabfe88968e GIT binary patch literal 375 zcmV--0f_!bNk%w1VGsZd0M!5h^ycRK@$vKMn%&Wc>gwrCP4ndB-bGE;007*krQl6hwg3PR2bl8W;?|v= z+c`t-!oudp#sC1t-m0qLEG(0d(AyjwOiSF{&w|6PC5LxQv8}`L$Hm>dyYA)gZEfLq zb;9-U_3P8q_ut>$)TQIvp5Md6@#pS4JK6i^<@fFF57%;0^5q7T=u^K8V V9UTu35D+*ZAQl!qJsTTA06XF)t_T1C literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/mz.gif b/jawstats/themes/default/flags/mz.gif new file mode 100755 index 0000000000000000000000000000000000000000..7d635082a690908e3fb17ac14c490b6e39eab441 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5hzn{ItTgr0 zDoM0SRJv4k$#wbKH`<7D=i|-KQCR?l0Qb{IX~JncI6L;oUi8m7`$Jo91@Pl4&nF6HJ%NMG!|np7M&mJFnd`S z;Dk7V)%HGxlDY(F!(afG;L$pKA~KIBQ>mCt9zFsFHx?imJbfl7Cn_oxf;$!uh#4y@ zBqTa1DJwod8WO{DxC$Yl79744z!$n; MATw7ID zxc~r<05kw8qA8o7*lKFS`8zusoEwLP!}w-x>*4D>t32W0@A!#{^3v7p>GAk@cW`jU z004T%z`N>543qa92rdRbTTX? z0zpAR?ol+JQ4KNphQ}Za=9GS^I)opnFrH;D5NQ`CF)Iu|8ww8=E(w7cu10t>=AFvDtISC1?JS!^|BqSmt R4Zlq`It0=T)Ya5M06TOHp8)^> literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/nc.gif b/jawstats/themes/default/flags/nc.gif new file mode 100755 index 0000000000000000000000000000000000000000..b1e91b9a80f4e4d69a3225e1dce5faaf099e0499 GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5h`1UqumfigBbxln;GlW^1nnM5xtQvMkiKydqb4~mE zOZ6p91xLs897bA=+xIhAq;jj9Wutth<3o&Q{rp)beNdsHPy72s04BQtEdXStf&etz302BcAJz(Vk0GY1JkF)9aD^ih>H220taUFf^?pvR{s9m6a^}#yc z;&5DEKu~{b{JDF^sD}N%gIJMx)7Mb*^IoXOQ@7N4B>**Zp5W5ZnnsanRD^C$gw_B{ z%K!iXA^8LV00000EC2ui01yBR000JwK%daZU~G<dD>FPV6FU$1Tl#-7C literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ne.gif b/jawstats/themes/default/flags/ne.gif new file mode 100755 index 0000000000000000000000000000000000000000..ff4eaf074e9ffd097b3820ad9c56fdda7e336fd1 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5hRJT99`H4pOc{Bh|001ul0BivKq-omi z-5Z!3)z#HJsyzPw{?X;pCZ8tq^78(xbS|PU_V)Jd1_1LS0R5U>_T}39IRHtqN&A&l z`OdXry<+|C;`!;_)#%mw`uh2@hWqQ`L#{(Jr8EBT<^QjG{fh{R2`<`I?)V<&E-~N_a_1VeylTP*H)-|X#p~s>8{QUIv z^!4@iA^8LV00000EC2ui01yBR000Jyz<_WV$QUh1OT`j6IVI49ltyc9a+Sc~a=C3# zC<0-%DijD6oXlkMct-Hg2ZPaJUO$Jv*Q<#J9268kK0gc*dp#*GWg>$<5r&9-DIpvK zF*Ae_5k3qs0yd&H3Z*O{AP)~9JO~{m4Gkp|5D*IsD!CH}t{nis8XB+-JF~k8$Os0@ M1_#Xt(9l5uJ4gkx9{>OV literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/nf.gif b/jawstats/themes/default/flags/nf.gif new file mode 100755 index 0000000000000000000000000000000000000000..c83424c2c3c02352efee0e63f4011be0129e2fc5 GIT binary patch literal 375 zcmV--0f_!bNk%w1VGsZd0M!5he5-s+lT5?Q!}a#{VxD6FD*%M8gf@OQw9T}|+Qs_% z`tkAcHlUu^q!s_no*yY$Qd@Ws`T^ev2YNBd%taZ)b&HerT01^PY(z-K&Gc9#3 z6Kxa8-N{OgN<@uBSejT3X$?GtJVJ&-Q zlAGcJh$&rKcY$4i6R$4Gs_pAt4c_1a2L504oCv VJZi&CO)EV$Is!d94Ngu$06RnPl%)Uw literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ng.gif b/jawstats/themes/default/flags/ng.gif new file mode 100755 index 0000000000000000000000000000000000000000..bdde7cb3bf708d1ee0bbea86c0b0d407d708b691 GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGsZd0M!5hddYe=r#ABU@?5=K?(Xhw#BBh20CL82GN&^2`t<-e z004ymFQhN^_4V)c@9gsI09gP~wovNu>HuT_Pqj~3yIBpE4FF0204xAXvq}<|5&&!f z{r&wVp(RDJMO3y_RJl|+syRQcKP;pyAD$l>n;8_E6ab3=`}_Mzv`N<1*4f$FT)A9C zuSCbw$K2-J=kDiNxmX~dAa}@jV83Blyjbh&>*(+3y~n*~z-IXP`276*`T6{#XcoB}a*Jd(-OcsFXEWzRIb^=!HL%Ey) zv_XZsL-`yb#3*xtia&y~kLOT#TJ2d4L=l*IIu9cqG9n5K2Otp{0&_Y)4;>^WAqoZs z5h)%5fImGFlO_R{1)3rbk39`HB_0>NbZe0G=U#X^llC=&nx18Q8b z*~KC;8kJau1Zed*od$yt1k#~x9JS8t$N%+uDLOef3=BLzJO+J#I3g%8B!)g7iF}M4 zA}T5*haMh21`-c&avcH!cQqOsHZcbgWF;*H5)~B)2s1MU83b5b3m9YyB`#>ZOHCgj M%mL0B(9l5uJD$t2%m4rY literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/nl.gif b/jawstats/themes/default/flags/nl.gif new file mode 100755 index 0000000000000000000000000000000000000000..c1c8f46d0c328cc5ceae99f0ccd7c5047ae93d83 GIT binary patch literal 360 zcmV-u0hj(qNk%w1VGsZd0M!5h00DIV{{A#>vH&5E`eJhySf}*>0P^zk`uh6#`1tnr z_WpW_T8hK{U28>qx;k>TDrThkJd0frAGJ zJ|Y7!3?LsJ4jT^wArKH68x{Z(4k@EDry2zX92_AYs|=l=p{@d?5V!!t7{$dF$R5fb GK>$0vUY#BQ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/no.gif b/jawstats/themes/default/flags/no.gif new file mode 100755 index 0000000000000000000000000000000000000000..6202d1f3a2df4184878f5ed8bc23aa630d43c061 GIT binary patch literal 376 zcmV-;0f+uaNk%w1VGsZd0M!5h01vKZmEH98^zCF}`uh6sZENy;dei^_23FAb_xIv4 zFM6fq>gwv0xa;FBE9*^5?Ot5H007+=6wLqt>r_(O008MkL-O+Sq$r8H8S8KAKx4qwEzI+G%}a&g)Y3x25QbD!hlDJJ;%`1$$yu>b)6{{G_A^8LV00000EC2ui01yBR000J+K%cOO_*IUTgL1<384SHfuU06)29OoSwQzVEFmNnFct&>I;*X(EH(-}2Ut4`IvFn*G%YA0 W3NpY46Bhss8xhtKBqTiBK>$0|z?fYC literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/np.gif b/jawstats/themes/default/flags/np.gif new file mode 100755 index 0000000000000000000000000000000000000000..1096893a70f475c9407efff0afe534deec81af54 GIT binary patch literal 302 zcmV+}0nz?PNk%w1VF>^W0M$PL2MRYH7*)Xl0KxzO+yDR~9Bd&n)-ENh5gT<88gd8> zINksN8Wle0ZEZ6t#ugrb`|Il{H_R+VwCn%?>V17GBAM6#0QS?<`sU^xC!PigHt+xd zCm)0Ch=}A}T_iHP>VksM008;i+zJmq3lK*N5Jdd&@D>s_`QYFZ9C)t)039us#{dBO z!001*8$=^#$@~*BhC%Fp|N&D*RKe$V2vVE zgga)E<;rVZf~hZEjT=pYS$?HpgsSP$e0P?%02^IScAi~k7044wcNL72H z0022XXp~BFoJMb%ex18}nYmYeqi&C}YKyLAhpKdxwBY9LVuYq;h^v#U#7=ji-oaQ@ zdZdr2zb99Pc9gTbfdKK{n%}h@`}_Og!(2;rp6JhZNN}2do3^;e)?K91Plxa2sJDOF&HKr zE*oYG26Qh94+}pUBPui}0%>%h4*&+EBoQY%3kj96S*)B^MPQa-6ojOH2jJ KKh4g~K>$0!fQ&2v literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/nu.gif b/jawstats/themes/default/flags/nu.gif new file mode 100755 index 0000000000000000000000000000000000000000..618210a755d0faa72b11a29fb07ab7c0c66d155d GIT binary patch literal 369 zcmV-%0gnDhNk%w1VGsZd0M!5h+S2WMhw1sIrumhX?dC~rblC3cP2|Wt?9@x}*;M`1 z)ryDQ^6gRe@>%BGJ^1xp-@!HY@K#%S?&{$}^-DrUv-L;mT4>Cr~&;6Cf*M)U7i=ifm6#>L0A-h+C{{`!3V%V7S%zWsM^{ephu zSXt%a_3Y$C{qs^*R?64m{PyBoZe+BAlET4@;6XMqvHP^M=Hf~8>sa&d zQ~cj?A^8LV00000EC2ui01yBR000J#z`|+~z!VA;U1FBWBrXVvOyNQSO1Hr1@n}RC z2#ew)s0@ArOK-&37#JYRc#vY5Tbs6l(D6uB05B#yHU&Hedm;oLF#-!U7y&0OG>8Nu zI2s2T99>>M43?NVFPj_al}cTuV|24eRGOEZ#pJ@uA~}%ps;HHCopL&7HAET>aRJP@1%w*VbZ zFoFSP7(X&DldJGJkX{u6q0)13Hkd(Sz)3JBEFB#ZI~E%=5qkkH2{kf4EiEMt78pMP z6cjuf2_GpS4;&d97zG8H000=B9-$(nrl=RHoe&(arKc1C3JMnm2?$vWU7;Bp8W94f P!3a*z2MN;C(m?<_p3#U7 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/om.gif b/jawstats/themes/default/flags/om.gif new file mode 100755 index 0000000000000000000000000000000000000000..2b8c77501d4fcb4eebfadfd58e5fceaff2e50afe GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5h+*(=yPyqV+`uOgo=i4(8_OGpsVE0083R;zYDW-rnBYR8;o%_AaR|(JCs|MMXTaJpTIn z{{H^hN=ni@JJvuz)jK;Xt11+s6fdnWB&Z}Gr5_oi8PPU2(?37XD=Ppk0NPJa{P*`X zuQW@zOVl+r@9*%@FfcihdMqNJv%4i~Eo0CzVo6B8OTEf5zMDiOxU0m%x> KKg}vCK>$0WIGL^h literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/pa.gif b/jawstats/themes/default/flags/pa.gif new file mode 100755 index 0000000000000000000000000000000000000000..d518b2f9780dcab0072328d4007ce28bd7f3f064 GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h^IBT&h=}R{0Ar=~hr0RfM@IlS=<;%M{QUg!czAZM z_3I=gfVTM3($e)~WA1BfZL0Qrv-s`p?a$86_V)JiOiW3Y@$B^e^3>G&`uYG^^3?zU z07&itDB=Jb-d>{h-v9tqob>K7G3_fW@jN{5H#S+H^-r1e^YioXK|$}w$MMU{*Vor) zsQ8`8`Wt`s@9*&B@cr{qQt*C$08jDgGBJ3u_qf;l_4W1r{r&#_{>#hD^78WZ^z`xZ z@&Et-A^8LV00000EC2ui01yBR000JzK%Y29|%qH<0z*6k@`pQ(=)3n?2fE?^81HVQKd2L}%iGaDKVEdw7W zAtw|RI6WvlJq?qVm=+eCJplncC=)ahmzk!WD+M(wJUbkT5D){Fs2CVLxf}+^9UUGX NEDa446FbsD06SJcu!#Tw literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/pe.gif b/jawstats/themes/default/flags/pe.gif new file mode 100755 index 0000000000000000000000000000000000000000..3bc7639057b36907b31b465d608bbabe017e9409 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h^*ufEE-v|0Rq+iC{{H^*5D@!CMe+au{#jY>0094c zd;WKK_5c9-U0wAhCFTGC^BEcX008O$0O9}u`bkOiGBV!)0QB_q{7+B)R8;pdG4?Af z@)Q*MKR@&zAO3lH{N&{RTwMKNVfRi>_`}_O+{QUOz_WJtz`T6;rJ6A>nr9g8|N7Z4l;6&9Wb9V>vN7Z;}k0Tv7*TLOTX7cLb60X0ia2{Ohc$P*Sd H%s~J<+RLIo literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/pf.gif b/jawstats/themes/default/flags/pf.gif new file mode 100755 index 0000000000000000000000000000000000000000..849297a57045d279a8edf2657314cfc5e9496ac5 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h>*-{-007)PJmXVS~=I5Zl$?gej>%Xy+eIWCjc!MB6xayJ1RFUH8(khJb4FhJ0u`7 z4h}XWKRg{jdX*#+5+xH8C7m4|JSh(@WMvQ#At43^Gcy(x4^~()3>6gu0vj6^yGct+ M3C+zE&=f%cJBfF#l>h($ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/pg.gif b/jawstats/themes/default/flags/pg.gif new file mode 100755 index 0000000000000000000000000000000000000000..2d20b078561ed92f92a9034f24d382e33db894df GIT binary patch literal 360 zcmV-u0hj(qNk%w1VGsZd0M!5h^8x~$QBin!c>Z;D^(rXy7Z#Wu9A#x?Ha0fs004Ph zT=`X1C@3gIL`2jvG5BRRQ4kPjH8u1yGF)9HO zv9Yn<008_?gxH1m2HZvX)Hyes-+Tp<$^*n4~Y zb7k{F8o|NAG%qjt$~^l^NBc)d^tK;HOG}WDkoKx8jeC3eyf@NOQT28u^@Jt;00930 z00000A^8LV00000EC2ui01yBR000JsKuE&p>lu%LWHRx?u?EnA#nKX~7K;i~FbQB6 z9@(apdl0lg?nI&U%r-HT=|;$GCm_ltka;{vDLW(>TQ3?H95oRR5(GRnE`(`%4FU}a z2nGZNCj}Br2Nw+u6bLX33=ks)o*h324ICk+s2?9I1^^PS2NO02hohLLi>^P%$jQkl GK>#}|p@q}{ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ph.gif b/jawstats/themes/default/flags/ph.gif new file mode 100755 index 0000000000000000000000000000000000000000..12b380acd38aba726f63d337660206bafba34339 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h?EnD%{dn;U3-t8p0002=^z{G$ZTCh-Wg>ZUa>f1q zSo9nmG&HJ0L9qE$RQ>(_X=%a$080J+A(&zsEx%BMH{QSvA zMzSCvpZcn;`DJGM(aU*x$@=p0`}~dn|2OaN8v6Qct*w`)jh10xzMr4kva;e>SGjk0 z#@zq_A^8LV00000EC2ui01yBR000JtK%8etG#HPOWNo#R`4S0;R5$8{D3QVA!5f9H ztwx8zn6x4VOGc7PP{QM~8J!6PI0c`WJejyUSt<$&EFw2K7Z(VN2p0qe8UZvMGZiEy zCMOFE8yF~Q8WJ%umzkRzohVu&F9)TXoErilC^jn<4!H-rA0HSPARs>#0L8||D9I>4 H%s~JUbKv57`IX+(7_4In0sJ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/pl.gif b/jawstats/themes/default/flags/pl.gif new file mode 100755 index 0000000000000000000000000000000000000000..bf10646366e6e2de00d04ca75e60c5cbc662e5d6 GIT binary patch literal 360 zcmV-u0hj(qNk%w1VGsZd0M!5h{qFAkZf^BEJN8OS^Z)?o*4FYaF8Ekk`~U#>U|{hL z4gLK6@(>XEMMd{DHTN$s_9`mw008wQB<27B;s5~jA0PQTI_dxb`$|dkGc)rU8Q%Z^ z_4W1oKR^BP@$wWD`dwZ3Pfz$$RQyj*_vz{TWo7T-;q^m9{d9En=H~tH@&1mE>Dk%q z-QD@?>-+8P`)FwVYHID@-|^$)`}_O&`1sub0Qvd(_V)Jr`uhC*{P*|w{r&y_@$vrt z{{R2~A^8LV00000EC2ui01yBR000Jsz@D(@Q2_ui7b%sRnPk1+&qw9)bUIq@R@=3r zRG&4w?c#Qg~;C6SYrmzfL-1{(x~hKLO(0s$0JO|I|& literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/pm.gif b/jawstats/themes/default/flags/pm.gif new file mode 100755 index 0000000000000000000000000000000000000000..99bf6fdb60bb4e92ef55622efaddf8f322b76e48 GIT binary patch literal 374 zcmV-+0g3)cNk%w1VGsZd0M!5h?t^XN;o`WXG33)!zpqdL042z~a)Y9Q@o8aKS-8iy zR!d8tYGZTO$7JFF03%=p(9_j;c(7Mkr+;*4Kti<4xJ3W}MK(9A003k|M4)nLSdxl; zXl0UNTWQn z(|4Hw08db)Oii@bWpU9>T+&u#e}KN)p=apm=EA8Rl9AwEI2nzYq!I&Itw5<1trek03<;E_85kuJ zje$hLSrAGv%L6nzWCw$di0olVERfYFghFxTA_O`l3U`I>`Zo5O=hzI051K~ z(R_<>S8lfe08IC$s7zz1X_}18YJZxl>x+b1RQb4~o>;?C9eRBNk8W`r_Lc|lsEEJ&qabh%J)=l-If*U#vAcDdW0t59c{qL|M? zT9{XUUdpxCcdTA|sdZm*-y1o{004QLj>=kgbga1}^|Q9!qO@64x&Q9&duhKhOrw8Y zt2YSqof5S0td1JtF5IyBnu)pA`1x=TU`vH2oDw`$OXSl NPt6Sp(9sD&06UU^mbL%@ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/pr.gif b/jawstats/themes/default/flags/pr.gif new file mode 100755 index 0000000000000000000000000000000000000000..6d5d5896709989000cb51a3d13f77593ba68938d GIT binary patch literal 369 zcmV-%0gnDhNk%w1VGsZd0M!5h+}!(XWcK5CcKP}F&Nw-JdHlEl0Hy!|%vx>p^74iN z0QvRx*i%&8Y;0Ux{?kK4@$K#Q_V$_p06{_eFCVq(Yu0Mu1g#KQf}GBQg``_)WL z_44un0Q<-&DE#^O`uqI!^z_+XUZh^7#2p=wj{eU)Jl9!S007rWM*H^l^=@hX`1ki- zVE%t==D}z#U02f4{@KaN_4oMMzrScv;No#|s%WaWd$?3l z`~U#|A^8LV00000EC2ui01yBR000J#K-9rPG#HPDgYxhz^kg!@Zr6ZSDxwQR(rme2 zpD=4dj;J`4=E~6mfIx!*i)D^bIwf1lq2VDI3>yy*CMOad7$5*XDHAgU86F-aBqjikL05|~sR#yLddH^c` z{ZCN+Z*TJQ^7)RD(9qEN`T6wq^*EA)g`sSy@VtOm+tkj;Px--7*}^>iaB*p(T-NCNQ;|jW zJT~WeT<}3KL6J1>-QDecPGFy5^ED~-XH4SISMItt`%_2oxIILUMEXKP>S-$G(A3=k z002z@A^8LV00000EC2ui01yBR000J#z@Ko)DRMMOjm7f&d`6>2>T;P(6xay!GgBQl zCjo8;3K<64-zZ?S5o!WK`Ru?zevQCJR_YOQEp!DBcMTLKGBGPIH!lMY1%nU^2owhZ zE+h;LkC7Q6lL!(l04NCwJdgz$83rPhIu#W#12n1`9UTL&GXVh<6cHF04|u})Ik6{x-5+a literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/pw.gif b/jawstats/themes/default/flags/pw.gif new file mode 100755 index 0000000000000000000000000000000000000000..5854510fa9ee2e9b218f8a783b331e7200512ea3 GIT binary patch literal 374 zcmV-+0g3)cNk%w1VGsZd0M!5h^!Fw-sr3MY{Vk;Q_V_gbF5UoT@rBE{09@{2zWe?A z6ic)BJF4{nIpTWB|5CR2L9O^bt@&)j{Y|y{amD@sd;0)z_FcaI{`?&O`~-Kxq5wnZ z3zhL$y8c+Y`2bGqII8$1q4gi0^hL4z6q)ifrt=w`^LNPpXTbb>#4U`KTifeJ-R)Blm+~v5?p?h4JgnuO)sBnL$6UMmr`nlDu=d2_VNb0k217Wg2cg`?cj|ZmKYK8v+zND;a@583Z(jCJYUV z6BB@fFESz~BmoT-5(^_W3KB;M4z`ua|7-SPAJ^YioT?DFsO`}f(|_b)H>_4?=C-GiCy>VSFs z`}^nV@a^yU_SDh&($MzI$oTW~>UneN>hN%Z%JcO4_xJq#OicCl_5A$&{Qv;;^z;A# zr~d!|A^8LV00000EC2ui01yBR000Jvz@PBPD;5_>Bnb4&I5UUC<|OCLdiK6o5=c`StaMQcHnNM|M6p zWG5hOF)4pdM*IBxg;GuM?(A0$1?lJKmTG14@bHdbTJ`hu_4V_2K|7&%bewZ-a5ph} zML&HFMX?<>TYwrht5fRZny~H2eGe{r&y=`uh3#`S{{H{} z{{R30A^8LV00000EC2ui01yBR000JwK+JB45oZ=7$k?u1o-Ww zQyM@4(hv@tLCrhu@o#}@Z;vhj literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/re.gif b/jawstats/themes/default/flags/re.gif new file mode 100755 index 0000000000000000000000000000000000000000..43d0b80172e97a08147c64f811ea5c7775ad46fb GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5hs;a7*ui5eO@$F<*#M13od&TML>hy?y-rnB$m5kKX z)Yt$3w8iJV%jsr^%<5`g?(XiPwcY0C=H%q$?sjUj!{w&A-t&HP_xJazz2WW&0CJMj zs?RiQbXoVKJ@hTySuv= zN2U1q__xUC>|Rjp>+3{pyW-;FpP!#^kI|;N;Ipu>uD|3gSFo+9_7 z>~odVA^8LV00000EC2ui01yBR000Jyz@PB9K_CFBujQ zjbnlXC>KmW0Po!Z_V!r){ZaeyVEp`L^%SwzVzog`06(D@Hu4#=r=dt008Ib=jvcp(q3Wp^>_62^zga4?W3f@001?Bw(;@t z09Bas^77^7<@NRTA^8LV00000EC2ui01yBR000GRU?hr0X)Y)lAuKz+Qz8REwn9)a z3{2qvH3I_2s8o7CU+tiIJTMH#r9drkID!MydHHk*)hkxpd<-a*fmJ;IxIYX6fnl+9 oHXFsqV|f#H1b27}3LPGLZyy^Sj2(oG9t{qY5)vMln3*8}JCP7%O#lD@ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ru.gif b/jawstats/themes/default/flags/ru.gif new file mode 100755 index 0000000000000000000000000000000000000000..b525c4623312f57d837c23d28d18fdb97e730de0 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5hjg9#7^8NHJEf^T{&pl|Ioc{d${KqF&^A;8`F!xne z{o~~C`deH4WMnEU_Jf1>A|mzr`ug|x_xMmy`aL~#bpGDn>h|{bm6iO`M{w)_0QW>h z^*cNB002r#{lgqh;ebFwadRwpd3${j11fPZgLry;eggw3CNVS_ z83Y73HwOnFA0#9003CJ#W_foV%^7cdX_ehGj%=Gw9;mAnu^D_W7 z=LduTA^8LV00000EC2ui01yBR000Jtz@P9pnGBADj&jBP5uOB&)MP5yJRaD{S?GRB zB?Jr8;PDz;f)^~lU}}|$ZZsi$z6db}lgY?r7d{683JNV8000iJBqS#%E)EM3G&BOc61@h$D8VWb55>g`$jB!TWms0>s z00000A^8LV00000EC2ui01yBR000J$K%Y>EKqQWnf)CD0m(r zJv}=CC>sq86eKMmKM5HN0VyXIG8hmB79;=-r5XV=5-tr23^5`E000U<6IWRmn=~jA QAiKj#Oh3}o)IUK0JE%R1wg3PC literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/sb.gif b/jawstats/themes/default/flags/sb.gif new file mode 100755 index 0000000000000000000000000000000000000000..8f5ff837fe4c9c0280ee8d3e4601725c86099fa2 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h=F3Yvg*&9A>&CB&R#+8hXWlG(Eab^=%ELz-avT5v zyNiqG`1t&CbK*mbL#DGuKtJ0_O5Mem009BWB6cEdY~WH-+ftKLkAI^^Mb;E;6k1!{ zM@QcdX$~}jG$nT>dwb=-sE7aw0OQhQkyik>oq}+jK-IWxrkAL$qP5}FUE|~U005uT z()GW-L*&F?zQt&@weYW*0H3Wt=*&N!p6W|W*j0}*l49~5{KF%~rz9CJDkgb4`&KMEBV z5ji0M2se=l8XlDu5k4n9ke?bIq6#US2qp#w6q2hQ20sJ?BQO^iI1Ua00UjQ+KN2zo MB0tX0(9S^sJJi99umAu6 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/sc.gif b/jawstats/themes/default/flags/sc.gif new file mode 100755 index 0000000000000000000000000000000000000000..31b47677e0d51f2958f3c833b36345c5267a064d GIT binary patch literal 357 zcmV-r0h<0tNk%w1VGsZd0M!5h2apH&la}uR0MF>s_*7N=`bz*a003M7rPrqb0EaoI zIrb?j`8z!JwYB?;NBfyY^z`)o{Zjn*Y1r9l^YQX}ddm4=V2_TNgi;OnPEP#%0OaK4 zbacsIU%dVOaWA7U`anSVHa1>f!S^sQ1pzMr0D1hDWy#3^`hA7#=imFXXM@Otsi~>p z;A$(CCHOizmzk*S_48)CX7}dp=g-ge!ov2}*Y-q2?(pvRb#?ejNwe9raB#%d+kE-$ z079-pA^8LV00000EC2ui01yBR000Jpz=TkE(inY$q%u)yvOG|U$zmZ8G6JTk(~3k2 z4iFhbdcSh@gVtvZd#003=tu-+(Vym_VDgS_JY{{BRK z#{dC{7+JJus@d}L@_Du4_4V}tNweYM;Z2p&#oX?Y!Q=J%`%;3+HgmrK6qrSn%`J4o zTAtQNjn7k_)YH_|01A&Cbio{b#432i057Wh`}<*!&`WE;M}o<3uiYPj#+}LNC4<8N zRi#s**d+4_rI1Ud8VwT%$LkG9 zm4tY8nRFDDE~G&S9B8pp0*6unx)cKn6nJnh2qh&xJ6#P1AvOyE1uh;Z9fVyYFDfDf zizyQd1(H1w5FQL6m=Q226ofb%8vqavGYlIG84o^$6$T?A3_1?K8U!AL79M3a8Uq*u Y0KWo4EDInq86Y4F3j_o$A0I&gJ6ofk%>V!Z literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/sd.gif b/jawstats/themes/default/flags/sd.gif new file mode 100755 index 0000000000000000000000000000000000000000..53ae214fa16b78b4c491add45bb56f70f4339a6a GIT binary patch literal 355 zcmV-p0i6CvNk%w1VGsZd0M!5h1#HJ(<>gwuk#BF=edi-N!6ciNu?(O$XO#N$X`a(kedwNQ>O6&jt z{qFAb^Yh~3;yXJ#`}_O$=H}qw;50NePq$C|R#shMU3kfO_)}B;QBl3Uy^z0(K}10S zJpkv&$8M}|T*6#$l*FC5{(%MR9h?+zy#V#mJ^0c!5^0?raiBAOsQ@Hw?3(~Ng{wV@t_^9H00~z5)<8pxux6sb zC3&I%07L!TQTx|M_RcGNu*&}3S@+N{SedzCpS}Pvbp6~^001HU*-HQ!WBl4rd9KO! z&oceN000wR_ts18p#W2swf zr~pHOA^8LV00000EC2ui01yBR000Jzz@PBvYBWry$wc+SU^>50h!qI%7K=?uN0Kq1 zp^`#$@-P4zOT}jZbaE^OuAH)^*9MNJ;|h>HDIXaF4RtgN26(1d0tj zD?NgQhLi+5EeR$IXOV0i5eErYSWN=oisUF9Ss@MUJ~LPFcm&)v_@;nUOTF){LZc=^lA?&Rb7yuAGG?)~!e@L^%` z=jZDQ3G?ac_3P{FK|$z6Md(;q?O0g*`}_F#`1SSm_V)JY008;<`SbJh`uh6!_xJSl z^z!oZA^8LV00000EC2ui01yBR000Jwz(~#|gcu=>WTV2&ohS?dgCG!qSRUGhBgs)x ziPXgez=SfElBUyL6)uU>2@^xBKQak~p(0!+baoma9}XK400{|KSz8@43Jx$1Vk+U%X literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/sh.gif b/jawstats/themes/default/flags/sh.gif new file mode 100755 index 0000000000000000000000000000000000000000..dcc7f3bcffadfaf36ba17812e55f66c0fd10b466 GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGsZd0M!5h_N1uI(B(o`u8Et=MqRQrOsen)40MCV002uoQmg%E zX3wuVOJTLTqDpFg!TAVRxPV;gJFGlwVI~X=wWJAX}C5{ufeNT&#^$$v_ar?f;Ug7psm@myx(P! zWdHy(A^8LV00000EC2ui01yBR000J%K-8gNz!YRF(PnvRUIc(ZBoY|$9F7SolL;XV z5RXD3rdbFAK|*3dU;q#@egr`|)&KyA^78WT?(X_qTl{2XO;pbGvA6pA`b1CB_xJbtQd3)F)A~I< z_V)JmJ3I6M0H-Hi^E5P~9aZrS4Xrh3_V@fiOw9lQw=O)%;Q#>0Z|2P=x>$^&uhg?)LaJG~nR$FF?&d0028l&mS(t0};cjWSy2-qo!Y)jgsTt008y% z_5c6>A^8LV00000EC2ui01yBR000JuK%YoL4$SBGv IJgwv0xa;FBE9*^5?Ot5H007+=6wLqt>r_(O008MkL-O+Sq$r8H8S8KAKx4qwEzI+G%}a&g)Y3x25QbD!hlDJJ;%`1$$yu>b)6{{G_A^8LV00000EC2ui01yBR000J+K%cOO_*IUTgL1<384SHfuU06)29OoSwQzVEFmNnFct&>I;*X(EH(-}2Ut4`IvFn*G%YA0 W3NpY46Bhss8xhtKBqTiBK>$0|z?fYC literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/sk.gif b/jawstats/themes/default/flags/sk.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b3f22baf9e1af04495b4044dc6b7082552f9f04 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h`uh6xD=YPOdZqvX{D+0t!`l4v^Zot(_3Z9SW7g^b z0Q5IE_(n!VT+#pmrFx3pcYD)3Sk(MvVrF*P?c?P085#OpTj6_*S##Zknd|h6koi(m zRc+XWli>j%%lG&9@&EwPLR!iyM)3^|P-oZu-rnH=0Ew95{q5}bo}$h+P+f4<@N0AS zkd^rF@P>86_y7RMBR}x1v*+F4{msnghLqs5!}93rthes`;^B~*;cITr_*h!q008~< z_5c6>A^8LV00000EC2ui01yBR000JtK%Y=(D7st-#O+3*_GVcXs8?y!r_n-4Gk-Fc4=#Te}NH$bp|bk^45 zii+iD;b=58%TiL+K0eR@0GIRg^8ma6dU@StW!5@6&j0|30G$A!pz2=UUR>K;EiKXe z`}++Iz&EA^8LV00000EC2ui01yBR000Jvz@Jcf8yPJ~3t{;~I1vDVMq@A>4l4($+36fq z*;*vB3j}JYfb4S7K_IqV^zksnEP{c)*J~*h3kwW9K0F(F1AKmff`lT5d5V95gFYf6 zJ~S*T92^uBFC-ZmI5QeZm$h@{>+^E9`isQ<0BQGNtM+BD z`T6tyd%OBwsPt;F_y8o|RipCt_4NQOzN}z?zWa{2fmx~eYOK=n z`TtdoNKc~mezW1D%+i#`_hp^acDelkQ}0NV)r7$OjkmFi!1VU^_V@Sq{r&y%_y7L> z{{R2~A^8LV00000EC2ui01yBR000Jzz*cWaDj7}4g0j=;{eHeEkN2o<7K>dID&=uD z*Q{f8YI^(6iMbM-wv`};>!xl~57L0G(5cgT0(005WKJoorCRkl0k*Z}1EMqs~T@AfLO-Z1$1G@jH!!{k8x@@4$=Y5V$M{rzqD_cn3Gae~M%jLtP!xmeu* z004miA^8LV00000EC2ui01yBR000Jwz@Jd4Dyjg0fO0VSIi4hs2WP9@5?Dmj@sf-L z0u2cBU>y`%r#BQHKXPY?mO&bYE*jU&v}!3J4IcvxI(GyhG$(Ed?D5n;Qou76u|287HNu3mdkp7F|7T6}=P`W@kPY5ycT4$SElk KB_%%3K>$0(ftB|F literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/so.gif b/jawstats/themes/default/flags/so.gif new file mode 100755 index 0000000000000000000000000000000000000000..f1961694ab98384142d534dd682287dda3b37892 GIT binary patch literal 376 zcmV-;0f+uaNk%w1VGsZd0M!5hl*#@8Nai7+^!WgD_KCv# z;_diGo%D9P{RM&j*y;L4obv!~_CcBQdA$Bvrt<)H`AVPkb+`F!wEI@1@_D)WeZ2Zl zqV*7m{vnb7aJ2UTUhjIi_I$hgX|VTGqViFs_KU>*akTis-TJ=T_p;Uaki_}8+WS?f z`4fr%A^8LV00000EC2ui01yBR000J+z}Ii+YJ3(8lSU+w#9|GA6oA3pHWtQgg@Ofs zfJlVoQ7BTBgh2p#1YBXVqB5EI){qu05S34QARs#zHZ3O!1Roe>DJeM_89ERMCm{!k zH)m-)92^@Rl_LTK3ma$^1``Z27a<`d4kZI778Df+26-nPuMQ3>10oD8TsRLj2?qiK WB`P%o8ci_;1p(Fs*aO-GK>$0Av#T!v literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/sr.gif b/jawstats/themes/default/flags/sr.gif new file mode 100755 index 0000000000000000000000000000000000000000..0f7499ad954a455a4742c4b53c3c8c2e3f558275 GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h{bgnVP5}D-`e(st?DFjO`Str%RRD(o^B5TW%|-w+ z0Q^cy0Ac`p%6sVV>GJmT{aIT3Mn(X20A0Oa^)fU4cX#$nOZ6fm`SUsZtWrp_N%*!h z`N%jstUdKBEA>4+GNv>A008Cy0AapkRJc|5`}p-kKHmTUHK;eq*~>w$LQb_%{7+Bv zE->^rIR0*M_(4MUMo9KZL+$zT`hr0CQBe6^UiQK&`q)4Bd@xY9P*}QJaK&(S$aT}@ z)&7c%A^8LV00000EC2ui01yBR000Jtz=LpjkQgP5Wb)8xHhMhXU@)5ONV>pGz~z>{ zg~DU}@P&S_Gyssv7;2Un%q9v|AO_YVfx~eq9v2rMbuW1f5i}SWIe`}lgds0_5ilGZ z8#jUo2rhLMHh48~GA1q*Eglvp1Yltg1hEdYvndi(RwOGL8Y&$fC?FsTNJ#<5#|p~J H3PAunnPZt? literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/st.gif b/jawstats/themes/default/flags/st.gif new file mode 100755 index 0000000000000000000000000000000000000000..4f1e6e092b35de465031930db0bd661ab5e1665e GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5h>+(1NYXDigRr~u!tf@8tDgf~S0D8)J08#+;^(Ksp zB|57#OS4D$XG}AuF87sH=sZ2EN%iwBqCt&9G(Z63I zC5FqgSU4ElO6-wZMcx3wWCBs~eiaGrF&MB2Fc=Ug2_hGG5)BOlA}2Tm2?{tFhCd$? zIurvi8iWZb87&xx9}N@{adQwI9UL4QJ3lusV`dIBBO^T|Bo00XHCI_-wYClgAxa3# N%RbIN1qD7q06RBYi{tlp#qV34i@{^(4g`4a4_Vxe(w>w%R&?NpnbSvS+W;xo_4W1q{QUIv z^!@$)A^8LV00000EC2ui01yBR000Jvz@2cXP<%eE(}~0673_xJ^z5$PLO3 JD9tEA06WZouv!2B literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/sy.gif b/jawstats/themes/default/flags/sy.gif new file mode 100755 index 0000000000000000000000000000000000000000..dc8bd50948773d5698d49ad4a214a9847fb09d5b GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5hWMpLfMMeL6dRtpt^Z54G*4F-Zc2ZJP^Z)?t00918 zUPMGh78VvQEiIkZpY;3oG&D3mK0f*Y06IE44Gj(V_xJnz`}+F&^78WW@$u2o(WTp` z>GSJcx?cTJQTkk5jLwen`S9-U?)+n8{cCGWOH1}FEaC9s&(F{IF){czH~3Ri`Bzu@ zOicY$RQ_36At538JU#tzar^xH`1tts_4WMx{Q3F${Qv;=_V)Ah^Yrxe{r&y^{{H^} z00000A^8LV00000EC2ui01yBR000JtK%dZuE8-*)gc6ZR_ykacK}I5t6d%^AIv6{aadLEag`pTaC_exT5fcy%4KOea3=|X%Kdu7<2L~k!u(Gqfy~)bU Hy+Hsw(&wg* literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/sz.gif b/jawstats/themes/default/flags/sz.gif new file mode 100755 index 0000000000000000000000000000000000000000..f37aaf801198a2afc9700c33f0c71a126358ab67 GIT binary patch literal 363 zcmV-x0hInnNk%w1VGsZd0M!5hP)SKIa=JS-G|P)m+04jKi^iE37kQ1f3|ghfuCK+v zy!pv|^0!#~)RX`(j+wmEt2H#&Qvmh7WXN`P^N|9w&fx$>ou$Ot>ZUoCxzDmpOx&n- z^y}vvWU!60$?dE|gssJ`%HF0bDZg7<^}%lLu}-6#n1TQRIDEP7vQx7|K$AK;o2bX* z;NF9Bke|TT+?ruTgT&>+xd1(Px`0BOMMh>}V!~KdkBf<+owlM;QM^-3UXKTY(pY#G zq_9N7D3ciXq~*0T001yqc9~yusj-_rQfPT=jJ;2Ft~+I=VT8GruG0Vj6f#_( zdw8NeVyW?`rYlf>GFOCig^kv&x08maHejIu0AXf`y3(>idm}~m>CH-UuJFrVP;aPR zfVDtqs@>Gy^A^8LV00000EC2ui01yBR000Jyzy!yDLKy;yl5)Xh8V)Z}?$F4XOqf=oV1d{G z0L4$C=&@XpP$;5;1P-1Wz{5ZgI=t0`Mu12fItUCIA|n?rFewi+E^asl95DnKBP0$d z0s=c78YLALDg-VUBpU-eGCmU_Z7Ng}vMDgWn^XPTyO-%p+miX?J_wA48NJ?dc&%gix@ZxCd zMo8@7TkYa*6+^k?Eic>2A?eLf=srK{&{XT*SMTVa!K(nxmjLERNb%Wh04=j+gw*um zi08WiA^8LV00000EC2ui01yBR000J!Kp14mlPQjh-($IiB%X)c>4ZZ009e4oIgo%p z6bgy7E44BK0asE1lL(H*nU>}yygkp`F#~&-k$9M literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tf.gif b/jawstats/themes/default/flags/tf.gif new file mode 100755 index 0000000000000000000000000000000000000000..51a43250963e5862d4cbf19d34a4cbb53cfb3b7b GIT binary patch literal 365 zcmV-z0h0blNk%w1VGsZd0M!5h001pZU8DVNZ2$pje2KbYajtcNv-vqX000$MWuyQA zSN#0^Phg}#QkuNN)^2>YiIv1WPMJ1Il|E3Ic7(Y4K|ufjMvR!oMOdHvM@Lv_sQdr` zI!%}SOiW#EtT9BAMOK~SF!)>sd0a|`}_NDe6vbhpg~idEkTe^V4~jO=Tc*&YI(B&33vYf z{{8*^A^8LV00000EC2ui01yBR000Jxz@E_e`)!T`h0?<8T`s<;U^+XESST65Ns0bS zoeU#@c||l^$c*?4SID=BWCs{P9>2vRQ#oL691>-#1P%=opahkdnGGB!Ar3kQ2nrN4H9V6kE(tj+Aru_B3QSA@ L%m4__&_Mt@20fAt literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tg.gif b/jawstats/themes/default/flags/tg.gif new file mode 100755 index 0000000000000000000000000000000000000000..ca6b4e7744dd89a6bc12c61900830fd7054c6554 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5h0Dk~jxmMc47642D^2ro9r#5J^H0#z#ZN_We$SKvh z1^_Vt{aagHt0hmR8T(UH`bkOte0=iOL;iJk+L8d~%`E_80QS)<{@mQ|(KO@FI{Ml@ z``SeQwYL9-g-WnS9hn^fasXnzU@@aE_0A*s)iq(TFFUb2>)d9meE|F2N#~saMXo|n zv`+re&_Ap@`{PF{pez2HoBPE8{N!r=R=!E6)`2{7IR*wd4GlR1J|18X5D+H?BQZQ6AO#C~ zZj2B*CWQ{41_LuRDjXXdb9E#HtT+@3CgjLrD? z`1bbp?EnCCbHrO*xc`EI{B(5u{QUZAYCAitgoVla`ug@&Rbpehnw!=D0DAxcF696K z_gGjgETMOJ#PUT&N=mXpMX`H)#`N^`Mn3S?zx3nKxuvndD=H4<1_92Nz?A0IqRO~o6>FfcsJ GK>#~&ADH3* literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tj.gif b/jawstats/themes/default/flags/tj.gif new file mode 100755 index 0000000000000000000000000000000000000000..2fe38d4ab9213a814453896b2edaa13d69751c4a GIT binary patch literal 361 zcmV-v0hazpNk%w1VGsZd0M!5h_u-uK^77qdV?>HXQj=5ENlDQ(G~a7$J7MMc=y z*!ktE^wo6Ybaedu{MuGlEqW~$Y!=;ITmTvX_St@!008;<`7(VnK88ND007xiQltO? z4Q37a-i@sQ0K5PI_xJbu`ufw;)Arw&*G*0K(P18O9$lJU`10Lkpk(>!wmO44SeIDz z)_6;fOZCrPBXuLrEG+ligEfFPE_^QZ_4U&{J^TCn_V)Jk^Yi`v{q*$o{{H^I008y% z^#A|>A^8LV00000EC2ui01yBR000Jtz@D)8DQ1oy&t_TaA)bxs;UEx59vV^;A?adC ziG6m&a23ORXuHz5Eca|}BhgiIU*A&0~jkaG!QT*5fL05G(W2+ECd8D1Ff$Y5D>Z(Kgr6= H%RvA;T1}p6 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tk.gif b/jawstats/themes/default/flags/tk.gif new file mode 100755 index 0000000000000000000000000000000000000000..3d3a727fde64fe5afc971a13eb412b6adfd2de77 GIT binary patch literal 372 zcmV-)0gL`eNk%w1VGsZd0M!5hN`-D*b=Cj?i+Ymfv9e^Ks+7aKP_MM8m!g|0N64?R zUCYB)=IQr2RLcMWrT_qYR&LfzWz>w7qG^1}WO~}ArDQl%(d*n!it#^at|=Q zZiC(|ShZE6J+iZYf{ukkUC;mkv==zTQfkCSU%jWNdN54M-O^Zli@vzFe|m$Bf05cC zKgQqLd|RYYmX>1A$Y06EdDhKt*wAI;+=h{!fsvezOXSZ9d5~1|~QjkCxAr=?}AQdfnA{-Di2t6bg7A1rRBMkzH z5h^z*7#1fTFFY`n510}=F*ybm9RMBx8z-d{AtWXXHUtV4t{brr4io_p69qIE7djXK S4JQe}OH2X})YH_|K>$0GgO)@9 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tl.gif b/jawstats/themes/default/flags/tl.gif new file mode 100755 index 0000000000000000000000000000000000000000..df22d5823900f670fcccfd571052d18619ac8441 GIT binary patch literal 360 zcmZ?wbhEHb6kyP#$Sy@>RA3l7_!0_GMJ0c?LPjd1n28O@c+234TJ_!r|1d5xP{p_&*rmg)+Pw%_F z{*R!bpJ8E3mMs3r%Ue}d<>lq|)5i7z(7Ml|KR4UVotE^o%=&L|@UQzpKYuy=d}{sO z%3#)_`2U;?{~D`4UAO<47Fk&6`p3uTUu)Fn)iu9jVtjmp{>1q7PmBEd)8_B4n!7;T z89+esCkvR?0g)g-F|f5d96If;6W2FcrTOFLj|puWtx6N`*vN7iKMA@Tq#3o);1Gk! zt$2+^+MGp?KS>5w{;})xP+D+G#6U)hgPFUGuU&~<+gh@*xuvYa!kAGsNW&kJvCUQg1b!{qiMqQS3Jb+e7ief^9TsnVMQIBd(jAkHiJ^(TR z(sE@CVl9uho*Qa9Vwrf(YFx==Uu2qj%x!0^001v`OLnM=#amRnCmGavY_-n5b*G3S zZa=@&$l{@y!Pd!uu9CN4UekYdMu%TVh+)lTQ_*Qug|L;uV_;{VecYOo-imP5g?<1z z00000A^8LV00000EC2ui01yBR000JzK%XyF3Tz&o$6@(v{(J@k;l+wEU>?vUfyq1# z5grMLF;p6p3&K?SsvI25s^)5p5DN+Iw>gn=A{h(-03H?#5G@vbEF3Z+H5L>jhlw8- zKMx8b11ORR1&A#l0tlH5Ap Nvp)evPSMdp06X`pgsA`k literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tn.gif b/jawstats/themes/default/flags/tn.gif new file mode 100755 index 0000000000000000000000000000000000000000..917d4288c9424fb3a01546189e8765091127b7c9 GIT binary patch literal 375 zcmV--0f_!bNk%w1VGsZd0M!5h^fNQ{JUsPWT=Xq1{dRWt>+9?Q0Q3L=|9X1*Qc~pr z0R6SK_S@U{OH1`5Bl@wi^BNlVw6yxGtNvYG_C!SbJw5tFMDi08`GbS`R8{_Qa{X>@ z`fhIV4GsHYVfp|7{#jZ4YHIvuX8K)S`$|dR008_?Px|TU^sB4=R8;miH~8o0^Ho*( zy}kXx!S`rq{Iat5WMuTAq4(C-{omjDSXlOaeEFQ5_>`0RcX#~n@BLF#`FMEU008{} z0RI30A^8LV00000EC2ui01yBR000J*z@PBvEBZd4gYsZ7{18wAL9+>oJfm8s;Y3U( zAQw%id+=0%0rv@BEC>ls3-=m0C<-3|lzQJz7#IvO4h{i%8apO12`4!e5d{Jc5Qjb+ zCL|9WH!C+b3<3}rDheMVBo-19F#!S*C@dEj03{zH78Ml_GX(`Q0v8<}10@GoS_usl V6ai>y13gPk)C$%mB|X|f06P+8o0b3o literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/to.gif b/jawstats/themes/default/flags/to.gif new file mode 100755 index 0000000000000000000000000000000000000000..d7ed4d11641ae1c1c9001dddc7653973045b6c66 GIT binary patch literal 367 zcmZ?wbhEHb6ky>fLOY4)K-jAT5ud1p)Lqh-N z<$Y05_{huq&Bf)rm)AQ6hOc&Z&lnhfCnkQevifdd@YBlbmy62}GqYa|4Br?SJ~1%7 z0?N9%eUX>{VPf)GQu0q$)}OSrU$L=|fZ|@BKW%J38yVeaVED_x@XOx*|NsAg{`~n1 zM1TMOtEu_@`}h0zAK$-!|L@|(pAiv2vCpQaKdo)Pn3?@cNciLJ^B1TvIQZYce|H%e zK7RbD_>+YJ1av?I$WIJxJqP9oNK9U8B-xv`xzV9c`%w3V)w)iLPIk0$6fCf0Sn%{x zDVLg0>W3fS(so96m->bCaJE0W{(5JbjsdHARt1lskS4bcV_I`7r<{UFCpV*Ny4ZwC zOcpAViZist;M4#va<950ObGx_e)FmLqqyT zM*dx0{(5@(JU#Lg6ZbJO{&sf!etz;UF7zNE`B72*o}T$sRr+CJ{&8~sZf@}n4f;Sp z^(7_x00913S@`7S`8zuLadGn*8T@K${AOnQU0w7aANV&n^D;8v008zZEd1o;_x1Jn zx3~T2>G@b#`=X-vjEwX)Hu%`s^z&K1B2pE7Dgb&paUX6G7L;iE{qJ;0Jl{JU;qFB literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tt.gif b/jawstats/themes/default/flags/tt.gif new file mode 100755 index 0000000000000000000000000000000000000000..47d3b806b5c158d31a3cd8fe558f1d806dade864 GIT binary patch literal 377 zcmV-<0fzoZNk%w1VGsZd0M!5h`8+-RYisit7kqqt_U7jPrl$3ai}o=wb#--xg@yU) z>1=FloSdBO001^NHuL}h<^cioeSP;!OZ6ioDk>^tV`KjF^ZP_ZT3TBBo16KQlm2vd zQ&Us+EG+!)?)5!A_ck^}L`3*fQWzN-`Bql);^Oy3Mf+i4`Tzj@SXlgKX5Ih*`dwX2 zOicSqN&HVw{OjxS-rnQE!T%*C_Li3YQ&ax6wf=c|{pIEQ?d|mA;@i8s^@fK100930 z00000A^8LV00000EC2ui01yBR000J-K-lQ_8{twt6zaizG#WDtV}M{-Yys7YMG{FG zKARG4D<~>zYaIqU7$YMsF$OCSTPa-< XCNu;KlNBY$Oi$Jj5HdtWJ3#FMOnWx-8hvD?$HWv97lqg?>qvO8n2**KTU!;U!T=C}U-{`~y>{r&xE00960 z{{R30A^8LV00000EC2ui01yBR000Jtz@D%N0$Glhi}FHC^hQvP20;Y?WUfab;q&Rf zJl;-1o)8F=miIuiK_H&WhBLrK7z&=lQ8K_Q3v?Ja1t@t83_Cjq3xRbZA9o!B0uCt# zfPym-A}|9T5-B+`a)OW|5e1(TV`XP&4Y9E&7gi4sCMGN@0W~-jz&}d~#2FbYFBU(` H%RvA;*H)jd literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tw.gif b/jawstats/themes/default/flags/tw.gif new file mode 100755 index 0000000000000000000000000000000000000000..cacfd9b7aacab39f8975b3567d65ab0ac0e62813 GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5hT!hm2HZ}K4OZjVVgrwg97pwU^Jz|N}_C!RuxaX3R z+42(;bClWlEiLvcD)KHa_)=2!B_;a+0Qpu|03onbeb4kDAby|S@eK`4c+2`gK<)ql z^*%o4008@8Ve~pW_b@Q~MMd@i0P+9;>Hq-Z008;<{h68F^dBGd85#U$X8K)S`8qmR zfzkU)N%Jx?-v9u8o!jg|OYt^3?MF~|nc4IrvLjctHMir)KbL%AFn40IVgYk3wN9R)E505}yH88dhhC@CKu z5(7LgAsQ@&lqm}~Ndugopp^>?FEA1+ou3VPsu&m#Fd|zMT>=OQ93M9?4-Y;}PERBx N9UUblFh0^j06S#9jNSkM literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/tz.gif b/jawstats/themes/default/flags/tz.gif new file mode 100755 index 0000000000000000000000000000000000000000..82b52ca29807dcb6dfcc632cb22c853b52f41fd5 GIT binary patch literal 366 zcmV-!0g?VkNk%w1VGsZd0M!5hH>mW~=twm*GgMGB0EGY-n(~~{hJ}v++UjFly<5V? zGv((-l#VL^EZzV~%ve}h(#}Hwc>n-7;(Ez?&fNe~wNi4%b5yxgZpTgG-b62?@`{K< z4wmr%MCfkBZd6o4RI$8w$akH|0C{vt=I~w5=1NXZPUY=4K&|$_y#TwnJ(Sm4U%>#R z-b=3FN5SD+laE&K?OZ=UJoWQQ)zW5VWMWgT08zM1*yTZKziEAYJTs!-;OJm(ZLC>U;-H(TEIYv2%*H~(po?UXafo*1`Y%kZg3lCbT|PZ01^=%eGngK zf+q$A1(7}oGmB>oI4>Za8~_azG?xN`0R}s$92yNjH4hIkJS06RC;$K&#J5Zb6gCbW M9TLtB&=NraJ0=2<1^@s6 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ua.gif b/jawstats/themes/default/flags/ua.gif new file mode 100755 index 0000000000000000000000000000000000000000..5d6cd83f597ea6681e2afe62af7745ce3f6ca463 GIT binary patch literal 360 zcmV-u0hj(qNk%w1VGsZd0M!5h{QPM7`C0160QB@60C@aYxYzmlJl?hdD5Lg9vioVm z{QLY%`};)m^E6Sn{NlX;a>o7uX!Y{)6MD)207L0ZveWnXMD_JMYr)=3v-k4yE?vI< z^3?!hz1%{t`SI}$`rZKc+5kMR`2d3cOSb$stN8f%H23!}_Vz0E^(0if{aL*JF{$?e zSMNTn&v3-x`1npkuF)W$^Z;G)E~obZk;jVA=Rd9W{ow#%zWV@AnRm$kTDtn~&j47v z{s4vlA^8LV00000EC2ui01yBR000Jsz@P9p8WE0!h;r6yjV90?1fr#}mt*h$* literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ug.gif b/jawstats/themes/default/flags/ug.gif new file mode 100755 index 0000000000000000000000000000000000000000..58b731ad5c6cad47c4f3fdea21763c6537010a5a GIT binary patch literal 359 zcmV-t0hsTZ9Ldc$_uEAD^(*~SQiX+mt4&QrL`0l3 zGwJ{U^I|pg^BMNoHu(4V#K~8fCvvH7Y_<0hzdd<35^L84=NJ^lmZDq z05Tq%0|OAB8lf5xE;BI!8yhJFtPQRsBLycJ9UT-DI5;7@480~MJ{iIb#Kk?wKFK~o F06WatnQZ_7 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/uk.gif b/jawstats/themes/default/flags/uk.gif new file mode 100755 index 0000000000000000000000000000000000000000..3c6bce15c44106c2df5c7a50f43ace1ed95bf047 GIT binary patch literal 260 zcmV+f0sH<(Nk%w1VGsZd0K@^ZuCMA~Rr!T{VS~Ynna}=XVtbp!|Lf{JQmlm=H*ti=+u`)AVSnMi-(+*O z!o=O#-R=JV|NsC0A^8LV00000EC2ui01yBR000GnV5Ce?*=1Q51Qm2lOygk;;}L`x zMcji75JjW$iF_oI&!s{5FcJ_(MDzF@0Y^%qa!GVN)-V7Y{&)%*0&>hYxZMEDxBPL3 z5%_H+P@p93bqfgr0u>A&4+I-^1_%`h1P&1b10D|?7Z)C52rC>24jU5(0STrB78V5p KtO)}NApkqQ-f7za literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/um.gif b/jawstats/themes/default/flags/um.gif new file mode 100755 index 0000000000000000000000000000000000000000..3b4c84839342c61a9e9b079291cb4b021824019f GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGsZd0M!5hkhb2ayyfgnOtAm})YR1Z`T5EK0NdKzxytP7LqnAS z0PXGV={h=h008FZ=2U#n*E%}(_V)1b@a|n*^!4@I0RgAGged` z<}EGM003Em)7m2=;wUJ5wB7vt{G+(wrMcqs^YdVp+5Z0ie}8|_(9rL1Z}Oj?(HgwPoCbr1xqqpGZDk@KR$ya{R?(XjL^78EL z>|2A?A^8LV00000EC2ui01yBR000J%z@PBv**zY*3#h{Ebbcp9RCFu2A`wcjCqexX ztyU~xA&n*zL4qMLd_}Q>B{BkVc|Ofz=0OC=W&j~-3>h2=13MxC1tb&z5*T z4=-gnf*2+Y7aSlT5DF;;StSw@lN$~W2L~`0D=KMghB-DLEG!TWGO2e9c^fnb1Sv2~ R6;2%n&;tVs3Juml06QBhscHZK literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/us.gif b/jawstats/themes/default/flags/us.gif new file mode 100755 index 0000000000000000000000000000000000000000..8f198f73a777a6af8d3c8e0b9b2ce48168a216dd GIT binary patch literal 367 zcmV-#0g(PjNk%w1VGsZd0M!5hV`H}Z`ug_v_3`oX{6FMd)+t~b6RQz~i+ha=mD=V72{QPBRx?@WGIy&a&mbT%E8IW!TtSPICuH}{{8#^`tkAa18?Ei{{8*o z++%0NA^8LV00000EC2ui01yBR000Jzz@PA!N&$|l2Vx0<{BkH=DIlQ+0->w`_Cs+v zo`Ju(0i zIDb4K9W8?qA0G<`A^`#$8+MVC77acxDm7+kX%V0WxGEYA0Wn&rsXHq)79ulC2u)2S N7!(u-2O82r06XTKt3Ch# literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/uy.gif b/jawstats/themes/default/flags/uy.gif new file mode 100755 index 0000000000000000000000000000000000000000..12848c74131363a1a78d279e0df008422b1707fe GIT binary patch literal 373 zcmV-*0gC=dNk%w1VGsZd0M!5h@%H;fi__%fSEy~E0ryX58U@tnfv?(_I+q}t_4Qnix#T&7(5uVr_4MOio7(N|?EpEfD0jtmtKZ}4@0!2k z>gwrJmf57n=+oBR&ePWO^Pb4g)56Hk?(TV^#OU(!mFe&FgRg5)ut8It(x{3=C)|Cn^R8 zDg-qzb9Hxk1y?s44;Ky<6@`X~i5M6GED8Wh1F_g*4pwM4d#!!qcQlV_X0LQl(QglQgWX)=o~N zs#9y#)#_SWs;*me^YineLtc1zyPZ5(07n2WkS>`vQk5}H003XTz0sdUUgF~Kjw3G;uVrPhOQB1;a)vsXI@#Fj+1c!~v)2uO4Y|45_4W1q{QUIv z^Z)<=A^8LV00000EC2ui01yBR000JwK$NBv)N2g z55eGigLPuDf_n42)IJ{$$6^VMOeY0P^?M!uJv}ZA3=IGPJU%=XEr5cAhKN2OivkCM zgN28QARs;|ZgnGfc`Pghs3$)p5)=?N86^n`2(>yoC94t<5f~UW6t1wbxg-n63jxXj KKh4fRK>$0~?46DP literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/va.gif b/jawstats/themes/default/flags/va.gif new file mode 100755 index 0000000000000000000000000000000000000000..2bd74468d6b328a625c2c3a44f46dee979ec4b97 GIT binary patch literal 369 zcmV-%0gnDhNk%w1VGsZd0M!5h`uh6&>2vnuTm0>e`|5i3<6-H{0{iTR`si-*^77r?-Sy;d*4Eb3)6(nbtn}eki6e!)2#sX_4N1m_xa~( z`}*d=)eem$>`1bABvjFSO z2hY#XA^8LV00000EC2ui01yBR000J#K$XGgGkA`!O2uM9IDMt)U~m|q09e3Bt~bosFgUFR4!2l23cLIxVa!9Aw3uv PA|fvk5D^hS)Ik6{@a)B^ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/vc.gif b/jawstats/themes/default/flags/vc.gif new file mode 100755 index 0000000000000000000000000000000000000000..48213816af17a104ca3d031312588ff1ec97afc9 GIT binary patch literal 370 zcmV-&0ge7gNk%w1VGsZd0M!5h<+T9!_k92)04bs=7nv8M*+f@Y(Rq2~>hd=H{8IAs zTTHS{089Y!^dz?4HpJ#eOR_ES@J;{#v|wP=X1y~pr7`sM9q#fd=I$2!{A2t3MU~Gd z_V`Ed??(I909LnE-|so}_C)>tZ~fZiZsGOyJ7i?uJ*qu|g5K=G0Qvbm4wMe~ z_%#3k#{dA4_Rs+I@l$)qMrLQ$x7{S@@E=65LZjC@?Db3Z^kDb*E{4l1{QOLw(vPW{0^y9Kt#=06`#+-d6>;| zi3CrhSs^L|8+SHQByb!KqJuGP8#FZp1Qh}jB?crND=iQZ4Hg&#ETR%8B&RJpJsTFTEU}{}Y;GJOAtokgXrmG@ QFDlL|0MP&f)B-^OJ8QU=H2?qr literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ve.gif b/jawstats/themes/default/flags/ve.gif new file mode 100755 index 0000000000000000000000000000000000000000..19ce6c1466f493ff8702f776364295095e8f6f2a GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGsZd0M!5h=;-$J0s{U0cl`WmJUr7F7|H$S0Q4v*`BYTv008{_ zTlhvs`};-f!2lv6%=Y#wa&qIDndM4K+Vd6`{NDhECxQ3(PE}Ri`(a{T2v_<&J?Ogt znn#xPJ3I2$0Q502j53Gv^7#M&jY5_H_S*or)BybaO!@ge`1m&f0KWbGRHdcr_xCa3 z008~{QMuY_eHnPH(uwZR0O8{CgM{9$YN{kh863OF{$woXuOh6r26)05&!b4g?~2dwnYeHxV<01%`Nh0E;(* zjs*obA{jLt96386AQcrbs4yTt0T>G!9UmVD2NSjv0Us@`7zn-#z#Xx&2R{MF3CYSW K%q>69K>$0TIGSMq literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/vg.gif b/jawstats/themes/default/flags/vg.gif new file mode 100755 index 0000000000000000000000000000000000000000..1fc0f96eed0e8e31729bd61b0dafaafd9e2c76ea GIT binary patch literal 368 zcmV-$0gwJiNk%w1VGsZd0M!5hv2~Z&tGEgRk^lftJ3OnlUwTx6Q{u$XEiI(VevkkF zGOEL%N=ve1W4!Y{Hb9*F{CK-*|gnUAlM>PJ3Ra zQc|_7tXl7(omPZrGc~4?bEzUCpn;xH001DLzMfcEx#f|R*P5w3Jg?<~fnSSWex`4n zmS&=zZ-88%gAql>zg<5+t~ffW%@r4ygT39(-^jveQ&YZDNvvFvN#bZ{VO6h+dcDrEeN++Tb~mIuCKQa OP0b3=3MA6fK>#~4#*32x literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/vi.gif b/jawstats/themes/default/flags/vi.gif new file mode 100755 index 0000000000000000000000000000000000000000..66f9e746b6aedf561e504119ba5827873e95414b GIT binary patch literal 376 zcmV-;0f+uaNk%w1VGsZd0M!5hy}ix*`QYQ*DC_I%kJ8lA zu=VVWcW~0y*4KiTN%-~CE2lM>r2|&>G$uO z{QUH*s^DBk+3d~G_xJhG&(HAaYxnl?>(w6k^1$rhM)K@)=;-H*f8e~%ro6nm?(Xi+ z&MV&AUhe2I=jYAIzf$h**5u`u*46Ut<)i%ezGP6{lCw>moZY{_ZT0I`%gf91^78!r z{PFSeA^8LV00000EC2ui01yBR000J+z@JdaDzXMB6k!?pQ33(m!nfJ@D5b|^QE-Yb z3kv6y;RHk&h)c)vEi9H@YBFIIUM&c$!2l^P7#R#V9v%<^E;Sth3^Wx!J|ZIr9|sT$ zIU0)z5)vQ|7zUIFCKU+;i){u55I8e2I0ywK8a+KB13s%PDku;n2stZ4Jv=C@s~{jF WG7=RPw#7#~Vbius< literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/vn.gif b/jawstats/themes/default/flags/vn.gif new file mode 100755 index 0000000000000000000000000000000000000000..f1e20c9412cd1d7b33b1daf3b2c178896dc8b1e3 GIT binary patch literal 370 zcmV-&0ge7gNk%w1VGsZd0M!5h^*lW6008s=0RMV=Z$Q(|r8}|tomt>1Gt7B0Re2K6Fw*Y-)IWQI#0Cy89EhP>g9}zJa7Aqu$J`^n` z8yPPVGc}PU4JQN~A($C15i~qIk_`Xkh5lViL;|4Z{t5e0n`vI=`<^?c9IDRa7k-0NcGH0H6RuK|iOTd$6W&mU?-! zOiSd=P_uOaRjpM3Jpk3mb|N4h&A)S7bXb)D0LPU8)vEyM(@)TMcNoVRGchg`#uNPj z00000A^8LV00000EC2ui01yBR000JxKojm~^BIpmfKvHWkytv8v_M5zHGp5J;<=O% z8VF=S#$dIb%H+}#lLr_KBrBUR46a8i<>2usGbukmG#xn)1_A;Kj2jy#0xv%+BXnFaf>|z!4DyxIZ^PF(}Fj L%n1w6&p`k?=S6^; literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/wales.gif b/jawstats/themes/default/flags/wales.gif new file mode 100755 index 0000000000000000000000000000000000000000..901d17507dfa6428fee33367dfa321144dcfcece GIT binary patch literal 372 zcmV-)0gL`eNk%w1VGsZd0M!5h>W+{~y+8f^{g1|Rx0K-U-R{uKzCkbU z_V)7G*vVT_dvPE6`1pF2JmiFbAX}WbY>sxB#C-6A(&>Vx9`KL0eoJ z0!9a7i!BnMtsrrUg&Yiss6i5?1vSA;vYJ64A1xyQ9w0j^4<`&49UXBU4+I%1DLw-V z5(Eqp5e^O;B^o9-7?uhd2N66I8xtllBPa!>mjO94HykV^8Yns_9JB*93knJ^2RJev SIUK$0m_LeLF literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/wf.gif b/jawstats/themes/default/flags/wf.gif new file mode 100755 index 0000000000000000000000000000000000000000..eaa954b13694ab9e3aa3f77ed03e372f47abd722 GIT binary patch literal 377 zcmV-<0fzoZNk%w1VGsZd0M!5h&PhqoR8+<_HQRP}!7eW1m6hRjw5!6hZfK0Vrvjcot`l>h*P004CW0M%h( zi~s=2L`1g_56L<@oB#mVW@gMmL3{uJ+HY^zYHHJ6UC~ZX!!|aLcO;jB`)Sd~r&_Kx8K1!xK#3pNWCBR3HR1_nAiHUcgS6c#Nx zBM>Aw00#^o0t74)76dOS8W1I&p8_>05(_OaGbD|`4_aIa038Sw X5-2MK!%I#a)EOBg8rc^Y8bJU%oBE4P literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/ws.gif b/jawstats/themes/default/flags/ws.gif new file mode 100755 index 0000000000000000000000000000000000000000..a51f939ede562216b0b37b393dcb489ed82968bb GIT binary patch literal 365 zcmV-z0h0blNk%w1VGsZd0M!5h_e)FtZEa>|qxn2NNlBFUL`1#4*76e*_bn}YdarbA zqV_5(@-8m;Qd0FLCHnvX`Bqo-ARzG#4FCW$`anSL008wqKIQ-b`(a^OS)BAbI`=Rz z`$a`eL5KDL08vMZ@&Eue^dBGiHa7S)H1io5{AOnQU0vb;0QovPoSnn_ zN=X0!Cr3Mj^D;8u008thHm$JGc6PAP(c*D&sd;gy{7+AtqssF&H9|rNfACB_)6>)b zz`*{@%=M?I_^+?*JS?uRuJrZw_IPddab@*&Y4P##wY9alxVZO(dHnqR^z`)g_4V%n z00000A^8LV00000EC2ui01yBR000JoK%dZ;DH=6M&EeqlcyuF)gl4ND5GjL$>A7Z6 zphjcGV8pf}SF3fwU`VABOrdy{Ouf&Cv)hFR0|W#GJv==V6nlMtfrEtEGj2CI139h2?+qF8yg7~KM(>I76BC%549b)tgR3cyaK+k0kXM2#Kp$PK>#~Y Covxz* literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/yt.gif b/jawstats/themes/default/flags/yt.gif new file mode 100755 index 0000000000000000000000000000000000000000..a2267c0546ff372e5c0717dc7c79518a2e6c7cce GIT binary patch literal 382 zcmV-^0fGKUNk%w1VGsZd0M!5hN=dQI%E{&B<^JgC);3%v*F7z?w%N6`wAR(t?(XjVva@bK{F;^OD$=jrF?_44w&xw`uM`}+3w z^6&5S^Yi|{zx4F<;o{-`_xIb`>SAQR@9*%~*VpLl>iGEh`uX_%`1j_muE@v7-B3cn zy}HE5;qK(*Vp_BO`S`A^t?KFN>FDP9@9**P@!CQ!^Y8Kg{{Hgv^7i)j-QC^K&(HPs z_5c6>A^8LV00000EC2ui01yBR000J?K%WqU!EqFd*XuH~2tdByZxHc#3fMxVc9QU- zxkV_HifvGv+HU9d<#Gsw#?`2QOoGoY;Z6hsHX{Io3N0BcJ|!JF2OJV4Fd`xVGc*<% z9}hMQJrfc(ECdV$GbRoW9S55l6FLekHw+9FATkiCBnvw$I|?cWz!ftNGdevG8X6WB c5*={}Iy^iS#tKbOJS7hY2LU|?J>fwBJ6lxJZ~y=R literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/za.gif b/jawstats/themes/default/flags/za.gif new file mode 100755 index 0000000000000000000000000000000000000000..ede52589199b0360eb5d92c3aa174dd9b4eda473 GIT binary patch literal 363 zcmV-x0hInnNk%w1VGsZd0M!5hF)_^b006PF<;vvPpxUzcF*1+H0QR@I0052rWoA>f zX{nC@YQJ{?X8`#~NcpCw=<04pMbkU0T}ZKL6cofkuVd!hTKQL3laW?hxOaNUkaBW! z=I!PinK(0|O8_|l0EH1asaij)VRO4@DWOa=rdQd~%iPpd$-#c2o?ddgU1ML%_`SbN zzjys_a44KW>GFq!yIRD9Dg=(mWWb=&5I7H)D?zi00;(L8Us2Jz!9{=2n`J#0yj4Z J%+1b006TO7llA}r literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/flags/zm.gif b/jawstats/themes/default/flags/zm.gif new file mode 100755 index 0000000000000000000000000000000000000000..b2851d2b405c7ffe20eadff1b0bccbb7fe8b62e3 GIT binary patch literal 358 zcmV-s0h#_sNk%w1VGsZd0M!5h12q8d85sa)0AZ|Qe7$@CSO9UhacQw>07n3Xz=QyN z09mM6ZnbVK7Z+x*X59b)mC2R!C@AMFC6309Ri;(#I5h2qJzc9^6%-K4004-?hyZf{ z?0+_7u4Cl@0C~K6QlwILxpq#XPLarw=%i(BvTfa;TRAi_=t4Y6pGlmsb?BK_fWLrh zvuo)zF7Aj!c&=#iibv>(IcTqFdAWIBu3d}7i{vC6S+r(QqEP3IKjWfbC?X(Ns8<7l z0{{R3A^8LV00000EC2ui01yBR000JqK%da3C~h`_WMPT$L7t<@#HLB8NITOC;A9a# zAp@i3z}0jzSQGLMj~$)Mf|8p76eF;h9Ir%pJTV>$6K-S!axQ;7FCH5G^(%_TIQaKBkgjm`_4Vd*NT%Co08;=cC@9!j zI{p1s{QLW%S4PJ=83BXlXiPMy_R-c=~E;drwE0IS|{@$n7s@9&mlPWSgoJ3Ku1){pJQz1QK_^1WV( z003VA0P?x1qSjyW@A1!4Hs9R<+)N^;rAxq3MCs`O@AB}RTvqYy=#=S< z9u8+f4xDa0TB@-xB)W-I0RP{6BNP%#KZtT7E1^c L%M#Ad5ZuiOUN3ZNWem%FiJRvo`y1BD=`hv*VIKRMvJ*RIoP!A~nWC0td10q3wVqmj9 zFv*~pkwJogp@5Kq<=lB33r#Ab=FaVXS|w__^Sp}(vl(YgtLszCi49W@2|j(?z|GI( R%$z7b$$(3yR@ITg8URZETVwzL literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/images/change_language_on.gif b/jawstats/themes/default/images/change_language_on.gif new file mode 100755 index 0000000000000000000000000000000000000000..6b970e9710e908f190b6f298eef179dc2b0fd638 GIT binary patch literal 186 zcmV;r07d^tNk%w1VGIBY0K@zJR9y}9zLPh fFCGCI009O7>GMF`XZ%Ha00000NkvXXu0mjfNs4wq literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/images/loading.gif b/jawstats/themes/default/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..2aa44ec863e2fa6769fb6e462e79e9fcb4a991c9 GIT binary patch literal 847 zcmZ?wbhEHb6krfw_`<+oY^;0c%zRT*y;ZAPs;iSvoS3s^ORtxgU0PbuzI{_#S~C0k z3LPCS^7A8ugWVP^sGUB&f`JsE_)p5YC^fMpHASI3vm`?yF)OhmCqFSoFEcMKpF!~_ z3j-I>IK}_mey$u-)uvi0);vVajX`m?+T7*x9r7{Z3GO8Idi?P*CV{ztoeVC3W<{iWLqjuC)ga9K3dviKAyqLu!VI5YNE_ z3J!u?J_i~;BnP@TGdXQ}x-GzThJwv1)6kT_ZQ3uC_AO4IVz5GN-J*s4j@bg|l^q$l zZ34^<*ljpj8VvX%*(|hpIop*Lp_VftTb=;)q4MVm8n;9|w78B0h;ZsIX*Yat+{k6+ zeA>`^i$_b-LpBe+87en7Rx)r1?7Mh|^+p!AUSqh6!yUdzhD8P*oMNpy27OLfxcagM zyq>+~3AHyZXJ)BU$>xpG8x*E68HyZrSkde($F@fNSax^Q97aW_ zCkgfpjoX>_O;C1ivZ!(jjA%&Sox7-vTS#f4!plR86B-lRcthQmNfzCaOXkjD6yNEnFpw8Md&wZ^z^F0 zEM-NuG#+ZH2hd|2%N$G?4sAN-sN^}3W5cY42^@BLt*o8~DjgENa^B{fcs+F34|eL7 zG;1|AyGn@&EIF)uF=0hV!U3kA0*0L&5*wyF^z%8JXK?5nvZS%bXm)b=jUht|Nox>11SDv z0gLH?NRSx}EcyZs1`diR=S*SoKOtVEtT9g|YuTGu(>6$L|EzuAB=7m3ch?~~pWc(aRv!5RSLd@8&E literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/images/tab_right.gif b/jawstats/themes/default/images/tab_right.gif new file mode 100755 index 0000000000000000000000000000000000000000..13f4533e62430f685a1ae85896722bfd26d002dc GIT binary patch literal 424 zcmV;Z0ayMM)j$~%MR-&vb3yc&_h!@BhG9fv^f1kI1BQ$!zWn2d8vOty-_U0d~vndcU^-cuX#v zlj5^_&2A^s?zntDh12i&{LZfL`~Q4@f`f5^golV@hKY=gRf~?1l1Pw~mX|t}n46q1 znw_AVpP{6Zqot^cr>U%htF5qkud%dpv$eQux4FDzyS>0&zrn;-!^Ox>$H~lS&Cg)V z(9=B9)YoCy+EUir-Y(tW-{Ioh^u_k~!TI{V{QbH90jwo( zV61`$TOmxCY9Yf?4j+b!D6td8ilQ*myQt9;$Bw2|K(6~JvJuIWs!)nMsge-Omabr$ zld0_`O+7Ym;>oF#4$q#pfW8y@>?ct+MvtmVs?-eAroN!!lS=F=R{3)im3 Szy=hH>nmAqXK4k90028Z2;1TS literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/images/tablesorter_asc.gif b/jawstats/themes/default/images/tablesorter_asc.gif new file mode 100755 index 0000000000000000000000000000000000000000..6049a813c8d0e314385010281aaf352da8fb0507 GIT binary patch literal 54 zcmZ?wbhEHb6lGvxXkcXc|NsA)GiMZkvM@3*Ff!;c00Bsbfr+rryV|rlo+f5L8dA< literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/images/taboff_right.gif b/jawstats/themes/default/images/taboff_right.gif new file mode 100755 index 0000000000000000000000000000000000000000..5ebfeb6445195884d349aa646a74b81b261f9ec5 GIT binary patch literal 459 zcmV;+0W|(cNk%w1VFv+I0J8u9Qc^^Fdt*L6HFtMl%F3Q@Zdu32n@&zaGczsB%%1=N z00000000000000000000A^8LV00000EC2ui00#k6000F45Xniay*TU5yZ>M)j$~<` zXsWJk>%MR-&vb3y8KCcc@BhG{a7Zi~kI1BQ$!t1*0!d;@ty-_xtai)odcWYXcuX#v z&sakNfo{9s@VII3ntGR; zo}Zv%ouQFC(mR*H~I|PYbeoXM literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/bsd.gif b/jawstats/themes/default/os/bsd.gif new file mode 100755 index 0000000000000000000000000000000000000000..4f5982f4b33fa75770a4b1712588e12225965fe9 GIT binary patch literal 348 zcmV-i0i*s$Nk%w1VGjTg0M$PLIXOA|`};gRJU~D|UteE6Jw20?ld-X}>+9?I`1r!Y z!j_hnG&D3tMMaE^jGv#Me0+RcTU$g#M5w5!b#-<3_xD#FMcWVq(b1$o>8OQBhG{ zU0t)Yv!kP<%92vHmW8Z96+e6oZP)|t->1P}%}LI-|+0xcUiLI#I^XD31nkB2lu uBb9RuH9{T(nm!Q-LMtws05Kv%0WSiFHWL9w6$&9bED;MhdPcrPK>$1KcAU@v literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/linux.gif b/jawstats/themes/default/os/linux.gif new file mode 100755 index 0000000000000000000000000000000000000000..3f4893d47f51c5534ef2155fce2d0746309792da GIT binary patch literal 371 zcmV-(0gV1fNk%w1VGjTg0M$PLt*oh;nVL2>H~#+qqJ0qa=DPd&@z=d~-`UP^Ru%dA z`MkTk)S&|Fy9nm21GtVP85b4wxeQKCO3TT}jEsqJZET{UosyG}_PGMWt$mP>jQ70@ zIVJ&UUO&0Et&Rj4 zhc5IVsDfMIev}2GOC%RtsIT zLKCAwfat(KQY?cIRD4;0C3W(FdY>o_lJgA|6A%zHO8^>v13o?#Jpf7y0(}a8J^?)y zN;wG=K9fE>cOXLrBO3_;1BnF$H!fH|EHWDm9g03M4iOk4LM09|D<~Hi0vx(31wsZb R2PiK%3ky6C2L?hx06R)#qbUFY literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/mac.gif b/jawstats/themes/default/os/mac.gif new file mode 100755 index 0000000000000000000000000000000000000000..40ccf5191782e6f75f660cf3ca8088266a0e7fc6 GIT binary patch literal 352 zcmV-m0iXUyNk%w1VGjTg0M$PL*VorZLPSkSO2fgzhJ=Lq`1qQanQUrnN=HaZMMg+N zMgIQ&&dtq8L`6zPNB8&lOh-xI-``J7PFGh~rKP2hjE!1WSN;9{Ut3+~<>uVn+*(;$ zVO?HQO;6?IusAk2@$vEV^7HKM?EnA&URzuC_V&`y(M3T*RZ>$>Oigoda8OQ9Q%+A#NlQ;k zO#lD?A^8LW002J#EC2ui01p5U000Jkz@KpVo7q|qqEd)@krqqhWuq!Ze>H%oFaT&i z1!W4C$c+q`0OBAUdKwU4&ync)Op?s7qVW0cehLgk9Dsg*JTXKTa({mvFhn|WhldI) yL=*v)hb9vdZVHB#4F^LD1e=^bCxb&QI}QR0bUil&P(%?RAua<3G$KhtK>#~(`koB{ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/otheros.gif b/jawstats/themes/default/os/otheros.gif new file mode 100755 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/psp.gif b/jawstats/themes/default/os/psp.gif new file mode 100755 index 0000000000000000000000000000000000000000..a0c7f6f34e7423ebabab67107e0d47a17d5ef6d6 GIT binary patch literal 377 zcmV-<0fzoZNk%w1VGjTg0M!5h38Lp28ygKsPmmcYEGsHc4;2Lp3OGMm))p%3DlGF8 zC;t~Q4vUm^TqOgnx{wkd2qrEKWNfGuBmW916CNQJ5D!pZH4d8I<`ykDG9&^L6(STQHMWT-KfR<3SA76WlA4+$t1 X5K;sjOIQXKQB4&-LP$kcNkITROj&T0 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/sun.gif b/jawstats/themes/default/os/sun.gif new file mode 100755 index 0000000000000000000000000000000000000000..94cc0f87e53fabc5343c21887e60a1c23cd0fb52 GIT binary patch literal 380 zcmV-?0fYWWNk%w1VGjTg0M$PLjHa@)#LQ`nnv<)xrMkkMvb>6=v6Zd3grKeI?(p~d z`b~6)dzq)0uDR#z?$h1kV1$%*m7|WRwB_sWUV@WHZ-Zfkm0W<4Oml{Dke^$Ckym|= zN^^!?fs*p{_2KC2>+te}pRDET>+|;ao3g!9c#21Gg->>f@bdM^*4v}F!l}K+{r>)1 zevn>+lwpIFWrmlTu)9!qiS6<9@$~id_V@Gk_Wb?*{r&!Wm!|*!|5SR6f1Igeg_UB4 zmjD0%A^8LW002J#EC2ui01p5U000J=z@Kn9LrjK9B<_G&e3D2-rqCOho=}AVplNg@ z7F!ZU31AM8LL>mG4N(|C=JDDX9t(+p^`n&}9Ss922m~Dm9V7?|1{D@DFf9x}2PZu- zJv$K|00k5SE-C;72P7Q>3m`u_IR-K*1Q;C;3;-1lLs~051s13QJ|an41{Vz)02Cuo aKOh_fJp}?D%t9b18#y=CL?K5>K>#~!)vG)J literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/symbian.gif b/jawstats/themes/default/os/symbian.gif new file mode 100755 index 0000000000000000000000000000000000000000..36969e16748f409e1051904ec8e143994127ebc0 GIT binary patch literal 394 zcmV;50d@XINk%w1VGjTg0M!5h^{X=3?DX!kPxsN3_Ll*Z#MhF_khV@}x3!Y95bhrXd~} zjVD9HG#F^Y&570>QXnlC;;;#fj>5@90w547EHnre6h9<;5q>2RHZKhqAQA%tGKv5I z5f=prHy|Jxpd|tW5D)+{20b?p4j?c910+KW77QpW92^11pymLMF;9Wctb$|J7##d`2YX_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/unknown.gif b/jawstats/themes/default/os/unknown.gif new file mode 100755 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/os/win.gif b/jawstats/themes/default/os/win.gif new file mode 100755 index 0000000000000000000000000000000000000000..3e60501da8f7efd6bfb60eaf54e9ff6ff30ecf49 GIT binary patch literal 390 zcmV;10eSvMNk%w1VGjTg0M$PLQj53liViDjrG~cC%P9=%)5!eRFv!^E{r&u7oWiH9 zlJMxa=%|{AxGdzNLe}r*5&QY~p2tO7ong=;G90nIWmYA}%796=36E<5Z04c}- k9tOG-DiT7Z(-a{S&}0vYQ3w(?4k86GmQm9uTSGwrJ9ksFtpET3 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/paging/first.gif b/jawstats/themes/default/paging/first.gif new file mode 100755 index 0000000000000000000000000000000000000000..24568e4ed674363ead7f26d3f9e9c9c50b13018f GIT binary patch literal 191 zcmZ?wbhEHbL+#^TNNiSZ0`ts#xX8y`=-+wi=@93Ve=jrng4<5e# z`Rk8?WrwO>lTXM@afPa!qSc$WU0${J+_97Q`6NpJ|NqZ`7byN@0n6)vNRXWjtTqX% zeM=^Fh`5Fw`RKF4%FCB4e5C}(N?HC1aqp)wakOt#7IH7t&~yoHDeUPI<5=A9DJ8OP O=hb)Hq9nBx8LR;->qSoh literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/paging/first_off.gif b/jawstats/themes/default/paging/first_off.gif new file mode 100755 index 0000000000000000000000000000000000000000..8824150af7e2f3864350272107bf7ddb63c53549 GIT binary patch literal 192 zcmZ?wbhEHbt4)Gx z-;z%qBCcUEFY!5RQu_C7oS literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/paging/last.gif b/jawstats/themes/default/paging/last.gif new file mode 100755 index 0000000000000000000000000000000000000000..d41fe1130d1dd832a1c805601a9998bb4a81bfef GIT binary patch literal 191 zcmZ?wbhEHbL+#^TNNiSZ0`ts#xX8y`=-+wi=@93Ve=jrng4<5e# z`Rk8?WrwO>lTXM@afPa!qSc$WU0${J+_97Q`6NpJ|NqZ`7byN@0n6)vNRXWjtTqW# zH9|AzUHu}%;uZMxi`k{0$KGqRJe~W@^27mk=6wtay55sZ&n5 XP3}#&B1ca2DZbFVMkiJXFjxZs96nkT literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/paging/last_on.gif b/jawstats/themes/default/paging/last_on.gif new file mode 100755 index 0000000000000000000000000000000000000000..459cb1047ba7b56d8eb6db0fcd30b7368b023317 GIT binary patch literal 191 zcmZ?wbhEHbt4+dJ zjnK?_S5+L@yaJzo5j*ko*n4Z1r*ofKwjWSu-pAmwSa5laN@KgnQ%^<}Dcc+UhXihH PnJk;NO0_3Yk--`OJ<~%l literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/paging/next.gif b/jawstats/themes/default/paging/next.gif new file mode 100755 index 0000000000000000000000000000000000000000..8cb431a8ad14d761a46a42df63e6d7b832e16f3c GIT binary patch literal 190 zcmZ?wbhEHb!9`-mY0I70g;07_0%WDNIKI literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/paging/next_off.gif b/jawstats/themes/default/paging/next_off.gif new file mode 100755 index 0000000000000000000000000000000000000000..04e147a8effddf84d36500bb5a405885e478effb GIT binary patch literal 190 zcmZ?wbhEHb`0dBf-$zf}yL9F0=g&W$KL2p%?&}vXKOH=L z`}gm^_aD5yd+*JkKYzFHy0-Vg&6~Ghe*f|N+qYjk_gp`D`oZNZ&)&WNx^3sx|Ns9p zU;xFREMPGm5DBuAfz>)e%{MZ0-c46m?y5KmHrYJR;}VKH%=;pnr}MLCu;e)3X>Rlh e<5?ExGtuEIL&sv%Fpg__yJnqKG;3vGum%88HeVG0 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/paging/next_on.gif b/jawstats/themes/default/paging/next_on.gif new file mode 100755 index 0000000000000000000000000000000000000000..fe14f889e8ed9d89d977b13f5874885484dc0559 GIT binary patch literal 190 zcmZ?wbhEHb-0X|NQxL>C&a`?d=j05>K8yQBhGzNJwyU za=Lf#9w#T~=g*&+nVDN!T6%kX*R5MuU0wa{+qbJ%uO=raA3l7Tfq~)w|NlS|4JiI( z0gLE>NRXWjtkwx_29cTbZeI1_tBR8-6UpN|9-*+qyf3nOIzPLCK#ubr&ih+FCLwQXJDaKcEJPq^`0dBf-$zf}yL9F0=g&W$KL2p%?&}vXKOH=L z`}gm^_aD5yd+*JkKYzFHy0-Vg&6~Ghe*f|N+qYjk_gp`D`oZNZ&)&WNx^3sx|Ns9p zU;xFREMPGm5DBuAfz>iWt?!A-#1}$=;#P73ZCh73oG{Ym6YIO&$adhnu%XV!Z literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/paging/prev_on.gif b/jawstats/themes/default/paging/prev_on.gif new file mode 100755 index 0000000000000000000000000000000000000000..18253c2af63cb977a086409e8afef782b93cb2f5 GIT binary patch literal 188 zcmZ?wbhEHb-0X|NQxL>C&a`?d=j05>K8yQBhGzNJwyU za=Lf#9w#T~=g*&+nVDN!T6%kX*R5MuU0wa{+qbJ%uO=raA3l7Tfq~)w|NlS|4JiI( z0gLE>NRXWjtd9;RI;UAuhbAXRjqQtC0%ZJ{T$|Fpmbx%7SOWmYIWn&R literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/alltheweb.gif b/jawstats/themes/default/searchengines/alltheweb.gif new file mode 100755 index 0000000000000000000000000000000000000000..439ceca927bd5f57de0f91e41077580cf9032abd GIT binary patch literal 159 zcmZ?wbhEHb6krfw*v!K)=iHx^S!a$MIug>hXU?oSYu2slIrQaEpGi($j!oW@KSex$ z&ZYeS|DOQ{6o0ZXGBEHk=zs)3W-ze$Oz?DFxo5`8&A$R~ZY_Nxo|VGY=H<06^0l6U z*|KMq`af5On#OB5`f#XrG8_;v@Dk|oIh4S_Fo(lYv1+E?dVj{oZkd4D;x9H-d~s!9 Gum%AAXFV1G literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/altavista.gif b/jawstats/themes/default/searchengines/altavista.gif new file mode 100755 index 0000000000000000000000000000000000000000..dbf3c8bef6e3febcbab6eab4aaec6929b08245ef GIT binary patch literal 129 zcmZ?wbhEHb6krfwSj56`f z?J-=uQv8a*4%VL4qCEnFw>>!I3>kQqFg$n?@mO_cbGz9y&(FLU)J}B25n~GTo~rb9 a&bk0$rAZ-km#a+@=FE^?v|fdg!5RSFuPOHc literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/aol.gif b/jawstats/themes/default/searchengines/aol.gif new file mode 100755 index 0000000000000000000000000000000000000000..2b952a155e54b6448c8b60e0e517cfae068f77f4 GIT binary patch literal 588 zcmZ?wbhEHb6krfwcvj4C_3G6J4<4L8eL7*r@ro7aOP8H{_Uzfmj~|`e_AESfS1fbQ zsk?8c?!Gx~_pRK8r^6>5PMf^r#?y}*&OC~qdNgLr5slK#iUk|aojd2;UVi+(Ys(G&M>yYSSjYrk&A zR_C_8l38mdv)36`Z`*PHu~GH5_DxqeoOyiX*+;STRV%k27EE2;vSe@n_Un5N9_`t1iC$ z_`QAIx!7sP_)}JKC9c?c=~>2q}Ds96*1Y*X`P_I(ulAku#LSq&YPdAE=Gx5YZ?|3|Bf#Kb4pyEJ3%si7!l? zAFgdzH(6K%y*kY@UF;#L(`L@pIgHJU2}2^w;e){FpXgKPA2@K}To(#b)5_SuhCKzS zRH`|ERe)sxC%`NKsaDSe%+qKli)FmM9dBqDDlMG=umNmxxgH+Rn3PnHATO(`76C?v z2Q>#NLdX z5)#H(tj|L)*7Q1EP0dFH@$BxtQxP2k!QR+tZCu=3Y-~ejhCL<8!o8xCNP0+;8qkdx zjfV#Z>aH%&_O=bfzGP*o`?Y$C`cYUo7mPUoT;1JEZZ}D)mjDJuqCNmCzyiS3)s()( z#Fe0+X#lFEWUa2ow6HJ}9^L}r;PbsZJF6(FA2sYxPWEPI9-6Io24nAo-A@o5@$t_h zBh5VCRBOvmi9}_!F4F1L_$z`WjR0!_0Yq=F-|rs;Fvw(1$5J0ftv{)Ac)j~uTLS~n zts5J*8T0bZA`61J9zB?jigG<|T?hE>_s?p{{-!3M*ITPpjv1&G3_ChHg8%%(0-OVc z2B3h;f1Q7y0Q4=ef}-+)*L+;sx;*#zjF+(onB06LuM=Otxe<<(}n`J_22If5J7}*k{wBS$tOEKjI$FkGD jqsd(9`_KrHo?qm+P(aFX44hMuLWNv&tu5pn8`A#(Yj6?F literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/avantfind.gif b/jawstats/themes/default/searchengines/avantfind.gif new file mode 100755 index 0000000000000000000000000000000000000000..3aadea56514e1cc553c58195b450e35653fe451d GIT binary patch literal 1080 zcmeH`>q}Ds96*0=&Kx?svrWs&oHh%yv|OcD|$1{ z89K!t%Mn&O%O0Z#cOsh^qjZtB6kR5!XlRdFiTg$U2Yv5+KVJ@DOdH@m zBJD*GT2g8qP2D)`#VN#1H4e)#2Bfz-5p(sPaYSI>J=!<}SvH8dd$<8}>ZfH5Kb!iI zEomyTqv{ndr0kI4Twge@8$sJNMqg-Oe$F9nM8z`%Uh_d3f!iV|Z8r@e$okapkaOT6 zkUjJes!TJA`dLoKv*(|Ydg5)HKy@oxeqpN{FTFrT^>niObF&8_yLTszalQ@du7>+V`hx0 z{1u}80+E*R!a<0A)X;?@$`Q1?<(Lci>%NN&_@EC-J680f@+HFJdgCNU>Lyx8F`;ZM z?+#`fT?E;_vGP^^00w2XC7v6RnaWBls8i&%YE9 z{Pgt!FhJ}d>CY43kFYjh;uf&k!8;qPlTMTe&ea$?m22p0>Qp!>i>Q{1DN~3a+)5!n zI)senY*Gw%reVkG$Stq;D6EXwfTiZMVx}~JzfMFF-FYllkgg6Eh-|yGp^O`8*_jc} zz&U}7;-@Yz(-^p%utA@T6l+PGigEThaZ6$#I3|6Ep6aX!7tN2~FTSbOa|KIZvr@#y z0A^+MJ{@nXTF5Fm{Y?XI4P)Cpo{-jSDl|J*eN)o%wlZye#BOtvl4Q;S>QjVPk}ti! zIV46738U6Cy!3nHKPKI}I-W4TAkmrX>(9+um6&||gXH`QpJdWCr0DRA%01e__a|ge W7fJ{peiB`(o?&YJ?r`T5u;Dk4Lxbr6 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/blingo.gif b/jawstats/themes/default/searchengines/blingo.gif new file mode 100755 index 0000000000000000000000000000000000000000..8a1205ddea9d61ff5a3aafbd94c9522a6b0ebe4d GIT binary patch literal 130 zcmZ?wbhEHb6krfwSj56GbLPx5XU_cp|357)4M;M;fZ|UUMg|5J1|5(9NG$`iyT`6O z(#l?vxAq8b(AXvJ5TcpH&eCX^k>bfI;O*f2tIa5|?#qp3E2b!XF7ULPc+{K8fp3bb Z@G9r#I-7-}B8O8h?67OEn8?6j4FIy?U+cg6Mc>tL8LO|GRveWm zIeaU2l+~SckUHJ4Ft6ZvU<aQeD>M%EB3(OyDah%2mkCp_vjV3jO&t@7L8}j zGZwpTd?k~=T`pnmWghYJ%}?IwTQh{r`+ni_DJ|za%<=~>K7GY5!{pfitg$adOnNP+ zBTe=>1RoZ@yCYtlfJ1bNcRg zGNB8eb4u~WtoZ-`KLgP~@h1x-14AK$4oC+mP8isyG!!;9Yq~VIcQn}rb@rwSn=|r- z_7)}z+45L3vKUPDinMZfOwG5@?F=>+3s1?E2n&?$jN{~$DYWtSFfr_u5{zz=RMmIW zm>TO`7_Y68VB|VAhCd>JDan#8w^Pwi+><*`Opx#V{rUdo)r@J^O-!!o>0Q;)c{Ody?{{y0 zy?*)Y)r)J!M(@|J`}^bDH3Nft;bG4^+CLpWc!7uK0x#c#)RZe~YG2Qv`*QNc9Uq@_ ztgMfViyx#UUr|xf>jG)6wx92gmoD*KfJGJ*}&KT3`3|+?hvN zS%1EM{_*6|)2hnX^XA;~@_bTWcFWo6mXp(ECB=_>_k23I|Eh+@oxs2+Rh4g+Ec$d{ z|8JmcKYzFr5b*c+kL#wU?>4M|kd}ImjqPDZ#@CDIFG)+^a(DZ%ZOf-a2i`7Uc2!g3 zMPJ{`$&;Sd)jp}M`SIZ1lZx_hw{BckRQz)C_}^bY9u*ecPl$iJWYLTM-t*kt|9<~C z%gA^)G~~gP6xRc51m&e_cO8l;o;fvl&jsT zb(KZqq$UAw);yMDjsa{-+wGL=9%xKCevr?(KE}Yo^O>(0o6|HArI6)~4J=IoK^7BJ zeA~G+xLG$YIC4;UN(`HC#H_6W-I75Q7O*(DxI|82e!#LTkx7-yEa6(3Zjdqqlc+|b zjY7x?4$&#{4l@kDEM=MJ6zIWls3^fvksi7JW+Vb!D{krG(pxyM+@A<>(`0V)n?)m+<=Jv+x_`B!#yyy3}<@Sfw@#OXU zhSl-7=Jt-)^0DLg;q?3P`Td~Y^vmq|liBjo@A;_U_15tEiq`Rr*YUyW_tfzEk=XLg z?fK&M```2X-1GbL`u(Eb^xgCO&F%Tw@%pCU^pM!{&+hrc>G;_3`r`Ea==c1D)baoS z{{R30A^8LW002G!EC2ui01yBW000J$K%a29NC*SNo7Y`myGgCe%8ht$i QQpP?E5*Zm1JW4?TI|Q}X%>V!Z literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/earthlink.gif b/jawstats/themes/default/searchengines/earthlink.gif new file mode 100755 index 0000000000000000000000000000000000000000..47deaa52344909c19fc678651ae0a7e7b191732c GIT binary patch literal 246 zcmZ?wbhEHb6krfwI3mDs^Y+a>J2qXJS2HEUCnqZ>#Y%;RiKWGe#navM&*e=9+SnA?NVrYpo-yh4Gc*L{K7E>$@mX6Nfc3~t>i4hMhO%CNhgIuh{WT;$Z`1iROl zR&J8M>%k~;^5^x5K??JWEtGkJo%0HmIINi4_{}w%xj1+tbq%z%RMj|@7?NfzP*!BH F1^~!0NXGyG literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/eniro.gif b/jawstats/themes/default/searchengines/eniro.gif new file mode 100755 index 0000000000000000000000000000000000000000..35a3eba91d65dcbaac71d1c581fcb6f56b275c3a GIT binary patch literal 130 zcmZ?wbhEHb6krfwSj5iI(9i(E|AByk0fa&1f5o3Hj0_Cy3_2h_NG$`idqvf?e`%V* ztF{JSs{VW{=Bclun&DCl$NrNnjSM^`jyu?NE;skS-h9jVYZqf51Jgspi=6YAp041i V_44Oi`mHJ{XX|Cr>?sTk)&T3?F?s+1 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/excite.gif b/jawstats/themes/default/searchengines/excite.gif new file mode 100755 index 0000000000000000000000000000000000000000..e8baac52850edc3442f81b85186d846cef297023 GIT binary patch literal 239 zcmZ?wbhEHb6krfwI3mL!ARzEBAi}}H;s5?a_wV2TfB)gXg!F`jg#YuGynp|`prBy> z{Q3VFc>Wn!{Xc*4UqSi#^XLDs->jgZ@c#aTe-57i1f6N^|!z8uO(C;dT&;9 zvSHVY^H07`+xhVS=gA-MlwNuKIdRj=&-a_XX59MmX50VIegD62Y+rY$aNoQCUnc+m zzWvy(54#@zs5<^dqxfjh!uubtC;bNl2I7F?PZmZ71|tR?kaCcp7}!c2X7;dXOZAH_ z^l53(mD`x{X5#?`JFlrqS0yUEdHWA7(V2Zd%`5xvss*Xy9ZQbR+M+UHvqH1b6xO;l z9z~w~G(NtzG=2S4>7EIxJ*hHm(*%`MSvXnJXA7n>FfuYMT)Z?@fmKhBb+w+9b_Tob Nnlq~H=jOzdiLzu+qZ9DzI^%O#fuLgK0JE# z`0(MA*+s|Rz55>+x+NxYe|*B$m8*`NKK;hr{(Va7_RRE~S|*n@OZBbQO?cj8I z?%ex60sESo5A;pgFnjjN_wPS!+4}tArMnB49&VZV`N@+fU0r*-`VTfXUGMAPJahJj zhQ_6nr`&h7e-#k&@6e&2M~>Xxy!Duq{abg}4+jsO`uzEGXy`#hvnvr%^LOvL^6J&A zvuFQ4efn?R#?SX3ywTS@f9S~R&gp07EI1gIcx&DIBWEuCdH??XnKL(n{LURda;c$V zgP+^en|J@de*HfuXXoY1*UQTP1%@0wedhYDTleGQ4wqK_DK0%yU3GE6{5>a5{C)WN z|HFr`%gWZjeEDkGihbQ(PrrQm;urS+&fRDK|Nm#80Z{zO!pOjo%%B4@8x$uD?9&^P zo0?l%+me0tBdu)}+nZd&4WxwwmHLyNJ)2a-lKP{hf|_j1UHW~*<(qgVO=gJN3nj;E zbIwS13JZwY(QK#Z5xv7wM?*%}+r8h>EG}3f!kDk!AylhHU4pC4Fwv_;&BChLlqn%L z#E3^(P*#B3jfIJcg^`(sOHPE}Pt%`~hlj%=4d@%mo!iHi1qgy>XJ=I^6$pa1!OO1l9JnIKYPE*z^8yF*Z8jSW z!vWzIsEmuEsL^PQJTu1E=!j*my}ex~lljhlVQv(3b#1I-N0{#{1~*KigB) zEytKRWipu}kw`##IJrR~&CR{Nz32rg8C#DnnnHq{U=7R7PfsKg8zjEEzcBijHW>_= zJ`qPBYcR<>UaxmzVnV0WB?F%4jg<^T8P9$U-;z-wWU{0%YO;Aeo{cr!`NvpbPoZOL zmi5XvN~IDO6xi){48y0Vr#DDqX=w?0@JslkVpNppud5y%9et(yEhs$~!%&8%BiP!@ z{Us()!(CgbrWO`A%yWAV7- zQY#boIe)rH`QdOA?`cih?K@grT!bCvtjk+``~rd?^m@Hot+sOkFEl>iR2#l{Iv5Hq zaapbhqgt&NvrOSXUrxlL%%X-Q$+@p3&(5?YNo=)_Yq3~dE?4{&;jgYnE#{S7ZzE40 zGSL@!_jv;Br*SX+ROPA6^6lVRO4AA0k@UTEyWRMU=W@9m!!YJQ!2ew-wJ8Mv?gKkt zhrWIS$XEl~GV|@mdGL_BFZ-m3cV+PK$mji6%NqLhC(^7^3J{r#3y+>m-V?s57fQru zw&J^j3pdJ?87n6q4&;=x$MzZAPzsB8EDbs+GT%I+$*yg>quG`T33t6WB>pEA^8LV00000EC2ui01yBW000DA@X1N5y*SSXHg6TsD9n=_ z%D^l~A|VRll*WQQ&A~o_;~b=UXtclR#l0D7+bVkY>;C`zH|qJLQ52>96whIhHF zPMJZ0meKU#;#2g%wGCCA`Fa?vgG=w9L{wr~VN*|Ed2Sx5sxdmi(&$dPO z_B{8-Cg2md$7=gEQ4-Vy$qiFb6__dcIyLqN%A!6VMeivNy|)=AGy^3ax-#h@twtUE z&|cYW)zDGN$MBhS~%ui82|7zp&7yG2Z7) zWVSp3wzb1M+fLT`-|CK$YaU}gG$?b2k8szYTsXipLqp0y&&y~I zeQ1tCjQ;S*V8M%x`}+&nB=tL-WPfmEKe3eG7K8E~Ak5&Y;zGU5DMi zO&XRpfdC-{{{w)$idzRjD+pP`SbG9ETS2nRc19;jNluLjUbn0!DdU01Y30&QCrS|+ zhd&}#;JpHJmLtyaTM0!pC$w(a){IsAUiyAcL=1Luy?N)P=VY`>w<*;>j3pJ*D-_IZ zTsgJsARZq}8brcGI4`1inL4MF6aSXN%#ZY9`sqg=cpl&GPCIDFZw?BTjUo(&g0$hR zxw8fhjIB;e=kbZ?0Psc&XiNFxnc)&26qkWHCbeAGt@~)tQUZ!RQk>$-%+bw>camGe jsZ_2)PcChZjCj9Z>C`}?oEErF3sf7)g={y1GuZnNXw8S3 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/lycos.gif b/jawstats/themes/default/searchengines/lycos.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b62151bea3dbba627d34c41baea26c6afa8b849 GIT binary patch literal 132 zcmZ?wbhEHb6krfwSj5i2(9i(HAlT4w;J|_Z|Nk>EFaSx#pDc_F4D1X#KrT?F00RTF zXT>fXx0aL6GBSl)Np0;npGZ7eUdYH0vd~1zQM*t@Q@`Zzoc!LcqH{MeFXZ86n!x^8 fyHuiIZdpR4PAki*M!_q-mPgNiNDo$FV6X-N3^pv` literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/mamma.gif b/jawstats/themes/default/searchengines/mamma.gif new file mode 100755 index 0000000000000000000000000000000000000000..6d4c489d58e9536d030fc0144d76735aa2e17aab GIT binary patch literal 383 zcmZ?wbhEHb6krfwxT?tDERV*Cr$+?B2b5QAde`o%Q_r^Y$(1tj&zf&oB7& z>Fe?1$I?PQf`fzE#npw}6V)dl=hby+swsQ%;^Vy?b0j6idwO~vK73+sYQo9QqpqrQ z^XAR}&yIh;y7SesRSXOa|Ns97k~9K}KUo+V7!(u8RN44>O(0|j>RH%FU1XPY;xa4;}P^6@b9%E?Mg zc*=+{$jZsfF-f*4gh=+ti;Bw6iuGddmFHC8oXINY#V9;WRH2%KRXRkWS5$h9f}~W4 y_{8bkXk`lF6HwsokzE)f!!IbbZ9B(gPq8&pYvg5RStmO(SOWlU>|{y+ literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/msn.gif b/jawstats/themes/default/searchengines/msn.gif new file mode 100755 index 0000000000000000000000000000000000000000..b3f85055cba669a708ef926cc3470b568d7ff667 GIT binary patch literal 151 zcmZ?wbhEHb6krfw*v!SSDn689{wjv~p<4E({TZU%&qO^XK#D&!0Yh+PQP*@87?_eft(Q>B^tK|Gs?r z^7Hqfn@_(?owMlS!-re8Y+1N);qv9n4;(l!WBSyGufMHe?Nc! zGkNml6)RReynpY**WVw${(AlK=gH$oK79BP)P3Q{j~~$!FTQ^L`v3p`3{(P&KUo+V z7}ObbK<0t`#K2~MU~++nj#U4NB}FH5#26V4DotEzz{A9Rz^RCbtMvkFpj4vN~LU*S=cVl zXY7*v3e5M|#M=&pJN2=b%m^=;5urDOF?fZro({u}Yn5kT?dDKs4B5)*Yt6avbUCXC z!p6YB@c;jRAUPy};!hSv1_pNq9gu55al*j9 zxWT=txuvzu-KEJzrM=lj(Z$7_y|+V(Oi=jWQ5nz*>Q_n9sCrA5un z&84NK`nhcY00960{{R30A^8LW000gEEC2ui01yBW000C|(8)=wb<3;+?i>RE5JKSr z4HX=o(gdcXD4r8E0uk5FAm9t0q%deSXqN>N(;#>T0g51aF*FPkLiD6qWSqjVgh4JR P7@hFIx8zkX+A^rgJ~`{KplXU_cE-25>p=;y9o@9pe< zojCE%#N^kRGhb?I{(buNIV?D?^3)!z>vzAsqtZQ{iDHa6d;PW`cd{pX^h zce=X2PM-X}Xwf@u?YDArAH2Qas;Rw|mj3_$Kf@3Nia%Kx85o=ybUw8oLU!(*&_DXA$!W(_w$ZPVRhQp#tmt5b%u|Zhmcj0x!t8FPLjPD~A7nvHdHrm+jDgt^qHW&+ZDv2tHGB!jC6Co@t36mF- z2^1+r03s1CE(D;Wp&uQb6&@=q2CJ>C8URE#4-g11FSoh4Cla#)GQq;a0s@XWEhRI{ a%*_Cf0VD-A)YaAnCP@}Y+&COLK>#}u3c3dX literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/stumbleupon.gif b/jawstats/themes/default/searchengines/stumbleupon.gif new file mode 100755 index 0000000000000000000000000000000000000000..199f80a1920c169cf36020fa45ea39b47f0c1b92 GIT binary patch literal 1062 zcmd^;k5f|x9KgTtZG-&+UkoI(S4iH2PmURg_x7?Ir#j$=g}kt4jkIZn?^?vVX( z<7na9P2-vo46Ka?gb<)qx}VDKO_q6-L~J^#?M;oLAc*f#{vCb(gU{#g^M<&vVEg+R zVDMlND2jSSQNdvF%EClE9tZh|*XzB#Lc)R33Pm$P{xh){fM397vuU;3zP`SemKLxB zj^jq7adL8UetsS%0OZ3+0O3q=AOMj_WUaW7b)5x6$V~he*TYr)sn2z9^LRY$A}u2A zwp@wO_MZg@5ClxWG>SY_^)*CW7o$|0CN>S zWIa{%eYJzJx%GZP6E1lcO-K~k+}*Uagj{1$-EM{GGwzYRy6S3&%DTq5jak{`dHcKU z?wMQr)B^99;x8ol&ipXeK}#&BD+YXO)t0Ia_`EU!EIVX;89JAx`u25IiC=PWuR;H6 zPZfq#=crP6c^Vw;6sDZmx%V3r$`^c&ZqkSF^EY=F^EdAsj@(GOnT);C#q}R8%N8{W zrNtKsH(T7st9=F+q`rB{R$!8+vhwM_Zc6ze0~Z9k_b557SgI)G)0*iRmpMHU~p3F`hYnEL*l6si}JM<Q`fU*-JU16a{hd(X^G33GVP9!U(b?dTYB1bdfI$!td6Xi#q#IZ zpPZ~IcWym-^X|)=TOxnDdj4ePyg9VzNnFgCQ&+YuW7)Fl&69I7AwgIE{QB}{)|4r; zw)|PO=Fh8`9yyger&#`kh5Y%oRBT_Z=u$|00CZ!2p1kb y6<0xRX;&pNk3M$|HBL@u(S$x`NhYSeei3FSnYw}@F+rFBs&*5|U+&)TmBV{^xgh#FkflZFZ1}wM2twB5vs|;Qv zK3))*$I}rkrT7fP-GZ|vZ1-V23+6(2dU3goXau`MSg6D87AAx^v?3nETL|7k*c1rg z;A#c$kC-XOQ~^xch(!_F!}BQu4%~SW^kG(tO+74SII-g`h@UTs$FmM`MDmuutU^ikTmOu+dIuE6_iuNqvg3uzLCYD8Kn$cnND-Wl%-H76CD*c VF_pU1Dra$0nxNXby2jL#+F$e^skQ(B literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/webcrawler.gif b/jawstats/themes/default/searchengines/webcrawler.gif new file mode 100755 index 0000000000000000000000000000000000000000..71ee4521f4309daf0980110b90333e4c13517c19 GIT binary patch literal 305 zcmV-10nYwMNk%w1VGsZi0M$JJ`P;Yo+qn6|h4|gQ{NBFe>hIs@>-fEQ`NM?!-@g6p z*52mp{`m3uxp4d0vgGUV`_iK3?egpJ^!x7L{Ncg=_Ur!h=J>pJ__%H0=hJUU z=+o`+@%q`a_o`Ce literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/webde.gif b/jawstats/themes/default/searchengines/webde.gif new file mode 100755 index 0000000000000000000000000000000000000000..05e39ea7546ac4bbc08e65791a39f3faef753e47 GIT binary patch literal 138 zcmZ?wbhEHb6krfw*v!F@mX3~KOk*%M267qx|NqZ`4JiI(VPs(7 zV9)_cg3MrGF&8-Lxq7d}+_Q%E$I1il2uQ35lsTl9+v>RF#jCnRzOEnZK1<(SFT6xD VR!V`rp+?hPJTA>^ZICj9H2?sdC@ug1 literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/searchengines/yahoo.gif b/jawstats/themes/default/searchengines/yahoo.gif new file mode 100755 index 0000000000000000000000000000000000000000..a6cb2a7f96011d1f98779606c08b81ba9781e1c9 GIT binary patch literal 88 zcmZ?wbhEHb6krfwn8?Hc1pk5PKagNh{K>+|z`(?y0}=(vGcajR>0f#Jt?VKmJ`aW? lbKJj8sFW8?m73x6Z0VHwGZ(SjR9$R(s`mHGzhDLiYXJ8q9Af|g literal 0 HcmV?d00001 diff --git a/jawstats/themes/default/style.css b/jawstats/themes/default/style.css new file mode 100755 index 0000000..4488cbd --- /dev/null +++ b/jawstats/themes/default/style.css @@ -0,0 +1,160 @@ +html, body { background: #fff; border: 0; font-family: arial, helvetica, sans-serif; font-size: 12px; height: 100%; margin: 0; padding: 0; } +h1,h2,div,img,span { border: 0; margin: 0; padding: 0; } + +a { color: #0e1875; text-decoration: none; } +a:hover { text-decoration: underline; } +div, img, span { border: 0; padding: 0; margin: 0; } + +h1 { color: #eee; font-size: 22px; font-weight: normal; } +h1 span { color: #cccc9f !important; font-size: 16px; } +h1.modal { color: #33332d; font-size: 22px; font-weight: normal; } + +h2 { background: #fff; color: #33332d; font-size: 20px; font-weight: normal; margin-bottom: 2px; } +h2 span { background: #fff; color: #345678 !important; font-size: 15px; } + +img.externallink { padding: 0 0 10px 2px; } + +input.button { border: 1px solid #999; font-size: 18px; margin: 10px 0 0 4px; line-height: 18px; padding: 3px 3px; } +input.text { border: 1px solid #999; font-size: 18px; line-height: 18px; margin-top: 10px; padding: 4px 3px; width: 200px; } + +span.submenu { background: #fff; color: #0e1875 !important; cursor: pointer; } +span.submenu:hover { background: #fff; text-decoration: underline; } +span.submenuselect { background: #fff; color: #0e1875 !important; font-weight: bold; cursor: pointer; text-decoration: underline; } + +td.countryflag { border: 0; text-align: center; width: 16px; } +td.countryflag img { height: 11px; width: 16px; } + +.center { text-align: center; } +.change { color: #9fb4cc !important; cursor: pointer; font-size: 11px; } +.change:hover { color: #fff !important; text-decoration: underline; } +.changemonth { cursor: pointer; height: 9px; margin: 0 1px -1px 1px; width: 9px; } +.changemonthOff { height: 9px; margin: 0 1px -1px 1px; width: 9px; } +.changedivider { color: #71716c !important; font-size: 11px; } +.fauxlink { color: #333 !important; cursor: pointer; } +.fauxlink:hover { color: #000; text-decoration: underline; } +.hidden { display: none; } +.negative { color: #b00; } +.positive { color: #060; } +.right { text-align: right; } +.tiny { font-size: 11px; } + +#changesitecontainer { height: 350px; overflow: auto; _overflow: none; _overflow-y: auto; padding: 0 20px 0 0; } +#footer { clear: both; padding: 6px 12px 12px 0; text-align: right; } +#footer span { font-size: 11px; } +#main { background: #fff; clear: both; padding: 15px 0 20px 0; } +#main .container { background: transparent; margin: 0 auto; max-width: 970px; padding: 0; position: relative; } +#content { background: transparent; } +#header { background: #33332d; } +#header .container { background: #33332d; margin: 0 auto; max-width: 970px; padding: 5px 0 0 0; position: relative; } +#summary { color: #cccc9f; padding: 3px 0; } +#summary span { color: #fff; font-weight: bold; } +#menu { padding: 4px 0 0 0; } +#loading { background: #fff url('images/loading.gif'); display: none; height: 16px; overflow: hidden; padding: 0 !important; position: absolute; top: 10px; right: 10px; width: 14px; } +#submenu { padding: 0 0 20px 0; } +#toolmenu { background: #4e5150; color: #fc0; font-size: 11px !important; line-height: 20px; } +#toolmenu .container { margin: 0 auto; max-width: 970px; text-align: right; } +#toolmenu .container span { border-left: 1px solid #33332d; color: #bccbdb; cursor: pointer; margin: 0 0 0 1px; padding: 0 11px; } +#toolmenu .container span:hover { color: #ffffff; } +#toolmenu .container span:last-child { border-right: 1px solid #33332d; } +#toolmenu .container span img { padding: 0 1px; } +#toolmenu .container span span { border: 0; padding: 0 6px; } +#tools { background: #bccbdb; } +#tools h1 { color: #33332d; margin-bottom: 4px; } +#tools .tool { display: none; padding: 0; margin: 0 auto; width: 970px; } +#tools .tool div { color: #515356; padding: 10px 0 18px 0; } +#tools .tool div h1 span { color: #33332d !important; cursor: pointer; font-size: 11px; padding: 0 0 0 10px; } +#version { background: #ff0; border: 1px solid #9e9e7d; display: none; padding: 3px 6px; } + +#menu ul { margin:0; padding:0; list-style:none; } +#menu li { background: #fff url("images/tab_right.gif") no-repeat right top; border-bottom: 1px solid #fff; cursor: pointer; font-weight: bold; float:left; margin: 1px 1px 0 1px; } +#menu span { background: url("images/tab_left.gif") no-repeat left top; display: block; padding: 5px 5px 4px 5px; } +#menu li.off { background: #33332d url("images/taboff_right.gif") no-repeat right top; border-bottom: 1px solid #33332d; cursor: pointer; float:left; font-weight: normal; margin: 1px 0 0 0; } +#menu li.off span { background: url("images/taboff_left.gif") no-repeat left top; color: #012345; display: block; padding: 7px 6px 2px 6px; } + +#main .graph { background: #fff; height: 150px; margin: 0 0 7px 0; padding: 4px; width: 100%; } +#main .pie { background: #fff; float: left; height: 380px; margin-right: 1%; padding: 4px; vertical-align: top; width: 21%; } +#main .tableFull { border: 1px solid #9e9e7d; clear: both; padding: 4px; width: 100%;} +#main .tablePie { border: 1px solid #9e9e7d; float: right; padding: 4px; width: 75%;} + +/* tools content */ +#datepicker { width: 100%; } +#datepicker tr td { border-top: 1px solid #aab9d3; color: #444444; } +#datepicker tr td:first-child { font-size: 18px; line-height: 30px; text-align: center; width: 10%; } +#datepicker tr:first-child td { border-top: 0; } +#datepicker td.date { cursor: pointer; text-align: center; width: 7.5%; } +#datepicker td.date:hover { background: #dee5ed; text-decoration: underline; } +#datepicker td.selected { background: #dee5ed; cursor: pointer; text-align: center; width: 7.5%; } +#datepicker td.fade { color: #a0acba; text-align: center; width: 7.5%; } + +#langpicker, #sitepicker { width: 100%; } +#langpicker ul, #sitepicker ul { margin: 0 12px; padding: 0; } +#langpicker ul li, #sitepicker ul li { border-top: 1px solid #aab9d3; cursor: pointer; line-height: 28px; list-style: none; margin: 0; padding: 0 0 0 10px; } +#langpicker ul li:first-child, #sitepicker ul li:first-child { border-top: 0; } +#langpicker ul li.selected, #sitepicker ul li.selected { background: #dee5ed; } +#langpicker ul li:hover, #sitepicker ul li:hover { background: #dee5ed; text-decoration: underline; } +#langpicker tr td, #sitepicker tr td { border-left: 1px solid #aab9d3; vertical-align: top; width: 33%; } +#langpicker tr td:first-child, #sitepicker tr td:first-child { border-left: 0; } + +#siteupdate { margin: 12px 0 0 0 !important; padding: 0 !important; text-align: center; } +#siteupdate input[type=password] { border: 1px solid #444444; font-size: 19px; line-height: 34px; width: 300px; } +#siteupdate input[type=button] { border: 1px solid #444444; font-size: 19px; line-height: 34px; } + +#toolLanguageButton img { padding: 0 0 0 8px !important; } + +/* calendar */ +table.calendar { width: 100%; } +table.calendar td { text-align: left; vertical-align: top;} +table.calendar td.labelSide { font-size: 11px; padding-right: 4px; text-align: right; vertical-align: middle; width: 1% !important; } +table.calendar td.labelTop { font-size: 11px; height: 13px; text-align: center; } +table.calendar td.labelTopSpacer { font-size: 11px; height: 13px; text-align: center; width: 2%; } +td.calDay { background: #f5f5f2; height: 52px; width: 11%; } +td.calDay div.date { color: #ccc; font-size: 15px; font-weight: bold; } +td.calDayPopulated { background: #e2e2d8; height: 52px; padding: 0 2px; width: 11%;} +td.calDayPopulated div.date { color: #aaa; font-size: 15px; font-weight: bold; height: 15px; } +td.calDayPopulated div.value { color: #333; font-size: 15px; font-weight: bold; text-align: center; } +td.calTotWk { background: #cccc9f; vertical-align: middle !important; width: 9%; } +td.calTotWk div { color: #333; font-size: 15px; font-weight: bold; text-align: center; } +td.calAvgWk { background: #b7bad6; vertical-align: middle !important; width: 9%; } +td.calAvgWk div { color: #333; font-size: 15px; font-weight: bold; text-align: center; } +td.calTotDay { background: #cccc9f; height: 40px; vertical-align: middle !important; } +td.calTotDay div { color: #333; font-size: 15px; font-weight: bold; text-align: center; } +td.calTotDay div span { font-size: 11px; font-weight: normal; } +td.calAvgDay { background: #b7bad6; height: 40px; vertical-align: middle !important; } +td.calAvgDay div { color: #333; font-size: 15px; font-weight: bold; text-align: center; } +td.calAvgDay div span { font-size: 11px; font-weight: normal; } +td.calGraph { height: 130px; vertical-align: bottom !important; } + +/* logos */ +td.browserlogo { text-align: center; } +td.browserlogo img { height: 15px; width: 15px; } +td.oslogo { text-align: center; } +td.oslogo img { height: 15px; width: 15px; } +td.searchenginelogo { text-align: center; } +td.searchenginelogo img { height: 16px; width: 16px; } + +/* paging */ +#paging { padding: 7px 20px 3px 0; text-align: right; } +#paging img { padding: 0 3px; } +#paging input { border: 1px solid #333; padding: 1px 4px; text-align: right; width: 40px; } +#paging span { padding: 0 7px; } +#paging span:first-child { padding: 0 20px 0 0; } + +/* tablesorter */ +table.tablesorter { font-family: arial, helvetica, sans-serif; background-color: #789abc; margin: 0; font-size: 12px; text-align: left; width: 100% } +table.tablesorter thead tr th { background-color: #cccc9f; border-right: 1px solid #eee; font-size: 12px; font-weight: normal; padding: 7px 30px 7px 7px; } +table.tablesorter thead tr .header { background-image: url('images/tablesorter_bg.gif'); background-repeat: no-repeat; background-position: center right; cursor: pointer; } +table.tablesorter tbody td { background: #f5f5f2 !important; color: #333; padding: 5px; background-color: #fff; border-right: 1px solid #eee; vertical-align: top; } +table.tablesorter tbody tr.odd td { background: #e2e2d8 !important; } +table.tablesorter tbody tr.saturday td { background: #d3d389 !important; } +table.tablesorter tbody tr.sunday td { background: #d3d389 !important; } +table.tablesorter tbody tr.highlight td { background: #fc3 !important; } +table.tablesorter thead tr .headerSortUp { background-image: url('images/tablesorter_asc.gif'); } +table.tablesorter thead tr .headerSortDown { background-image: url('images/tablesorter_desc.gif'); } +table.tablesorter thead tr .headerSortDown, +table.tablesorter thead tr .headerSortUp { background-color: #9e9e7d; color: #fff; } +table.tablesorter tfoot tr td { background-color: #9fb4cc; border-right: 1px solid #eee; color: #333; font-size: 13px; font-weight: bold; padding: 7px 5px; } +table.tablesorter .noborder { border: 0; } + +/* tag cloud */ +.tagcloud { margin-bottom: 20px; text-align: center; } +.tagcloud span { color: #333; padding: 0 16px; white-space: nowrap; } \ No newline at end of file diff --git a/jawstats/themes/default/style.js b/jawstats/themes/default/style.js new file mode 100755 index 0000000..bd17350 --- /dev/null +++ b/jawstats/themes/default/style.js @@ -0,0 +1,3 @@ +// pie chart colours +var g_sColor = "0x86b4ab,0x9e9e7d,0xab812e,0xcccc9f,0xa0acba,0x8c8c85,0xe2e2d8"; +var g_sShadowColor = "0xffffff"; \ No newline at end of file diff --git a/jawstats/xml_history.php b/jawstats/xml_history.php new file mode 100755 index 0000000..430195b --- /dev/null +++ b/jawstats/xml_history.php @@ -0,0 +1,115 @@ + 0)) { + $aIncludes = explode(",", $g_aConfig["includes"]); + foreach ($aIncludes as $sInclude) { + include $sInclude; + } + } + + // select configuraton + $g_sConfig = GetConfig(); + $g_aConfig = $aConfig[$g_sConfig]; + + // get date range and valid log file + $g_dtStatsMonth = ValidateDate($_GET["year"], $_GET["month"]); + $g_aLogFiles = GetLogList($g_sConfig, + $g_aConfig["statspath"]); + + // create xml + $aXML = array(); + $aXML[] = ""; + $iYear = date("Y", $g_aLogFiles[count($g_aLogFiles) - 1][0]); + $iMonth = date("n", $g_aLogFiles[count($g_aLogFiles) - 1][0]); + $iMaxLastUpdate = 0; + for ($iIndex = (count($g_aLogFiles) - 1); $iIndex >= 0; $iIndex--) { + $dtNextMonth = mktime (0, 0, 0, ($iMonth + 1), 0, $iYear); + $clsAWStats = new clsAWStats($g_sConfig, + $g_aConfig["statspath"], + date("Y", $g_aLogFiles[$iIndex][0]), + date("n", $g_aLogFiles[$iIndex][0])); + + if ($clsAWStats->dtLastUpdate > $iMaxLastUpdate) { + $iMaxLastUpdate = $clsAWStats->dtLastUpdate; + } + + // sum pages, hits & bandwidth + $aTemp = $clsAWStats->GetSection("DAY"); + $iPages = 0; + $iHits = 0; + $iBW = 0; + for ($iIndexItem = 0; $iIndexItem < count($aTemp); $iIndexItem++) { + $iHits += $aTemp[$iIndexItem][2]; + $iPages += $aTemp[$iIndexItem][1]; + $iBW += $aTemp[$iIndexItem][3]; + } + + // days in month + $iDaysInMonth = date("d", $dtNextMonth); + if ($iIndex == 0) { + $iPartDay = abs(date("s", $clsAWStats->dtLastUpdate)); + $iPartDay += (abs(date("i", $clsAWStats->dtLastUpdate)) * 60); + $iPartDay += (abs(date("H", $clsAWStats->dtLastUpdate)) * 60 * 60); + $iPartDay = $iPartDay / (60 * 60 * 24); + $iDaysInMonth = number_format((abs(date("d", $clsAWStats->dtLastUpdate)) - 1) + $iPartDay, 3); + } + + // create xml body + if ($g_aLogFiles[$iIndex][1] == true) { + $aXML[] = "iTotalVisits . "\" " . + "uniques=\"" . $clsAWStats->iTotalUnique . "\" " . + "pages=\"" . $iPages . "\" " . + "hits=\"" . $iHits . "\" " . + "bw=\"" . $iBW . "\" " . + "/>\n"; + } else { + $aXML[] = "\n"; + } + + // increment month + $iMonth++; + } + + // output + $aXML[] = ""; + $aXML[] = "\n"; + $clsAWStats->OutputXML(implode("", $aXML)); +?> \ No newline at end of file diff --git a/jawstats/xml_pages.php b/jawstats/xml_pages.php new file mode 100755 index 0000000..36e5524 --- /dev/null +++ b/jawstats/xml_pages.php @@ -0,0 +1,55 @@ + 0)) { + $aIncludes = explode(",", $g_aConfig["includes"]); + foreach ($aIncludes as $sInclude) { + include $sInclude; + } + } + + // select configuraton + $g_sConfig = GetConfig(); + $g_aConfig = $aConfig[$g_sConfig]; + + // create class + $clsAWStats = new clsAWStats($g_sConfig, + $g_aConfig["statspath"], + $_GET["year"], + $_GET["month"]); + + // create xml + $clsAWStats->OutputXML($clsAWStats->CreatePagesXMLString()); + +?> \ No newline at end of file diff --git a/jawstats/xml_stats.php b/jawstats/xml_stats.php new file mode 100755 index 0000000..2b940b0 --- /dev/null +++ b/jawstats/xml_stats.php @@ -0,0 +1,74 @@ + 0)) { + $aIncludes = explode(",", $g_aConfig["includes"]); + foreach ($aIncludes as $sInclude) { + include $sInclude; + } + } + + // select configuraton + $g_sConfig = GetConfig(); + $g_aConfig = $aConfig[$g_sConfig]; + + // create class + $clsAWStats = new clsAWStats($g_sConfig, + $g_aConfig["statspath"], + $_GET["year"], + $_GET["month"]); + + // create xml + $sSection = strtoupper($_GET["section"]); + switch ($sSection) { + case "BROWSER": + case "DAY": + case "DOMAIN": + case "ERRORS": + case "FILETYPES": + case "KEYWORDS": + case "PAGEREFS": + case "OS": + case "ROBOT": + case "SEARCHWORDS": + case "SEREFERRALS": + case "SESSION": + case "SIDER": + case "SIDER_404": + case "TIME": + $clsAWStats->OutputXML($clsAWStats->CreateXMLString($sSection)); + break; + } + +?> \ No newline at end of file diff --git a/jawstats/xml_update.php b/jawstats/xml_update.php new file mode 100755 index 0000000..24190eb --- /dev/null +++ b/jawstats/xml_update.php @@ -0,0 +1,62 @@ + 0)) { + $aIncludes = explode(",", $g_aConfig["includes"]); + foreach ($aIncludes as $sInclude) { + include $sInclude; + } + } + + $sConfig = $_POST["config"]; + header("content-type: text/xml"); + echo "\n"; + if (isset($GLOBALS["aConfig"][$sConfig]) == true) { + if ($_POST["pass"] == md5($GLOBALS["aConfig"][$sConfig]["password"])) { + $sCommand = "export AWSTATS_DEL_GATEWAY_INTERFACE='jawstats' && " . + $GLOBALS["aConfig"][$sConfig]["updatepath"] . + "awstats.pl -config=" . $sConfig; + $sResult = shell_exec($sCommand); + echo "" . + "" . + "" . + "" . + ""; + } else { + echo ""; + } + } else { + echo ""; + } + +?> -- 2.47.3