Search:

CWIS Developers Documentation

  • Main Page
  • Classes
  • Files
  • 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 ?>

CWIS logo doxygen
Copyright 2010 Internet Scout