%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /www/varak.net/awstats.varak.net/
Upload File :
Create Path :
Current File : /www/varak.net/awstats.varak.net/clsAWStats.php

<?php
/*
 * JAWStats 0.8.0 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.
 */

class clsAWStats
{
    var $sAWStats        = "";
    var $bLoaded         = false;
    var $iYear           = 0;
    var $iMonth          = 0;
    var $dtLastUpdate    = 0;
    var $iTotalVisits    = 0;
    var $iUniqueVisits   = 0;
    var $arrLabel        = array();
    var $arrLogMonths    = array();
    var $siteName        = array();
    var $dtStartOfMonth  = 0;
    var $iDaysInMonth    = 0;
    var $iDailyVisitAvg  = 0;
    var $iDailyUniqueAvg = 0;
    var $sFileName       = "";

    function clsAWStats($sStatName, $sFilePath = "", $sFileName = "", $iYear = 0, $iMonth = 0)
    {
        // validate dates
        $dtDate       = ValidateDate($iYear, $iMonth);
        $this->iYear  = date("Y", $dtDate);
        $this->iMonth = date("n", $dtDate);

        // load data
        if (strlen($sFileName) == 0) {
            $sFileName = ("awstats[MM][YYYY]." . $sStatName . ".txt");
            if ($GLOBALS["bUTF8LogFiles"])
                $sFileName .= ".utf8";
        }
        $sFileName = str_replace("[YYYY]", $this->iYear, $sFileName);
        $sFileName = str_replace("[YY]", substr($this->iYear, 2), $sFileName);
        if ($this->iMonth < 10) {
            $sFileName = str_replace("[MM]", ("0" . $this->iMonth), $sFileName);
        } else {
            $sFileName = str_replace("[MM]", $this->iMonth, $sFileName);
        }
        $sFileName = str_replace("[M]", $this->iMonth, $sFileName);
        $sFilePath = ($sFilePath . $sFileName);

        $this->sFileName = $sFileName;

        if (is_readable($sFilePath)) {
            $this->sAWStats = htmlentities(file_get_contents($sFilePath), ENT_IGNORE);
            $this->bLoaded  = true;
        }
        else
            return;

        // 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", "pages");
        $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", "pages");
        $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");
        $this->arrLabel["VISITOR"]                   = array("address", "pages", "hits", "bw", "lastvisit",
            "lastvisitstart", "lastvisitpage", "desc");
        $this->arrLabel["EMAILSENDER"]               = array("address", "emails", "bw", "lastvisit");
        $this->arrLabel["EMAILRECEIVER"]             = array("address", "emails", "bw", "lastvisit");
        $this->arrLabel["PLUGIN_geoip_city_maxmind"] = array("id", "pages", "hits", "bw", "lastvisit");
        $this->arrLabel["PLUGIN_geoip_org_maxmind"]  = array("id", "pages", "hits", "bw", "lastvisit");


        // days in month
        if (($this->iYear == date("Y")) && ($this->iMonth == date("n"))) {
            $this->iDaysInMonth = abs(date("s", $this->dtLastUpdate));
            $this->iDaysInMonth += (abs(date("i", $this->dtLastUpdate)) * 60);
            $this->iDaysInMonth += (abs(date("H", $this->dtLastUpdate)) * 60 * 60);
            $this->iDaysInMonth = abs(date("j", $this->dtLastUpdate) - 1) + ($this->iDaysInMonth / (60 * 60 * 24));
        } else {
            $this->iDaysInMonth = date("d", mktime(0, 0, 0, date("n", $this->dtLastUpdate), 0, date("Y", $this->dtLastUpdate)));
        }

        // start of the month
        $this->dtStartOfMonth  = mktime(0, 0, 0, $this->iMonth, 1, $this->iYear);
        $this->iDailyVisitAvg  = ($this->iTotalVisits / $this->iDaysInMonth);
        $this->iDailyUniqueAvg = ($this->iTotalUnique / $this->iDaysInMonth);
    }

    function CreateJSON($sSection)
    {
        echo json_encode($this->GetSection($sSection));
    }

