<?php
require($pathtoroot.$admin."/listview/columnheader.php");
require($pathtoroot.$admin."/listview/viewmenu.php");

class clsListView 
{
    var $Formatters = Array(); // formatters to apply while printing list
    var $ColumnHeaders;
    var $ToolBar;
    var $ListItems;
    var $PageLinkTemplate;    
    var $PerPageVar;
    var $CurrentPageVar;
    var $CurrentPage;
    var $TotalItemCount;
    var $SortField;
    var $SortOrder;
    var $IdField;
    var $PrintToolBar=TRUE;
    var $ShowColumnHeaders=TRUE;
    var $checkboxes=TRUE;
    var $SelectorType;
    var $CheckboxName;
    var $CheckArray;
    var $RowIcons;
    var $SearchBar=FALSE;
    var $SearchKeywords;
    var $SearchAction;
    var $SearchDropdownId="";
    var $PageLinks;
    var $extra_env;
    var $PriorityField;
    var $PageURL;
	var $ViewMenu;

	var $JSCheckboxName;
	
    function clsListView($ToolBar=NULL,$ListItems=NULL)
    {
        $this->SetToolBar($ToolBar);
        $this->SetListItems($ListItems);
        $this->ColumnHeaders = new clsColumnHeaderList();       
        $this->CurrentPage=1;
	    $this->CheckboxName = "itemlist[]";
        $this->SelectorType="checkbox";
        $this->RowIcons = array();
        $this->PageLinks = "";
        $this->SearchAction = "";
        $this->extra_env="";
        $this->PriorityField="Priority";
        $this->TotalItemCount = 0;
        
        if (!is_null($ToolBar))
        	$this->JSCheckboxName = $ToolBar->Get("CheckClass");
        $this->SetFormatters(); // for setting custom formatters       
    }

    function SetToolbar($ToolBar)
    {
      $this->ToolBar=$ToolBar;
      if(is_object($this->ToolBar))
          $this->CheckArray=$this->ToolBar->Get("CheckClass");
    }
    
    function GetPage()
    {
    	// get current page
    	$this->RefreshPageVar();
    	return $this->CurrentPage;
   	}
	
	function GetLimitSQL()
	{
		return GetLimitSQL($this->GetPage(), $this->GetPerPage() );
	}
	
	function SetListItems($ListItems)
	{
		$this->ListItems = $ListItems;	
	}

    function SetIDfield($field)
    {
        $this->IdField = $field;
    }

    function SetSort($SortField,$SortOrderVariable)
    {
        $this->ColumnHeaders->SetSort($SortField,$SortOrder);
    }

    function SetRowIcon($index,$url)
    {
        $this->RowIcons[$index] = $url;
    }

	function ConfigureViewMenu($SortFieldVar,$SortOrderVar,$DefaultSort,$FilterVar,$FilterValue,$FilterMax)
	{
		global $objConfig;
		
		//$FilterVal = $this->CurrentFilter;
		//$fMax = $this->Filtermax;
		//$sOrder = $this->CurrentSortOrder;
		//$sOrderVar = $this->OrderVar;
		//$sField = $this->CurrentSortField;
		//$sDefault = $this->DefaultSortField;		
		
		$this->ViewMenu = new clsViewMenu();
		$this->ViewMenu->PerPageVar = $this->PerPageVar;
		$this->ViewMenu->PerPageValue = (int)$objConfig->Get($this->PerPageVar);
		if($this->ViewMenu->PerPageValue==0)
		   $this->ViewMenu->PerPageValue = 20;
		$this->ViewMenu->CurrentSortField = $objConfig->Get($SortFieldVar);
		$this->ViewMenu->CurrentSortOrder = $objConfig->get($SortOrderVar);
		$this->ViewMenu->SortVar = $SortFieldVar;
		$this->ViewMenu->OrderVar = $SortOrderVar;
		$this->ViewMenu->CurrentFilter= $FilterValue;		
		$this->ViewMenu->FilterVar = $FilterVar;
		$this->ViewMenu->FilterMax = $FilterMax;
		foreach($this->ColumnHeaders->Columns as $col)
        {
        	$this->ViewMenu->AddSortField($col->field,$col->label,$DefaultSort==$col->field);	
        }
	}
    
