Search:

# CWIS Developers Documentation

- Main Page
- Classes
- Files

- Search for |

- File List
- File Members

# PopupWindow.php

Go to the documentation of this file.

    00001 <?PHP
    00002 #
    00003 #   FILE:  Scout--PopupWindow.php
    00004 #   Copyright 2009 Edward Almasy and Internet Scout
    00005 #   http://scout.wisc.edu
    00006 #
    00007
    00011 class PopupWindow {
    00012
    00013     # ---- PUBLIC INTERFACE --------------------------------------------------
    00014
    00021     function PopupWindow($PopupId, $DB, $UserId = NULL)
    00022     {
    00023         # save our window ID and database handle
    00024         $this->Id = intval($PopupId);
    00025         $this->DB = $DB;
    00026         $this->UserId = $UserId ? intval($UserId) : NULL;
    00027
    00028         # set defaults
    00029         $this->Width = 400;
    00030         $this->Height = 200;
    00031         $this->ForceDisplay = FALSE;
    00032         $this->SeenCountThreshold = 5;
    00033         $this->SeenTimeThreshold = 60;
    00034         $this->CookieLifetimeInDays = 90;
    00035     }
    00036
    00042     function Initialize($CountThreshold, $TimeThreshold)
    00043     {
    00044         $this->SeenCountThreshold = $CountThreshold;
    00045         $this->SeenTimeThreshold = $TimeThreshold;
    00046         $this->ShouldDisplay();
    00047     }
    00048
    00052     function Width($NewWidth) {  $this->Width = intval($NewWidth);  }
    00056     function Height($NewHeight) {  $this->Height = intval($NewHeight);  }
    00057
    00062     function Id() {  return $this->Id;  }
    00063
    00068     function WillDisplay() {  return $this->ShouldDisplay();  }
    00069
    00074     function AlwaysDisplay($Display) {  $this->ForceDisplay = $Display;  }
    00075
    00079     function PrintHeaderCode()
    00080     {
    00081         # if we should display the window
    00082         if ($this->ShouldDisplay())
    00083         {
    00084             ?>
    00085             <style type="text/css">@import 'include/thickbox.css';</style>
    00086             <script type="text/javascript" src="include/SPT--jQuery.js"></script>
    00087             <script type="text/javascript" src="include/thickbox-compressed.js"></script>
    00088             <script type="text/javascript">
    00089                 $(document).ready(function(){
    00090                     tb_show('', '#TB_inline?inlineId=PopupWindowContent<?PHP
    00091                             print($this->Id());  ?>&width=<?PHP
    00092                             print($this->Width);  ?>&height=<?PHP
    00093                             print($this->Height);  ?>&modal=true', 'null');
    00094                 });
    00095             </script>
    00096             <?PHP
    00097         }
    00098     }
    00099
    00103     function PrintBeginContentCode()
    00104     {
    00105         # if we should display the window
    00106         if ($this->ShouldDisplay())
    00107         {
    00108             # display code for beginning of content section
    00109             ?><div id="PopupWindowContent<?PHP  print($this->Id());
    00110                     ?>" style="display: none;"><span><?PHP
    00111         }
    00112     }
    00113
    00117     function PrintEndContentCode()
    00118     {
    00119         # if we should display the window
    00120         if ($this->ShouldDisplay())
    00121         {
    00122             # display code for end of content section
    00123             ?></span></div><?PHP
    00124         }
    00125     }
    00126
    00127
    00128     # ---- PRIVATE INTERFACE -------------------------------------------------
    00129
    00130     private $Id;
    00131     private $DB;
    00132     private $UserId;
    00133     private $Width;
    00134     private $Height;
    00135     private $ForceDisplay;
    00136     private $SeenCountThreshold;
    00137     private $SeenTimeThreshold;
    00138     private $CookieLifetimeInDays;
    00139     private $DisplayStatus;             # local to ShouldDisplay()
    00140     private $UserIdSeenCount;           # local to SeenCountForUserId()
    00141     private $UserIdFirstSeen;
    00142     private $IPAddressSeenCount;        # local to SeenCountForIPAddress()
    00143     private $IPAddressFirstSeen;
    00144
    00145     # determine whether pop-up window should be displayed
    00146     private function ShouldDisplay()
    00147     {
    00148         # if user requested always display return TRUE to caller
    00149         if ($this->ForceDisplay) {  return TRUE;  }
    00150
    00151         # if we have already determined status for this window
    00152         if (isset($this->DisplayStatus))
    00153         {
    00154             # return status to caller
    00155             return $this->DisplayStatus;
    00156         }
    00157
    00158         # if cookie is available
    00159         if (isset($_COOKIE["ScoutPopupCount".$this->Id])
    00160                 && isset($_COOKIE["ScoutPopupFirstSeen".$this->Id]))
    00161         {
    00162             # if cookie seen count is below threshold
    00163             $Count = $_COOKIE["ScoutPopupCount".$this->Id];
    00164             if ($Count < $this->SeenCountThreshold)
    00165             {
    00166                 # increase cookie seen count
    00167                 setcookie("ScoutPopupCount".$this->Id, ($Count + 1),
    00168                         (time() + (60*60*24 * $this->CookieLifetimeInDays)));
    00169                 setcookie("ScoutPopupFirstSeen".$this->Id,
    00170                         $_COOKIE["ScoutPopupFirstSeen".$this->Id],
    00171                         (time() + (60*60*24 * $this->CookieLifetimeInDays)));
    00172             }
    00173             else
    00174             {
    00175                 # if enough time has elapsed and we are not sure about displaying window
    00176                 if ((time() - $_COOKIE["ScoutPopupFirstSeen".$this->Id])
    00177                             >= $this->SeenTimeThreshold)
    00178                 {
    00179                     # if cookie seen count is at threshold
    00180                     if ($Count == $this->SeenCountThreshold)
    00181                     {
    00182                         # display the window
    00183                         $Display = TRUE;
    00184
    00185                         # increase cookie seen count
    00186                         setcookie("ScoutPopupCount".$this->Id, ($Count + 1),
    00187                                 (time() + (60*60*24 * $this->CookieLifetimeInDays)));
    00188                         setcookie("ScoutPopupFirstSeen".$this->Id,
    00189                                 $_COOKIE["ScoutPopupFirstSeen".$this->Id],
    00190                                 (time() + (60*60*24 * $this->CookieLifetimeInDays)));
    00191                     }
    00192                     else
    00193                     {
    00194                         # do not display the window
    00195                         $Display = FALSE;
    00196                     }
    00197                 }
    00198             }
    00199         }
    00200         else
    00201         {
    00202             # set cookie
    00203             setcookie("ScoutPopupFirstSeen".$this->Id, time(),
    00204                     (time() + (60*60*24 * $this->CookieLifetimeInDays)));
    00205             setcookie("ScoutPopupCount".$this->Id, 1,
    00206                     (time() + (60*60*24 * $this->CookieLifetimeInDays)));
    00207         }
    00208
    00209         # if we know the user ID
    00210         if ($this->UserId !== NULL)
    00211         {
    00212             # if we have seen this user ID before
    00213             $Count = $this->SeenCountForUserId();
    00214             if ($Count !== NULL)
    00215             {
    00216                 # if user ID seen count is below threshold
    00217                 if ($Count < $this->SeenCountThreshold)
    00218                 {
    00219                     # increase user ID seen count
    00220                     $Count = $this->SeenCountForUserId($Count + 1);
    00221                 }
    00222                 else
    00223                 {
    00224                     # if enough time has elapsed
    00225                     if ($this->SecondsSinceUserIdFirstSeen()
    00226                                     >= $this->SeenTimeThreshold)
    00227                     {
    00228                         # if user ID seen count is at threshold
    00229                         if ($Count == $this->SeenCountThreshold)
    00230                         {
    00231                             # display the window (if not previously disallowed)
    00232                             if (!isset($Display)) {  $Display = TRUE;  }
    00233
    00234                             # increase user ID seen count
    00235                             $Count = $this->SeenCountForUserId($Count + 1);
    00236                         }
    00237                         else
    00238                         {
    00239                             # do not display the window
    00240                             $Display = FALSE;
    00241                         }
    00242                     }
    00243                 }
    00244             }
    00245             else
    00246             {
    00247                 # add user ID to database
    00248                 $Count = $this->SeenCountForUserId(1);
    00249             }
    00250         }
    00251
    00252         # if we have seen this IP address before
    00253         $Count = $this->SeenCountForIPAddress();
    00254         if ($Count !== NULL)
    00255         {
    00256             # if IP address seen count is below threshold
    00257             if ($Count < $this->SeenCountThreshold)
    00258             {
    00259                 # increase IP address seen count
    00260                 $Count = $this->SeenCountForIPAddress($Count + 1);
    00261             }
    00262             else
    00263             {
    00264                 # if enough time has elapsed
    00265                 if ($this->SecondsSinceIPAddressFirstSeen() >= $this->SeenTimeThreshold)
    00266                 {
    00267                     # if IP address seen count is at threshold
    00268                     if ($Count == $this->SeenCountThreshold)
    00269                     {
    00270                         # display the window (if not previously disallowed)
    00271                         if (!isset($Display)) {  $Display = TRUE;  }
    00272
    00273                         # increase IP address seen count
    00274                         $Count = $this->SeenCountForIPAddress($Count + 1);
    00275                     }
    00276                     else
    00277                     {
    00278                         # do not display the window
    00279                         $Display = FALSE;
    00280                     }
    00281                 }
    00282             }
    00283         }
    00284         else
    00285         {
    00286             # add IP address to database
    00287             $Count = $this->SeenCountForIPAddress(1);
    00288         }
    00289
    00290         # if we are still not sure whether to display the window
    00291         if (!isset($Display))
    00292         {
    00293             # do not display the window
    00294             $Display = FALSE;
    00295         }
    00296
    00297         # save window display status
    00298         $this->DisplayStatus = $Display;
    00299
    00300         # return window display status to caller
    00301         return $Display;
    00302     }
    00303
    00304     # get/set seen count for current user ID (returns NULL if not set)
    00305     private function SeenCountForUserId($NewSeenCount = NULL)
    00306     {
    00307         # attempt to retrieve count from database
    00308         if (!isset($this->UserIdSeenCount))
    00309         {
    00310             $this->DB->Query("SELECT SeenCount, FirstSeen FROM PopupLog"
    00311                     ." WHERE PopupId = ".$this->Id
    00312                     ." AND SigOne = ".$this->UserId
    00313                     ." AND SigTwo <= 0");
    00314             if( $this->DB->NumRowsSelected() )
    00315             {
    00316                 $Tmp = $this->DB->FetchRow();
    00317                 $this->UserIdSeenCount = $Tmp["SeenCount"];
    00318                 $this->UserIdFirstSeen = $Tmp["FirstSeen"];
    00319             }
    00320             else
    00321             {
    00322                 $this->UserIdSeenCount = NULL;
    00323                 $this->UserIdFirstSeen = NULL;
    00324             }
    00325         }
    00326         $Count = $this->UserIdSeenCount;
    00327
    00328         # if new count supplied
    00329         if ($NewSeenCount !== NULL)
    00330         {
    00331             # if count is already in database
    00332             if ($Count !== NULL)
    00333             {
    00334                 # update count in database
    00335                 $this->DB->Query("UPDATE PopupLog SET SeenCount = ".$NewSeenCount
    00336                         ." WHERE PopupId = ".intval($this->Id)
    00337                         ." AND SigOne = ".$this->UserId
    00338                         ." AND SigTwo <= 0");
    00339             }
    00340             else
    00341             {
    00342                 # add count to database
    00343                 $this->DB->Query("INSERT INTO PopupLog"
    00344                         ." (PopupId, SigOne, SigTwo, FirstSeen, SeenCount) VALUES "
    00345                         ." (".$this->Id.", ".$this->UserId.", -1, NOW(), "
    00346                                 .$NewSeenCount.")");
    00347             }
    00348
    00349             # set current count to new count
    00350             $Count = $NewSeenCount;
    00351         }
    00352
    00353         # return current count to caller
    00354         return $Count;
    00355     }
    00356
    00357     # get/set seen count for IP address of current user (returns NULL if not set)
    00358     private function SeenCountForIPAddress($NewSeenCount = NULL)
    00359     {
    00360         # attempt to retrieve count from database
    00361         if (!isset($this->IPAddressSeenCount))
    00362         {
    00363             $this->DB->Query("SELECT SeenCount, FirstSeen FROM PopupLog"
    00364                     ." WHERE PopupId = ".$this->Id
    00365                     ." AND SigOne = ".$this->UserIPSigOne()
    00366                     ." AND SigTwo = ".$this->UserIPSigTwo());
    00367             if( $this->DB->NumRowsSelected() )
    00368             {
    00369                  $Tmp = $this->DB->FetchRow();
    00370                  $this->IPAddressSeenCount = $Tmp["SeenCount"];
    00371                  $this->IPAddressFirstSeen = $Tmp["FirstSeen"];
    00372             }
    00373             else
    00374             {
    00375                  $this->IPAddressSeenCount = NULL;
    00376                  $this->IPAddressFirstSeen = NULL;
    00377             }
    00378         }
    00379         $Count = $this->IPAddressSeenCount;
    00380
    00381         # if new count supplied
    00382         if ($NewSeenCount !== NULL)
    00383         {
    00384             # if count is already in database
    00385             if ($Count !== NULL)
    00386             {
    00387                 # update count in database
    00388                 $this->DB->Query("UPDATE PopupLog SET SeenCount = ".$NewSeenCount
    00389                         ." WHERE SigOne = ".$this->UserIPSigOne()
    00390                         ." AND SigTwo = ".$this->UserIPSigTwo());
    00391             }
    00392             else
    00393             {
    00394                 # add count to database
    00395                 $this->DB->Query("INSERT INTO PopupLog"
    00396                         ." (PopupId, SigOne, SigTwo, SeenCount, FirstSeen)"
    00397                         ." VALUES (".$this->Id.", "
    00398                                 .$this->UserIPSigOne().", "
    00399                                 .$this->UserIPSigTwo().", "
    00400                                 .$NewSeenCount.", NOW())");
    00401             }
    00402
    00403             # set current count to new count
    00404             $Count = $NewSeenCount;
    00405         }
    00406
    00407         # return current count to caller
    00408         return $Count;
    00409     }
    00410
    00411     # get seconds since current user ID first seen
    00412     private function SecondsSinceUserIdFirstSeen()
    00413     {
    00414         if (!isset($this->UserIdFirstSeen)) {  $this->SeenCountForUserId();  }
    00415         return time() - strtotime($this->UserIdFirstSeen);
    00416     }
    00417
    00418     # get seconds since IP address of current user first seen
    00419     private function SecondsSinceIPAddressFirstSeen()
    00420     {
    00421         if (!isset($this->IPAddressFirstSeen)) {  $this->SeenCountForIPAddress();  }
    00422         return time() - strtotime($this->IPAddressFirstSeen);
    00423     }
    00424
    00425     # return signature values for IP address of current user
    00426     private function UserIPSigOne()
    00427     {
    00428         $Bytes = explode(".", $_SERVER["REMOTE_ADDR"]);
    00429         return (count($Bytes) != 4) ? 0
    00430                 : (intval($Bytes[0]) * 256) + intval($Bytes[1]);
    00431     }
    00432     private function UserIPSigTwo()
    00433     {
    00434         $Bytes = explode(".", $_SERVER["REMOTE_ADDR"]);
    00435         return (count($Bytes) != 4) ? 0
    00436                 : (intval($Bytes[2]) * 256) + intval($Bytes[3]);
    00437     }
    00438 }
    00439
    00440
    00441 ?>