    function CreatePagesXMLString($urlAliasFile = null)
    {
        // produce xml
        $aXML    = array();
        $aData   = $this->GetSection("SIDER");
        $dTitles = null;

        // Page Titles
        if ($urlAliasFile !== null) {
            $aTitles = file($urlAliasFile);
            foreach ($aTitles as $line) {
                $line_parts              = explode("\t", $line);
                $dTitles[$line_parts[0]] = $line_parts[1];
            }
        }

        // 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
        $sHaveTitles = ($dTitles == null) ? ("\"0\"") : ("\"1\"");
        $aXML[]      = ("<info lastupdate=\"" . $this->dtLastUpdate . "\" haveTitles=" . $sHaveTitles . "/>\n" .
            "<totals pages=\"" . $iTotalPages . "\" bw=\"" . $iTotalBW . "\" entry=\"" .
            $iTotalEntry . "\" exit=\"" . $iTotalExit . "\" />\n");


        // sort by page views
        usort($aData, "Sort1");
        $aXML[] = "<data_pages>";
        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]) . "\" ";
            }

            // add title (if available)
            if ($dTitles !== null) {
                $url   = $aData[$iIndexItem][0];
                $title = $dTitles[$url];
                $sTemp .= " title= \"" . trim($title) . "\"";
            }

            $aXML[] = ("<item " . $sTemp . "/>\n");
            if ($iIndexItem > $iSize) {
                break;
            }
        }
        $aXML[] = "</data_pages>\n";

        // sort by bandwidth
        usort($aData, "Sort2");
        $aXML[] = "<data_bw>";
        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[] = ("<item " . $sTemp . "/>\n");
            if ($iIndexItem > $iSize) {
                break;
            }
        }
        $aXML[] = "</data_bw>\n";

        // sort by bandwidth
        usort($aData, "Sort3");
        $aXML[] = "<data_entry>";
        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[] = ("<item " . $sTemp . "/>\n");
            if ($iIndexItem > $iSize) {
                break;
            }
        }
        $aXML[] = "</data_entry>\n";

        // sort by bandwidth
        usort($aData, "Sort4");
        $aXML[] = "<data_exit>";
        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[] = ("<item " . $sTemp . "/>\n");
            if ($iIndexItem > $iSize) {
                break;
            }
        }
        $aXML[] = "</data_exit>\n";

        // return
        return implode($aXML, "");
    }

    function CreateXMLString($sSection)
    {
        // produce xml
        $aXML    = array();
        $arrData = $this->GetSection($sSection);
        $aXML[]  = "<info lastupdate=\"" . $this->dtLastUpdate . "\" />\n<data>\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[] = ("<item " . $sTemp . "/>\n");
        }
        $aXML[] = "</data>\n";
        return implode("", $aXML);
    }

    function GetSection($sSection)
    {
        $arrData   = array();
        $iStartPos = strpos($this->sAWStats, ("\nBEGIN_" . $sSection . " "));
        if ($iStartPos === FALSE)
            return array();
        $iEndPos   = strpos($this->sAWStats, ("\nEND_" . $sSection), $iStartPos);
        $max       = 0;
        $aDesc     = $GLOBALS["aDesc"];
        if (isset($_REQUEST["max"]))
            $max       = $_REQUEST["max"];
        $arrStat   = explode("\n", substr($this->sAWStats, ($iStartPos + 1), ($iEndPos - $iStartPos - 1)));

        if ($max == 0)
            for ($iIndex = 1; $iIndex < count($arrStat); $iIndex++) {
                $data_line = explode(' ', $arrStat[$iIndex]);
                if (isset($aDesc[$sSection])) {
                    $req_len     = count($this->arrLabel[$sSection]) - 1;
                    while (count($data_line) < $req_len)
                        $data_line[] = "";
                    $desc        = $data_line[0];
                    if (isset($aDesc[$sSection][$data_line[0]]))
                        $desc        = $aDesc[$sSection][$data_line[0]];
                    $data_line[] = $desc;
                }
                $arrData[] = $data_line;
            }
        else
            for ($iIndex = 1; $iIndex < count($arrStat); $iIndex++) {
                $data_line = explode(' ', $arrStat[$iIndex]);
                if (isset($aDesc[$sSection])) {
                    $req_len     = count($this->arrLabel[$sSection]) - 1;
                    while (count($data_line) < $req_len)
                        $data_line[] = "";
                    $desc        = $data_line[0];
                    if (isset($aDesc[$sSection][$data_line[0]]))
                        $desc        = $aDesc[$sSection][$data_line[0]];
                    $data_line[] = $desc;
                }
                $arrData[] = $data_line;
                if ($iIndex > $max)
                    break;
            }
        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 "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" .
        "<jawstats>\n" . $sXML . "</jawstats>";
    }
}