	function AddViewMenuFilter($Label,$Bit)
	{
	  if(is_object($this->ViewMenu))
	  	$this->ViewMenu->AddFilterField($Label,$Bit);	
	}
	
	function GetViewMenu($imagesURL)
	{	
		if(is_object($this->ViewMenu))  
		{
	  		$this->ViewMenu->CheckboxName = $this->JSCheckboxName;
			return $this->ViewMenu->GetViewMenuJS($imagesURL);	
		}
		else
		  return "";
	}
	
	function SetFormatters()
	{
		// for setting custom formatters	
		// abstract
	}
	
	function SetFormatter($field, $type, $params)
  	{
  		// by Alex
  		// all params after 2nd are formmater type specific
  		$this->Formatters[$field]['type'] = $type;
  		switch($type)
  		{
  			case FT_OPTION:
  				$this->Formatters[$field]['options'] = $params;
  				break;	
  		}
  	}
  
    function PrintItem($index)
    {
        if( !isset($this->ListItems->Items[$index]) ) return '';
        $li = $this->ListItems->Items[$index];
        
        $o = "";
        $first=1; 

        if(is_object($li))
        {        
          // ==== new by Alex: begin ====
          $li->Formatters =& $this->Formatters;
          // ==== new by Alex: end ====
          
          $id_field = $this->IdField;
          $row_id = $li->Get($id_field);
          if(is_numeric($li->Get($this->PriorityField)))
          {
              $Priority = (int)$li->Get($this->PriorityField);
          }
          else
              $Priority=0;
          $o = "<TR ".int_table_color_ret()." ID=\"$row_id\">\n";
          foreach($this->ColumnHeaders->Columns as $col)
          {
            $width="";    
            $ColId = $row_id."_col_".$col->field;
            if($first==1)
            {                                          
              if(strlen($col->width))
              {
                  $width =  $col->width;
              }
              $o .= "<TD $width valign=\"top\" class=\"text\">";
              if($this->checkboxes)
              { 
                $onclick = "onclick=\"if (this.checked) {".$this->CheckArray.".addCheck('$row_id');} else {".$this->CheckArray.".removeCheck('$row_id');}\"";
                $onclicksrc = "onclicksrc=\"if (this.checked) {".$this->CheckArray.".addCheck('$row_id');} else {".$this->CheckArray.".removeCheck('$row_id');}\"";
                $o .= "<input rowId='".$row_id."' checkArrayName='".$this->CheckArray."' isSelector=\"true\" type=\"".$this->SelectorType."\" name=\"".$this->CheckboxName."\" value=\"$row_id\" $onclick $onclicksrc>";
              }
              if(isset($this->RowIcons[$index]))
              {                  
                 $url = $this->RowIcons[$index];
                 if(strlen($url))
                   $o .= "<img src=\"".$url."\"> ";
              }
              $first=0;
            }
            else
            {       
              if(strlen($col->width))
              {
                $o .= "<TD ".$col->width.">";
              }
              else
                $o .= "<TD>";
            }
            if($Priority!=0)
            {            
                $o .= "<span class=\"priority\"><sup>$Priority</sup></span>";
                $Priority=0;
            }
            $o .= "<SPAN ID=\"$ColId\">".stripslashes($li->GetFormatted($col->field))."</SPAN></TD>\n";
          }
          $o .= "</TR>\n";
        }
        return $o;
    }

    function PrintItems()
    {
        $o = '';
        $numitems = $this->ListItems->NumItems();
        for($index=0;$index<=$numitems;$index++)
        {
            $o .= $this->PrintItem($index);
        }
        return $o;
    }

    function TotalPageNumbers()
    {
        if($this->PerPage>0)
        {
            $ret = $this->ListItems->NumItems() / $this->PerPage;
            $ret = (int)$ret;
        }
        else
            $ret = 1;

        return $ret;
    }
    
    function GetPerPage()
    {
    	global $objConfig;
    	$PerPage = $objConfig->Get($this->PerPageVar);
        if($PerPage < 1)
        {
            if( defined('DEBUG_MODE') ) echo 'PerPage Variable [<b>'.$this->PerPageVar.'</b>] not defined in Config<br>';
            $PerPage = 20;
            //$objConfig->Set($this->PerPageVar,20);
            //$objConfig->Save();
        }
    	return $PerPage;
    }
    
    function GetAdminPageLinkList($url)
    {
        global $objConfig;
                          
        $PerPage = $this->GetPerPage();
        
        if($this->TotalItemCount>0)
        {
            $NumPages = ceil($this->TotalItemCount / $PerPage);
        }
        else
          $NumPages = ceil($this->ListItems->NumItems() / $PerPage);

        if($NumPages<1)
            $NumPages =1;
        //echo $this->CurrentPage." of ".$NumPages." Pages";

        $o = "";
        if($this->CurrentPage>$NumPages)
            $this->CurrentPage=$NumPages;

        $StartPage = $this->CurrentPage - 5;
        if($StartPage<1)
            $StartPage=1;
        $EndPage = $StartPage+9;
        if($EndPage>$NumPages)
        {        
            $EndPage = $NumPages;
            $StartPage = $EndPage-10;
            if($StartPage<1)
                $StartPage=1;
        }
        
        $o .= "<b class=\"text\">".admin_language("la_Page")."</b> ";
        if($StartPage>1)
        {
          $target =  $this->CurrentPage-10; 
          $prev_url = str_replace("{TargetPage}",$target,$url);
          $o .= "<A HREF=\"$prev_url\" class=\"NAV_URL\"><<</A>";
        }
        
        for($p=$StartPage;$p<=$EndPage;$p++)
        {
            if($p!=$this->CurrentPage)
            {                
                $href = str_replace("{TargetPage}",$p,$url);
                $o .= " <A HREF=\"$href\" class=\"NAV_URL\">$p</A> ";
            }
            else
            {
                $o .= " <SPAN class=\"CURRENT_PAGE\">$p</SPAN> ";
            }
        }
        if($EndPage<$NumPages-1)
        {
          $target =  $this->CurrentPage+10;
          $next_url = str_replace("{TargetPage}",$target,$url);
          $o .= "<A HREF=\"$next_url\" class=\"NAV_URL\"> &gt;&gt;</A>";
        }
        return $o;        
    }

    function SliceItems()
    {
        global $objConfig;

        $PerPage = (int)$objConfig->Get($this->PerPageVar);
        if($PerPage<1)
           $PerPage=20;
        $NumPages = ceil($this->ListItems->NumItems() / $PerPage);
        if($NumPages>1)
        {        
          $Start = ($this->CurrentPage-1)*$PerPage;
          $this->ListItems->Items = array_slice($this->ListItems->Items,$Start,$PerPage);
        }
    }
	
	function RefreshPageVar()
	{
	  global $objSession;
	  if( (int)GetVar('lpn') > 0)
      {          
          $this->CurrentPage = $_GET["lpn"];
          $objSession->SetVariable($this->CurrentPageVar,$this->CurrentPage);
      }
      else
          $this->CurrentPage = $objSession->GetVariable($this->CurrentPageVar);
      
      $this->ListItems->Page = $this->CurrentPage;
	}
	