//  "Static" functions

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($_REQUEST["config"]) == true) && (isset($GLOBALS["aConfig"][$_REQUEST["config"]]) == true) && ($GLOBALS['bForceHttpHost'] === false)) {
        $sConfig = $_REQUEST["config"];
    } else if (($GLOBALS['bUseHttpHost'] === true) && isset($GLOBALS["aConfig"][$_ENV['HTTP_HOST']])) {
        $sConfig = $_ENV['HTTP_HOST'];
    } else if ($GLOBALS['bForceHttpHost'] === false) {
        $sConfig = key($GLOBALS["aConfig"]);
    } else {
        Error('BadConfigNoSites');
    }

    // 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, $sFileName = "", $sParts = "")
{
    if ($oDir = opendir($sFilePath)) {
        if (strlen($sParts) > 0) {
            $arr = explode(",", $sParts);
            $sStatsName.="." . $arr[0];
        }
        // create regex
        if (strlen($sFileName) == 0) {
            $sFileName = ("awstats[MM][YYYY]." . $sStatsName . ".txt");
            if ($GLOBALS["bUTF8LogFiles"])
                $sFileName .= ".utf8";
        }

        $sRegex = str_replace("[YYYY]", "\d\d\d\d", $sFileName);
        $sRegex = str_replace("[YY]", "\d\d", $sRegex);
        $sRegex = str_replace("[MM]", "\d\d", $sRegex);
        $sRegex = str_replace("[M]", "\d", $sRegex);

        // load available dates into array and sort by date
        while (($oItem = readdir($oDir)) !== false) {
            if (preg_match("/^" . $sRegex . "$/", $oItem) == true) {
                $sYear = null;
                // year [YYYY]
                if (strpos($sFileName, "[YYYY]") !== false) {
                    $sYear = substr($oItem, strpos(str_replace("]", "", str_replace("[", "", str_replace("[YYYY]", "****", $sFileName))), "****"), 4);
                }
                // year [YY]
                if (strpos($sFileName, "[YY]") !== false) {
                    $sYear = substr($oItem, strpos(str_replace("]", "", str_replace("[", "", str_replace("[YY]", "**", $sFileName))), "**"), 2);
                }
                $sMonth = null;
                // month [MM]
                if (strpos($sFileName, "[MM]") !== false) {
                    $sMonth = substr($oItem, strpos(str_replace("]", "", str_replace("[", "", str_replace("[MM]", "**", $sFileName))), "**"), 2);
                }
                // month [M]
                if (strpos($sFileName, "[M]") !== false) {
                    $sMonth = substr($oItem, strpos(str_replace("]", "", str_replace("[", "", str_replace("[M]", "*", $sFileName))), "*"), 1);
                }
                $aTemp[] = mktime(0, 0, 0, intval($sMonth), 1, intval($sYear));
            }
        }
        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 SumTotalVisits($arrStats)
{
    $sum = 0;
    foreach ($arrStats as $clsAWStats) {
        $sum += $clsAWStats->iTotalVisits;
    }
    return $sum;
}

function SumUniqueVisits($arrStats)
{
    $sum = 0;
    foreach ($arrStats as $clsAWStats) {
        $sum += $clsAWStats->iTotalUnique;
    }
    return $sum;
}

function CalclDailyVisitAvg($arrStats)
{
    $count = 0;
    $sum   = 0;
    foreach ($arrStats as $clsAWStats) {
        $count++;
        $sum += $clsAWStats->iDailyVisitAvg;
    }
    return $sum / $count;
}

function CalclDailyUniqueAvg($arrStats)
{
    $count = 0;
    $sum   = 0;
    foreach ($arrStats as $clsAWStats) {
        $count++;
        $sum += $clsAWStats->iDailyUniqueAvg;
    }
    return $sum / $count;
}

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($_REQUEST["lang"]) == true) && (FindTranslation($_REQUEST["lang"]) == true)) {
        return $_REQUEST["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 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);
}

Zerion Mini Shell 1.0