    function PrintPageLinks()
    {
      global $imagesURL, $objSession, $lvErrorString;
      
      if(strlen($this->PageLinks)>0)
      {
          return $this->PageLinks;
      }
      $this->RefreshPageVar();
     
      if($this->CurrentPage<1)
          $this->CurrentPage = 1;
      if(!strlen($this->PageURL))
      {     
          $this->PageURL = $_SERVER["PHP_SELF"]."?env=".BuildEnv();
          if(strlen($this->extra_env))
            $this->PageURL .= "&".$this->extra_env;
          $this->PageURL .= "&lpn={TargetPage}";
      }
      $cols = $this->ColumnHeaders->Count();
      $o = "<TABLE  cellSpacing=0 cellPadding=2 width=\"100%\" class=\"pagenav\"><tbody><TR >\n";
      
      if(strlen($lvErrorString))
      {
         $o .= "<TD STYLE=\"border-bottom: 1px solid #000000;\" colspan=2><span class=\"validation_error\">$lvErrorString</SPAN></TD></TR><TR>";
         
      }
      if($this->SearchBar==FALSE)
      {      
        $o .= "<TD  colspan=2>";
        $o .= $this->GetAdminPageLinkList($this->PageURL);
        $o .= "</TD>\n";
      }
      else
      {
      	  $val = str_replace(","," ", $this->SearchKeywords);
          $o .= "<TD>";
          
          $o .= $this->GetAdminPageLinkList($this->PageURL)."</TD>";          
          $o .= "<TD align=\"right\" valign=\"top\">".admin_language("la_prompt_Search");
          $o .= "    <INPUT TYPE=\"TEXT\" ID=\"ListSearchWord\" NAME=\"ListSearchWord\" VALUE=\"$val\">";
          $o .= "    <IMG align=\"middle\" height=24 width=24 name=\"imgSearch\" ID=\"imgSearch\" src=\"$imagesURL/itemicons/icon16_search.gif\" ";
          $o .= "         onMouseOut=\"swap('imgSearch', '$imagesURL/itemicons/icon16_search.gif');\" "; 
          $o .= "         onMouseOver=\"swap('imgSearch','$imagesURL/itemicons/icon16_search_f2.gif');\" ";
          $o .= "         onClick=\"Submit_ListSearch('".$this->SearchAction."');\">"; 
          $o .= "     <IMG align=\"middle\" height=24 width=24 name=\"imgResetSearch\" ID=\"imgResetSearch\" src=\"$imagesURL/itemicons/icon16_search_reset.gif\" ";
          $o .= "         onMouseOut=\"swap('imgResetSearch', '$imagesURL/itemicons/icon16_search_reset.gif');\" "; 
          $o .= "         onMouseOver=\"swap('imgResetSearch','$imagesURL/itemicons/icon16_search_reset_f2.gif');\" ";
          $o .= "         onClick=\"Submit_ListSearch('".$this->SearchAction."_reset');\">";           
          if(strlen($this->SearchDropdownId)>0)
          {
          	$o .= "     <IMG height=16 width=16 name=\"imgSearchDropDown\" src=\"$imagesURL/itemicons/icon16_search_dropdown.gif\" ";
          	$o .= "         onMouseOut=\"swap('imgResetDropDown', '$imagesURL/itemicons/icon16_search_dropdown.gif');\" "; 
          	$o .= "         onMouseOver=\"swap('imgResetDropDown','$imagesURL/itemicons/icon16_search_dropdown.gif');\" ";
          	$o .= "         onClick=\"ListSearch_PopUp('".$this->SearchDropdownId."');\">";           	
          }
          $o .= "</TD>";
      }
      $o .= "</TR></TABLE>";
      return $o;
    }

    function PrintJavaScriptInit()
    {
		$o = '';
      if($this->checkboxes)
      {       
        $o = "<script language=\"javascript\">\n";
        $o .="<!--\n";

        foreach($this->ListItems->Items as $li)
        {
        	$o .= $this->CheckArray.".CheckList[".$this->CheckArray.".CheckList.length] = '".$li->Get($this->IdField)."';\n";
        }
        $o .= $this->CheckArray.".setImages();\n";
        $o .="//-->\n";
        $o .="</script>";
      }
      return $o;
    }


    function PrintList()
    {
        global $objSession;
        if((int)$this->CurrentPage<1)
            $this->CurrentPage=1;

        $o = "\n";
		
        if(is_object($this->ToolBar))
        {
            if($this->PrintToolBar)
              $o .= $this->ToolBar->Build();
        }
        $o .= $this->PrintPageLinks();
        $o .= "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"4\" class=\"tableborder\">\n";

        if($this->ShowColumnHeaders)
        {
          $o .= $this->ColumnHeaders->PrintColumns();
        }
        if($this->ListItems->NumItems()>0)
        {                  
          $o .= $this->PrintItems();
         
        }
        	
        $o .= "</TABLE>";
        if($this->ListItems->NumItems()>0)
          $o .= $this->PrintJavaScriptInit();
        return $o;
    }
}