Index: trunk/kernel/include/parseditem.php
===================================================================
--- trunk/kernel/include/parseditem.php	(revision 341)
+++ trunk/kernel/include/parseditem.php	(revision 342)
@@ -1,2881 +1,2927 @@
 <?php
 global $ItemTypePrefixes;
 
 $ItemTypePrefixes = array();
 $ItemTagFiles = array();
 
 function RegisterPrefix($class,$prefix,$file)
 {
  	global $ItemTypePrefixes, $ItemTagFiles;
     	
  	$ItemTypePrefixes[$class] = $prefix;
  	$ItemTagFiles[$prefix] = $file;
 }
 
 class clsParsedItem extends clsItemDB
 {
     var $TagPrefix;
     var $Parser;
     var $AdminParser;    
 
     function clsParsedItem($id=NULL)
     {
         global $TemplateRoot;
 
         $this->clsItemDB();
         $this->Parser = new clsTemplateList($TemplateRoot);
         $this->AdminParser = new clsAdminTemplateList();
     }
         
 /*    function ParseObject($element)
     {
         $extra_attribs = ExtraAttributes($element->attributes);
         if(strtolower($element->name)==$this->TagPrefix)
         {
             $field = strtolower($element->attributes["_field"]);
             $tag = $this->TagPrefix."_".$field;
             $ret = $this->parsetag($tag);
         }
         return $ret;
     }
 */
 	function ParseTimeStamp($d,$attribs=array())
 	{
        if( isset($attribs["_tz"]) )
        {
             $d = GetLocalTime($d,$objSession->Get("tz"));
        }
        $part = isset($attribs["_part"]) ? strtolower($attribs["_part"]) : '';
        if(strlen($part))
        {
           $ret = ExtractDatePart($part,$d);
        }
        else
        {
          if($d<=0)
          {
             $ret = "";
          }
          else
             $ret = LangDate($d);
        }		
        return $ret;
 	}		
 	
 	function ParseObject($element)
     {
         global $objConfig, $objCatList, $var_list_update, $var_list, $n_var_list_update, $m_var_list_update;
 
         $extra_attribs = ExtraAttributes($element->attributes);
         $ret = "";
         
         if ($this->TagPrefix == "email" && strtolower($element->name) == "touser") {
         	$this->TagPrefix = "touser";        	
         }
         
         if(strtolower($element->name)==$this->TagPrefix)
         {
             $field = strtolower($element->attributes["_field"]);
             switch($field)
             {     
             case "id":
             	$ret = $this->Get($this->id_field);
             break;	       	
             case "resourceid":
               if(!$this->NoResourceId)
                 $ret = $this->Get("ResourceId");
             break;    
             case "category":
                 $c = $objCatList->GetItem($this->Get("CategoryId"));
                 if(is_object($c))
                 {
                    $ret = $c->parsetag($element->attributes["_cattag"]);
                 }
             break;            
             case "priority":
                 if($this->Get("Priority")!=0)
                 {               
                     $ret = (int)$this->Get("Priority");
                 }
                 else
                     $ret = "";
             break;            
             case "link":
             	if(method_exists($this,"ItemURL"))
             	{     
             	  $ret = $this->ItemURL($element->attributes["_template"],FALSE,"");            	  	
             	}
             break;	
             case "cat_link":
             	if(method_exists($this,"ItemURL"))
             	{
             	  $ret = $this->ItemURL($element->attributes["_template"],TRUE,"");            	  	
             	}            
             break;
             case "fullpath":                                  
                 $ret = $this->Get("CachedNavbar");
                 if(!strlen($ret))
                 {
                     if(is_numeric($this->Get("CategoryId")))
                     {
                        $c = $objCatList->GetItem($this->Get("CategoryId"));
                        if(is_object($c))
                          $ret = $c->Get("CachedNavbar");
                     }
                     else
                     {
                     	if(method_exists($this,"GetPrimaryCategory"))
                     	{
                           $cat = $this->GetPrimaryCategory();
                           $c = $objCatList->GetItem($cat);
                           if(is_object($c))
                             $ret = $c->Get("CachedNavbar");
                     	}
                     }
                 }
                // $ret = $this->HighlightText($ret);
             break;    
                         
             case "relevance":            
 	            $style = $element->attributes["_displaymode"];	            
 	            if(!strlen($style))
 	              $style = "numerical";
 	            switch ($style)
 	            {                
 	            	case "numerical":	            	
 	                	$ret = (100 * LangNumber($this->Get("Relevance"),1))."%";
 	                	break;	                	
 	                case "bar":                                          	 	                
 	                	$OffColor = $element->attributes["_offbackgroundcolor"];
 	                	$OnColor = $element->attributes["_onbackgroundcolor"];
 	                	$percentsOff = (int)(100 - (100 * $this->Get("Relevance")));	                	if ($percentsOff)
 	                	{
 		                	$percentsOn = 100 - $percentsOff;
 		                	$ret = "<td width=\"$percentsOn%\" bgcolor=\"$OnColor\"><img src=\"img/s.gif\"></td><td width=\"$percentsOff%\" bgcolor=\"$OffColor\"><img src=\"img/s.gif\"></td>";        	
 	                	}
 	                	else
 	                		$ret = "<td width=\"100%\" bgcolor=\"$OnColor\"><img src=\"img/s.gif\"></td>";      	                	
 	                break;	                    
 	                case "graphical":	                	
 	                	$OnImage = $element->attributes["_onimage"];
 	                	if (!strlen($OnImage))
 	                		break;
 	                	// Get image extension
 	                	$image_data = explode(".", $OnImage);
 	                	$image_ext = $image_data[count($image_data)-1];
 	                	unset($image_data[count($image_data)-1]);
 	                	$rel = (10 * LangNumber($this->Get("Relevance"),1));
 	                	$OnImage1 = join(".", $image_data);
 	                	
 	                	if ($rel)
 	                		$img_src = $OnImage1."_".$rel.".".$image_ext;            						
 	                	else
 	                		$img_src = $OnImage;
 	                		
 	                	$ret = "<img src=\"$img_src\" border=\"0\" alt=\"".(10*$rel)."\">";
 	                	break;
 	            }          
             
             break;
               	
             case "rating":
                 $style = $element->GetAttributeByName("_displaymode");
 	            if(!strlen($style))
 	              $style = "numerical";                
                 switch($style)
                 {                
                 case "numerical":
                     $ret = LangNumber($this->Get("CachedRating"),1);
                     break;
                 case "text":
                     $ret = RatingText($this->Get("CachedRating"));
                     break;
                 case "graphical":
                     $OnImage = $element->attributes["_onimage"];
                     $OffImage = $element->attributes["_offimage"];
                     $images = RatingTickImage($this->Get("CachedRating"),$OnImage,$OffImage);
                     
                     for($i=1;$i<=count($images);$i++)
                     {
                       $url = $images[$i];
                       if(strlen($url))
                       {                                                                  
                           $ret .= "<IMG src=\"$url\" $extra_attribs >";
                           $ret .= $element->attributes["_separator"];
                       }
                     }
                     break;
                 }
             break;
             case "reviews":
                 $today = FALSE;
                 
                 if(method_exists($this,"ReviewCount"))
                 {                
                 	if($element->GetAttributeByName("_today"))
                       $today = TRUE;                      
                   $ret = $this->ReviewCount($today);
                 }
                 else
                   $ret = "";
                   
             break;
             case "votes":
             	$ret = (int)$this->Get("CachedVotesQty");
             break;	
 
             case "favorite":
              if(method_exists($this,"IsFavorite"))
              {            
             	if($this->IsFavorite())
             	{
                   $ret = $element->attributes["_label"];
                   if(!strlen($ret))
                     $ret = "lu_favorite";
                   $ret = language($ret);            	  	
             	}
             	else
             	  $ret = "";
              }
             break;	
             case "new":
               if(method_exists($this,"IsNewItem"))
               {            
                 if($this->IsNewItem())
                 {
                   $ret = $element->GetAttributeByName('_label');
                   if(!strlen($ret))
                     $ret = "lu_new";
                   $ret = language($ret);
                 }
                 else
                  $ret = "";
               }
             break;
             case "pop":
              if(method_exists($this,"IsPopItem"))
              {            
                 if($this->IsPopItem())
                 {
                   $ret = $element->attributes["_label"];
                   if(!strlen($ret))
                     $ret = "lu_pop";
                   $ret = language($ret);
                 }
                 else
                  $ret = "";
              }
             break;
             case "hot":
             	if(method_exists($this,"IsHotItem"))
             	{
                   if($this->IsHotItem())
                   {
                     $ret = $element->GetAttributeByName("_label");
                     if(!strlen($ret))
                       $ret = "lu_hot";
                     $ret = language($ret);
                   }
                   else
                     $ret = "";
             	}
             break;
             case "pick":
                 if($this->Get("EditorsPick")==1)
                 {
                   $ret = $element->GetAttributeByName('_label');
                   if(!strlen($ret))
                     $ret = "lu_pick";
                   $ret = language($ret);
                 }
                 else
                    $ret = "";
             break;                            	
             case "admin_icon":
               if(method_exists($this,"StatusIcon"))
               {
                 if($element->GetAttributeByName("fulltag"))
                 {
                     $ret = "<IMG $extra_attribs SRC=\"".$this->StatusIcon()."\">";
                 }
                 else
                     $ret = $this->StatusIcon();
               }
             break;            
             case "custom":
             	if(method_exists($this,"GetCustomFieldValue"))
             	{
                   $field =  $element->attributes["_customfield"];
                   $default = $element->attributes["_default"];
                   if (strlen($field))
                   	$ret = $this->GetCustomFieldValue($field,$default);
             	}
             break;            
             case "image":
                $default = $element->attributes["_primary"];
                $name = $element->attributes["_name"];
                
                if(strlen($name))
                {
                    $img = $this->GetImageByName($name);
                }
                else
                {
                    if($default)
                      	$img = $this->GetDefaultImage();
                }
                
                if(is_object($img))
                {
                		
                    if(strlen($element->attributes["_imagetemplate"]))
                    {
                      $ret = $img->ParseTemplate($element->attributes["_imagetemplate"]);
                      break;
                    }
                    else
                    {
                      if($element->attributes["_thumbnail"])
                      {                       	
                        $url = $img->parsetag("thumb_url");
                      }
                      else
                      {
                      	
                      	if(!$element->attributes["_nothumbnail"])
                      	{
                        		$url = $img->parsetag("image_url");                       		
                      	}
                      	else
                      	{   
                      		$url = $img->FullURL(TRUE,"");
                      	}
                    	 }
                    }
                }
                else
                {
                   $url = $element->attributes["_defaulturl"];
                 
                }
 
                if($element->attributes["_imagetag"])
                {
                    if(strlen($url))
                    {
                      $ret = "<IMG src=\"$url\" $extra_attribs >";
                    }
                    else
                        $ret = "";
                }
                else
                    $ret = $url;
             break;
             default:
             	$ret = "Undefined:".$element->name;
             break;
             }
             
         }
         else if ($this->TagPrefix == 'email'){
         	$ret = "Undefined:".$element->name;
         }
         return $ret;
     }
     
     function ParseString($name)
     {
       $el = new clsHtmlTag();
       $el->Clear();
       $el->prefix = "inp";
       $el->name = $name;
 
       $numargs = func_num_args();
       $arg_list = func_get_args();
       for ($i = 1; $i < $numargs; $i++)
       {
          $attr = $arg_list[$i];
          $parts = explode("=",$attr,2);
          $name = $parts[0];
          $val = $parts[1];
          $el->attributes[$name] = $val;
       }
       return $this->ParseObject($el);
     }
 
     /* pass attributes as strings
       ie: ParseStringEcho('tagname','_field="something" _data="somethingelse"');
     */
     function ParseStringEcho($name)
     {
       $el = new clsHtmlTag();
       $el->Clear();
       $el->prefix = "inp";
       $el->name = $name;
 
       $numargs = func_num_args();
       $arg_list = func_get_args();
       for ($i = 1; $i < $numargs; $i++)
       {
          $attr = $arg_list[$i];
          $parts = explode("=",$attr,2);
          $name = $parts[0];
          $val = $parts[1];
          $el->attributes[$name] = $val;
       }
       echo $this->ParseObject($el);
     }
 
     function ParseElement($raw, $inner_html ="")
     {
         $tag = new clsHtmlTag($raw);
         $tag->inner_html = $inner_html;
 
         if($tag->parsed)
         { 
           if($tag->name=="include" || $tag->name=="perm_include" || $tag->name=="lang_include")
           {
               $output = $this->Parser->IncludeTemplate($tag);
           }
           else
           { 
             $output = $this->ParseObject($tag); 
 			//echo $output."<br>";
             if(substr($output,0,9)=="Undefined")
             { 
                $output = $tag->Execute();
   //             if(substr($output,0,8)="{Unknown")
   //                 $output = $raw;
             }            return $output;
           }
         }
         else
             return "";
     }
 
     function AdminParseTemplate($file)
     {
       $html = "";
       $t = $this->AdminParser->GetTemplate($file);
 
       if(is_object($t))
       {
           array_push($this->AdminParser->stack,$file);
           $html = $t->source;
           $next_tag = strpos($html,"<inp:");
           while($next_tag)
           {
               $end_tag = strpos($html,"/>",$next_tag);
               $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+2);
               $pre = substr($html,0,$next_tag);
               $post = substr($html,$end_tag+2);
               $inner = $this->ParseElement($tagtext);
               $html = $pre.$inner.$post;
               $next_tag = strpos($html,"<inp:");
           }
           array_pop($this->AdminParser->stack);
       }
       return $html;
     }
 
     function ParseTemplateText($text)
     {
       $html = $text;
       $search = "<inp:".$this->TagPrefix;
       $next_tag = strpos($html,"<inp:");
       //$next_tag = strpos($html,$search);
       
 
       while($next_tag)
       { 
       	  $closer = strpos(strtolower($html),">",$next_tag);
           $end_tag = strpos($html,"/>",$next_tag);
           if($end_tag < $closer || $closer == 0)
           {
             $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+2);
             $pre = substr($html,0,$next_tag);
             $post = substr($html,$end_tag+2);
             $inner = $this->ParseElement($tagtext);
             $html = $pre.$inner.$post;
           }
           else
           {
 
           	$OldTagStyle = "</inp>";
           	
           	## Try to find end of TagName
           	$TagNameEnd = strpos($html, " ", $next_tag);
           	
           	## Support Old version
 //          	$closer = strpos(strtolower($html),"</inp>",$next_tag);          
           	if ($TagNameEnd)
           	{   			
           		$Tag = strtolower(substr($html, $next_tag, $TagNameEnd-$next_tag));
           		$TagName = explode(":", $Tag);          		
           		if (strlen($TagName[1]))
           			$CloserTag = "</inp:".$TagName[1].">";
           	}          	
           	else
           	{
           		$CloserTag = $OldTagStyle;
           	}          	
             
     	  	$closer = strpos(strtolower($html), $CloserTag, $next_tag);
     	  	
     	  	## Try to find old tag closer
     	  	if (!$closer && ($CloserTag != $OldTagStyle))
     	  	{
 				$CloserTag = $OldTagStyle;
     	  		$closer = strpos(strtolower($html), $CloserTag, $next_tag);	
     	  	}
     	  		
             $end_tag = strpos($html,">",$next_tag);
             $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+1);
             $pre = substr($html,0,$next_tag);
             $inner = substr($html,$end_tag+1,$closer-($end_tag+1));
             $post = substr($html,$end_tag+1+strlen($inner) + strlen($CloserTag));
             //echo "PRE:". htmlentities($pre,ENT_NOQUOTES);
             //echo "INNER:". htmlentities($inner,ENT_NOQUOTES);
             //echo "POST:". htmlentities($post,ENT_NOQUOTES);
 
             $parsed = $this->ParseElement($tagtext);
             if(strlen($parsed))
             {
                 $html = $pre.$this->ParseTemplateText($inner).$post;
             }
             else
                 $html = $pre.$post;
           }
           $next_tag = strpos($html,$search);
       }
       return $html;
     }
 
     function ParseTemplate($tname)
     {
       global $objTemplate, $LogLevel,$ptime,$timestart;
 
       LogEntry("Parsing $tname\n");
       $LogLevel++;
       $html = "";
       $t = $objTemplate->GetTemplate($tname);
       //$t = $this->Parser->GetTemplate($tname);
       if(is_object($t))
       {
           array_push($this->Parser->stack,$tname);
           $html = $t->source;
 
           $html = $this->ParseTemplateText($html);
           array_pop($this->Parser->stack);
       }
       $LogLevel--;
       LogEntry("Finished Parsing $tname\n");
       $ptime = round(getmicrotime() - $timestart,6);
       $xf = 867530; //Download ID
       if($xf != 0)
       {
         $x2 = substr($ptime,-6);
         $ptime .= $xf ^ $x2; //(1/1000);
       }
       return $html;
     }
     
     function SendUserEventMail($EventName,$ToUserId,$LangId=NULL,$RecptName=NULL)
     {
       global $objMessageList,$FrontEnd;
 
       $Event =& $objMessageList->GetEmailEventObject($EventName,0,$LangId);
 
       if(is_object($Event))
       {
           if($Event->Get("Enabled")=="1" || ($Event->Get("Enabled")==2 && $FrontEnd))
           {
               $Event->Item = $this;   
               if(is_numeric($ToUserId))
               {           
               	return $Event->SendToUser($ToUserId);
               }
               else
                 return $Event->SendToAddress($ToUserId,$RecptName);
           }
       }
     }
 
     function SendAdminEventMail($EventName,$LangId=NULL)
     {
       global $objMessageList,$FrontEnd;
 
       //echo "Firing Admin Event $EventName <br>\n";
       $Event =& $objMessageList->GetEmailEventObject($EventName,1,$LangId);
       if(is_object($Event))
       {
           if($Event->Get("Enabled")=="1" || ($Event->Get("Enabled")==2 && $FrontEnd))
           {
               $Event->Item = $this;
               //echo "Admin Event $EventName Enabled <br>\n";
               return $Event->SendAdmin($ToUserId);
           }
       }
     }
 
     function parse_template($t)
     {
     }
     
 }
 
 class clsItemCollection
 {
     var $Items;
     var $CurrentItem;
     var $adodbConnection;
     var $classname;
     var $SourceTable;
     var $LiveTable;
     var $QueryItemCount;
     var $AdminSearchFields = array();
     var $SortField;
     var $debuglevel;
     var $id_field = null; // id field for list item
     var $BasePermission;
     var $Dummy = null;
     
     function SetTable($action, $table_name = null) // new by Alex
     {
     	// $action = {'live', 'restore','edit'}
     	switch($action)
     	{
     		case 'live': 
     			$this->LiveTable = $table_name;
     			$this->SourceTable = $this->LiveTable;
     			break;
     		case 'restore': 
     			$this->SourceTable = $this->LiveTable; 
     			break;
     		case 'edit':
     			global $objSession;
     			$this->SourceTable = $objSession->GetEditTable($this->LiveTable);
     			break;
     	}
     }
     
     function &GetDummy() // new by Alex
 	{
 		if( !isset($this->Dummy) )
 			$this->Dummy =& new $this->classname();
 		$this->Dummy->tablename = $this->SourceTable;	
 		return $this->Dummy;
 	}
     
     function clsItemCollection()
     {
 
       $this->adodbConnection = GetADODBConnection();
 
       $this->Clear();
       $this->BasePermission="";
     }   
 
 	function GetIDField() // new by Alex
 	{
 		// returns id field for list item
 		if( !isset($this->id_field) )
 		{
 			$dummy =& $this->GetDummy();
 			$this->id_field = $dummy->IdField();
 		}
 		return $this->id_field;
 	}
 
     function &GetNewItemClass()
     {
     	return new $this->classname();
     }
      
     function Clear()
     {
       unset($this->Items);
       $this->Items = array();
       $this->CurrentItem=0;      
     }
 
     function &SetCurrentItem($id)
     {
         $this->CurrentItem=$id;
         return $this->GetItem($id);
     }
 
     function &GetCurrentItem()
     {
         if($this->CurrentItem>0)
         {
           return $this->GetItem($this->CurrentItem);
         }
         else
             return FALSE;
     }
 
     function NumItems()
     {
         if(is_array($this->Items))
         {
 //        	echo "TEST COUNT: ".count($this->Items)."<BR>";
             return count($this->Items);
         }
         else
             return 0;
     }
 	
 	function ItemLike($index, $string)
 	{
 		// check if any of the item field
 		// even partially matches $string
 		$found = false;
 		$string = strtolower($string);
 		$item_data = $this->Items[$index]->GetData();
 		foreach($item_data as $field => $value)
 			if( in_array($field, $this->AdminSearchFields) )
 				if( strpos(strtolower($value), $string) !== false)
 				{
 					$found = true;
 					break;
 				}
 		return $found;
 	}
 	
 	function DeleteItem($index) // by Alex
 	{
 		// deletes item with specific index from list
 		$i = $index; $item_count = $this->NumItems();
 		while($i < $item_count - 1)
 		{
 			$this->Items[$i] = $this->Items[$i + 1];
 			$i++;	
 		}
 		unset($this->Items[$i]);
 	}
 	
 	function ShowItems()
 	{
 		$i = 0; $item_count = $this->NumItems();
 		while($i < $item_count)
 		{
 			echo "Item No <b>$i</b>:<br>";
 			$this->Items[$i]->PrintVars();
 			$i++;	
 		}
 	}
 	
     function SwapItems($Index,$Index2)
     {
         $temp = $this->Items[$Index]->GetData();
         $this->Items[$Index]->SetData($this->Items[$Index2]->GetData());
         $this->Items[$Index2]->SetData($temp);
     
     }
     
     function CopyResource($OldId,$NewId)
     {
     	$this->Clear();
     	
     	$sql = "SELECT * FROM ".$this->SourceTable." WHERE ResourceId=$OldId";
     	$this->Query_Item($sql);
 //    	echo $sql."<br>\n";
     	if($this->NumItems()>0)
     	{
     		foreach($this->Items as $item)
     		{
     			$item->UnsetIdField();
     			$item->Set("ResourceId",$NewId);
     			$item->Create();
     		}
     	}
     }
     function ItemsOnClipboard()
     {
     	global $objSession;
         $clip = $objSession->GetPersistantVariable("ClipBoard");
         $count = 0;
         $table = $this->SourceTable;
         $prefix = GetTablePrefix();
         
         
         if(substr($table,0,strlen($prefix))==$prefix)
     		$table = substr($table,strlen($prefix));
 
     		
         if(strlen($clip))
         {
             $clipboard = ParseClipboard($clip);
             if($clipboard["table"] == $table)
             {
                 $count = count(explode(",",$clipboard["ids"]));
             }
             else
                 $count = 0;
         }
         else
             $count = 0;
 
         return $count;
     }
     
     function CopyToClipboard($command,$idfield, $idlist)
     {
         global $objSession,$objCatList;
 
         if(is_array($idlist))
         {
           $list = implode(",",$idlist);
         }
         else
              $list  = $idlist;
         $clip = $command."-".$objCatList->CurrentCategoryID().".".$this->SourceTable.".$idfield=".$list;
         
         $objSession->SetVariable("ClipBoard",$clip);
     }
         
     function SortItems($asc=TRUE)
     {
         $done = FALSE;
         
         $field = $this->SortField;
         $ItemCount = $this->NumItems();
         while(!$done)
         {
             $done=TRUE;
             for($i=1;$i<$this->NumItems();$i++)
             {
                   $doswap = FALSE;
                   if($asc)
                   { 
                     $val1 = $this->Items[$i-1]->Get($field);                    
                     $val2 = $this->Items[$i]->Get($field);
                     $doswap = ($val1 > $val2); 
                   }
                   else
                   {
                     $val1 = $this->Items[$i-1]->Get($field);
                     $val2 = $this->Items[$i]->Get($field);                                   
                     $doswap = ($val1 < $val2); 
                   }
                   if($doswap)
                   {
                      $this->SwapItems($i-1,$i);
                     $done = FALSE;
                   }
 
             }
         }
     }
 
     function &GetItem($ID,$LoadFromDB=TRUE)
     {
         $found=FALSE;
 
         if(is_array($this->Items) && count($this->Items) )
         {
           for($x=0;$x<count($this->Items);$x++)
           {
             $i =& $this->GetItemRefByIndex($x);
             if($i->UniqueID()==$ID)
             {                
                 $found=TRUE;
                 break;
             }
           }
         }
 		
         if(!$found)
         {
             if($LoadFromDB)
             {            
               $n = NULL;
               $n = new $this->classname();
               $n->tablename = $this->SourceTable;
               $n->LoadFromDatabase($ID);
               $index = array_push($this->Items, $n);
               $i =& $this->Items[count($this->Items)-1];
             }
             else
                 $i = FALSE;
         }
         return $i;
     }
 
     function GetItemByIndex($index)
     {
         return $this->Items[$index];
     }
 
     function &GetItemRefByIndex($index)
     {
         return $this->Items[$index];
     }
 
     function &GetItemByField($Field,$Value,$LoadFromDB=TRUE)
     {
         $found=FALSE;
 
         if(is_array($this->Items))
         {
           foreach($this->Items as $i)
           {
             if($i->Get($Field)==$Value)
             {
               $found = TRUE;
               break;
             }
           }
         }
         if(!$found && $LoadFromDB==TRUE)
         {
             $sql = "SELECT * FROM ".$this->SourceTable." WHERE $Field = '$Value'";
             //echo $sql;
             $res = $this->adodbConnection->Execute($sql);
 
             if($res && !$res->EOF)
             {
                 $i = $this->AddItemFromArray($res->fields);
                 $i->tablename = $this->SourceTable;
                 $i->Clean();
             }
             else
                 $i = FALSE;
         }
 
         return $i;
     }
 
     function GetPage($Page, $ItemsPerPage)
     {
         $result = array_slice($this->Items, ($Page * $ItemsPerPage) - $ItemsPerPage, $ItemsPerPage);
         return $result;
     }
 
     function GetNumPages($ItemsPerPage)
     { 
     	if( isset($_GET['reset']) && $_GET['reset'] == 1) $this->Page = 1;
         return GetPageCount($ItemsPerPage,$this->QueryItemCount);
     }
 
     function &AddItemFromArray($data, $clean=FALSE)
     {    
         $class = new $this->classname;
         $class->SetFromArray($data);
         $class->tablename = $this->SourceTable;
         if($clean==TRUE)
             $class->Clean();
 		//array_push($this->Items,$class);
         $this->Items[] =& $class;
         return $class;
     }
 
     function Query_Item($sql, $offset=-1,$rows=-1)
     { 
         global $Errors;        
 
         $dummy =& $this->GetDummy();
        	if( !$dummy->TableExists() )
        	{
        		if($this->debuglevel) echo "ERROR: table <b>".$dummy->tablename."</b> missing.<br>";
        		$this->Clear();
        	 	return false;
        	}
        	
         if($rows>-1 && $offset>-1)
         {
 	       	//echo "<b>Executing SelectLimit</b> $sql <b>Offset:</b> $offset,$rows<br>\n";
             $result = $this->adodbConnection->SelectLimit($sql, $rows,$offset);
         }
         else {
             $result = $this->adodbConnection->Execute($sql);
         }
     	
         if ($result === false)
         {
             $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Query_Item");
             echo '<br><br>'.$sql.'<br><br>';
             echo "Error: ".$this->adodbConnection->ErrorMsg()."<br>";
             return false;
         }
        
         $this->Clear();
       
         if($this->debuglevel > 0)
         {
         	 echo "This SQL: $sql<br>";
         	 if( ($this->debuglevel > 1) && ($result->RecordCount() > 0) )
         	 {
         	 	echo '<pre>'.print_r($result->GetRows(), true).'</pre>';
         	 	$result->MoveFirst();
         	 }
        	}
         LogEntry("SQL Loop Start\n");
         $count = 0;
 
           while ($result && !$result->EOF)
           {
             $count++;
             $data = $result->fields;
             $this->AddItemFromArray($data,TRUE);    
             if( defined('ADODB_EXTENSION') && constant('ADODB_EXTENSION') > 0 )
                 adodb_movenext($result);
             else
               $result->MoveNext();
           }
 
         LogEntry("SQL Loop End ($count iterations)\n");
         return $this->Items;
     }
 
     function GetOrderClause($FieldVar,$OrderVar,$DefaultField,$DefaultVar,$Priority=TRUE,$UseTableName=FALSE)
     {
     	global $objConfig, $objSession;
 
        if($UseTableName)
        {
        	  $TableName = $this->SourceTable.".";
        }
        else
          $TableName = "";	
 
        $PriorityClause = $TableName."EditorsPick DESC, ".$TableName."Priority DESC";
        
        if(strlen(trim($FieldVar))>0)
        {
          if(is_object($objSession))
          {
            if(strlen($objSession->GetPersistantVariable($FieldVar))>0)  
            {  		
           		$OrderBy = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". 
             		       $objSession->GetPersistantVariable($OrderVar));
             	$FieldUsed = $objSession->GetPersistantVariable($FieldVar);       	  	       	    
            }
          }       
          $OrderBy = trim($OrderBy);
          if (strlen(trim($OrderBy))==0) 
          {
            if(!$UseTableName)
            {
              $OrderBy = trim($DefaultField." ".$DefaultVar);
            }
            else
            {
            	 if(strlen(trim($DefaultField))>0)
            	 {
            	   $OrderBy = $this->SourceTable.".".$DefaultField.".".$DefaultVar;
            	 }
              $FieldUsed=$DefaultField;  	
            }
          }
        }    	
        if(($FieldUsed != "Priority" || strlen($OrderBy)==0) && $Priority==TRUE)
        {
        	  if(strlen($OrderBy)==0)
        	  {
        	    $OrderBy = $PriorityClause;
        	  }
        	  else 
        	    $OrderBy = $PriorityClause.", ".$OrderBy;
        }
 	   return $OrderBy;    	
     }
 
     function GetResourceIDList()
     {
         $ret = array();
         foreach($this->Items as $i)
             array_push($ret,$i->Get("ResourceId"));
         return $ret;
     }
 
     function GetFieldList($field)
     {
         $ret = array();
         foreach($this->Items as $i)
             array_push($ret,$i->Get($field));
         return $ret;
     }
 
     function SetCommonField($FieldName,$FieldValue)
     {
       for($i=0;$i<$this->NumItems();$i++)
       {
         $this->Items[$i]->Set($FieldName,$fieldValue);
         $this->Items[$i]->Update();
       }
     }
 
     function ClearCategoryItems($CatId,$CatTable = "CategoryItems")
     {
     	$CatTable = AddTablePrefix($CatTable);
         $sql = "SELECT * FROM ".$this->SourceTable." INNER JOIN $CatTable ".
                " ON (".$this->SourceTable.".ResourceId=$CatTable.ItemResourceId) WHERE CategoryId=$CatId";
         $this->Clear();
         $this->Query_Item($sql);
         if($this->NumItems()>0)
         {        
           foreach($this->Items as $i)
           {          	
             $i->DeleteCategoryItems($CatId,$CatTable);
           }
         }
     }
 
     function CopyToEditTable($idfield = null, $idlist = 0)
     {
         global $objSession;
 		
 		if($idfield == null) $idfield = $this->GetIDField();
         $edit_table = $objSession->GetEditTable($this->SourceTable);
         @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
         if(is_array($idlist))
         {
           $list = implode(",",$idlist);
         }
         else
              $list  = $idlist;
         $query = "SELECT * FROM ".$this->SourceTable." WHERE $idfield IN ($list)";
         $insert = "CREATE TABLE ".$edit_table." ".$query;
         if($objSession->HasSystemPermission("DEBUG.LIST"))
             echo htmlentities($insert,ENT_NOQUOTES)."<br>\n";
         $this->adodbConnection->Execute($insert);
     }
 
     function CreateEmptyEditTable($idfield = null)
     {
         global $objSession;
 		if($idfield == null) $idfield = $this->GetIDField();
 		
         $edit_table = $objSession->GetEditTable($this->SourceTable);
         @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
         $query = "SELECT * FROM ".$this->SourceTable." WHERE $idfield = -1";
         $insert = "CREATE TABLE ".$edit_table." ".$query;        
         if($objSession->HasSystemPermission("DEBUG.LIST"))
             echo htmlentities($insert,ENT_NOQUOTES)."<br>\n";
         $this->adodbConnection->Execute($insert);
     }
 
     function CopyFromEditTable($idfield = null)
     {
         global $objSession;
 
 		$dropRelTableFlag = false;
 		if($idfield == null) $idfield = $this->GetIDField();
         $edit_table = $objSession->GetEditTable($this->SourceTable);        
         $sql = "SELECT * FROM $edit_table";
         $rs = $this->adodbConnection->Execute($sql);
         echo $sql."<BR>";
         
         while($rs && !$rs->EOF)
         {
             $data = $rs->fields;            
             $c = new $this->classname;
             $c->SetFromArray($data);
             $c->idfield = $idfield;
             $c->Dirty();
             if($c->Get($idfield)<1)
             {
                $old_id = $c->Get($idfield);
                $c->UnsetIdField();
                if(!is_numeric($c->Get("OrgId")) || $c->Get("OrgId")==0)
                {
                    $c->Clean(array("OrgId"));
                }
                else
                {
 					if($c->Get("Status") != -2)
 					{
 						$org = new $this->classname();
 						$org->LoadFromDatabase($c->Get("OrgId"));
                      	$org->DeleteCustomData();
                      	$org->Delete(TRUE);
                      	$c->Set("OrgId",0);
 					}    	
                }               	
                $c->Create();
             }
           	if(is_numeric($c->Get("ResourceId")))
 			{							
                 if( isset($c->Related) && is_object($c->Related) )
                 { 
               		$r = $c->Related;              
               		$r->CopyFromEditTable($c->Get("ResourceId"));
               		$dropRelTableFlag = true;
             	}	
             
             	unset($r);
            	
             	if( isset($c->Reviews) && is_object($c->Reviews) )
             	{
                 	$r = $c->Reviews;
                 	$r->CopyFromEditTable($c->Get("ResourceId"));
             	}
 			}
             if(!is_numeric($c->Get("OrgId")) || $c->Get("OrgId")==0)
             {
                    $c->Clean(array("OrgId"));
             }
             else
             {
 				if($c->Get("Status") != -2)
 				{
 					$org = new $this->classname();
 					$org->LoadFromDatabase($c->Get("OrgId"));
                    	$org->DeleteCustomData();
                    	$org->Delete(TRUE);
                    	$c->Set("OrgId",0);
 				}    	
             }           			
             
             if(method_exists($c,"CategoryMemberList"))
             {
               $cats = $c->CategoryMemberList($objSession->GetEditTable("CategoryItems"));
               $ci_table = $objSession->GetEditTable('CategoryItems');
               $primary_cat = $c->GetPrimaryCategory($ci_table);
               $c->Update();
               UpdateCategoryItems($c,$cats,$primary_cat);
             }
             else
               $c->Update();
 
             unset($c);
             unset($r);
             
             $rs->MoveNext();
         }
         
         if ($dropRelTableFlag)
         {
 	        $objRelGlobal = new clsRelationshipList(); 
 	        $objRelGlobal->PurgeEditTable();
         }
         
         if($edit_table) @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");  
         @$this->adodbConnection->Execute("DROP TABLE IF EXISTS ".$objSession->GetEditTable("CategoryItems"));
     }
 	
 	function GetNextTempID()
 	{
 		// get next temporary id (lower then zero) from temp table
 		$db =& $this->adodbConnection;
 		$sql = 'SELECT MIN(%s) AS MinValue FROM %s';
         return $db->GetOne( sprintf($sql, $this->GetIDField(), $this->SourceTable) ) - 1;
 	}
 	
     function PurgeEditTable($idfield = null)
     {
       global $objSession;
 	
 	  if($idfield == null) $idfield = $this->GetIDField();
       $edit_table = $objSession->GetEditTable($this->SourceTable);
 /*      $rs = $this->adodbConnection->Execute("SELECT * FROM $edit_table");
       while($rs && !$rs->EOF)
       {
         $data = $rs->fields;
         $c = new $this->classname;
         $c->SetFromArray($data);
         $c->id_field = $idfield;
         $c->tablename = $edit_table;
         $c->Delete();
         $rs->MoveNext();
       }*/
       @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
       @$this->adodbConnection->Execute("DROP TABLE IF EXISTS ".$objSession->Get("CategoryItems"));
     }
 
     function CopyCatListToEditTable($idfield, $idlist)
     {
         global $objSession;
     
         $edit_table = $objSession->GetEditTable("CategoryItems");
         @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
         if(is_array($idlist))
         {
           $list = implode(",",$idlist);
         }
         else
              $list  = $idlist;
         $query = "SELECT * FROM ".GetTablePrefix()."CategoryItems WHERE $idfield IN ($list)";
         
         $insert = "CREATE TABLE ".$edit_table." ".$query;
         if($objSession->HasSystemPermission("DEBUG.LIST"))
             echo htmlentities($insert,ENT_NOQUOTES)."<br>\n";
         $this->adodbConnection->Execute($insert);
     }
     
     function CreateEmptyCatListTable($idfield)
     {
         global $objSession;
     
         $edit_table = $objSession->GetEditTable("CategoryItems");
         @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
         $query = "SELECT * FROM ".GetTablePrefix()."CategoryItems WHERE $idfield = -1";
         $insert = "CREATE TABLE ".$edit_table." ".$query;
         if($objSession->HasSystemPermission("DEBUG.LIST"))
            echo htmlentities($insert,ENT_NOQUOTES)."<br>\n";                    
         $this->adodbConnection->Execute($insert);
     }
     
     
     function PurgeCatListEditTable()
     {
       global $objSession;
     	
       $edit_table = $objSession->GetEditTable("CategoryItems");
       $this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");  
     }
 
 	function AdminSearchWhereClause($SearchList)
     {
       	$sql = "";
       	if( !is_array($SearchList) ) $SearchList = explode(",",$SearchList);
       	if( !count($SearchList) || !count($this->AdminSearchFields) ) return '';
       
       	for($f = 0; $f < count($SearchList); $f++)
       	{        
         	$value = $SearchList[$f];
         	if( strlen($value) )
         	{        
           		$inner_sql = "";
           		for($i = 0; $i < count($this->AdminSearchFields); $i++)
 				{
             		$field = $this->AdminSearchFields[$i];
             		if( strlen( trim($value) ) )
             		{
               			if( strlen($inner_sql) ) $inner_sql .= " OR ";
               			$inner_sql .= $field." LIKE '%".$value."%'";
             		}
           		}
           		if( strlen($inner_sql) )
           		{
            			$sql .= '('.$inner_sql.') ';       
            			if($f < count($SearchList) - 1) $sql .= " AND ";
           		}
         	}
       	}
       	return $sql;
     }
 
     function BackupData($OutFileName,$Start,$Limit)
     {
     	$fp=fopen($Outfile,"a");
     	if($fp)
     	{
     		if($Start==1)
     		{
     			$sql = "DELETE FROM ".$this->SourceTable;
     			fputs($fp,$sql);
     		}
     		$this->Query_Item("SELECT * FROM ".$this->SourceTable." LIMIT $Start, $Limit");
     		foreach($this->Items as $i)
     		{
     			$sql = $i->CreateSQL();
     			fputs($fp,$sql);
     		}
     		fclose($fp);
     		$this->Clear();
     	}
     }
     
     function RestoreData($InFileName,$Start,$Limit)
     {
     	$res = -1;
     	$fp=fopen($InFileName,"r");
     	if($fp)
     	{
 			fseek($fp,$Start);
 			$Line = 0;
 			while($Line < $Limit)
 			{
 				$sql = fgets($fp,16384);
 				$this->adodbConnection->Execute($sql);
 				$Line++;
 			}
 			$res = ftell($fp);
     		fclose($fp);	
     	}
     	return $res;
     }
     
     function Delete_Item($Id)
     {
         global $objCatList;
         
         $l =& $this->GetItem($Id);
         $l->BasePermission=$this->BasePermission;
         $l->DeleteCategoryItems($objCatList->CurrentCategoryID());    	
     }
     
     function Move_Item($Id, $OldCat, $ParentTo)
     {	
         global $objCatList;
 
         $l = $this->GetItem($Id);
         $l->BasePermission=$this->BasePermission;
         $l->AddtoCategory($ParentTo);
         $l->RemoveFromCategory($OldCat);
     }
 
     function Copy_Item($Id, $ParentTo)
     {	
         $l = $this->GetItem($Id);
         $l->BasePermission=$this->BasePermission;
         $l->AddtoCategory($ParentTo);
     }    
     	
 }/* clsItemCollection */
 
 class clsItemList extends clsItemCollection 
 {
 	var $Page;
 	var $PerPageVar;
 	var $DefaultPerPage; // use this perpage value in case if no found in config
 	var $EnablePaging;
 	var $MaxListCount = 0;
 	var $PageEnvar;
 	var $PageEnvarIndex;
 	var $ListType;
 	
 	function clsItemList()
 	{
 		$this->clsItemCollection();
 		$this->EnablePaging = TRUE;	
 		$this->PageEnvarIndex = "p";	
 	}
 	
 	function GetPageLimitSQL()
 	{
 		global $objConfig;
 		$limit = NULL;
 		if($this->EnablePaging)
 		{
         	if($this->Page<1)
             	$this->Page=1;
         	//echo "Limited to ".$objConfig->Get($this->PerPageVar)." items per page<br>\n";
 			if(is_numeric($objConfig->Get($this->PerPageVar)))
 			{
 				$Start = ($this->Page-1)*$objConfig->Get($this->PerPageVar);
 				$limit = "LIMIT ".$Start.",".$objConfig->Get($this->PerPageVar);
 			}
 			else
 				$limit = NULL;			
 		}
 		else 
 		{
 			if($this->MaxListCount)
 			{
 				$limit = "LIMIT 0, $MaxListCount";
 			}
 		}
 		return $limit;
 	}	
 	
 	function GetPageOffset()
 	{
 		$Start = 0;
 		if($this->EnablePaging)
 		{
 			if($this->Page < 1) $this->Page = 1;
 			$PerPage = $this->GetPerPage();
 			$Start = ($this->Page - 1) * $PerPage;
 		}
 		else 
 		{
 			if((int)$this->MaxListCount == 0) $Start = -1;
 		}
 		return $Start;
 	}
 	
 	function GetPageRowCount()
 	{
 		if($this->EnablePaging)
 		{
 			if($this->Page < 1) $this->Page = 1;
 			return $this->GetPerPage();
 		}
 		else 
 		  return (int)$this->MaxListCount;
 	}	
 		
     function Query_Item($sql,$limit = null, $fix_method = 'set_first')
     {
     	// query itemlist (module items) using $sql specified
     	// apply direct limit clause ($limit) or calculate it if not specified
     	// fix invalid page in case if needed by method specified in $fix_method
     	if(strlen($limit))
     	{
 	   	  $sql .= " ".$limit;
 	   	  return parent::Query_Item($sql);
     	}
     	else 
     	{
     		//echo "page fix pre (class: ".get_class($this).")<br>";
     		$this->QueryItemCount = QueryCount($sql); // must get total item count before fixing
     		$this->FixInvalidPage($fix_method);
     		return parent::Query_Item($sql,$this->GetPageOffset(),$this->GetPageRowCount());
     	}
     }  	
 
     function Query_List($whereClause,$orderByClause=NULL,$JoinCats=TRUE,$fix_method='set_first')
     {
         global $objSession, $Errors;
 
         if($JoinCats)
         {
           $cattable = GetTablePrefix()."CategoryItems";
           $t = $this->SourceTable;         
           $sql = "SELECT *,CategoryId FROM $t INNER JOIN $cattable ON $cattable.ItemResourceId=$t.ResourceId";
         }
         else
             $sql = "SELECT * FROM ". $this->SourceTable;
         if(trim($whereClause)!="")
         {
             if(isset($whereClause))
                 $sql = sprintf('%s WHERE %s',$sql,$whereClause);
         }
         if(strlen($orderByClause)>0)
         {
             	if(substr($orderByClause,0,8)=="ORDER BY")
             	{
                   $sql .= " ".$orderByClause;
             	}
             	else 
             	{
             	  $sql .= " ORDER BY $orderByClause";
             	}
         }
 
         if($objSession->HasSystemPermission("DEBUG.LIST"))
             echo $sql."<br>\n";
         
         return $this->Query_Item($sql, null, $fix_method);
     }    
     
     function GetPerPage()
 	{
 		// return category perpage
 		global $objConfig;
 		$PerPage = $objConfig->Get( $this->PerPageVar );
       	if( !is_numeric($PerPage) ) $PerPage = $this->DefaultPerPage ? $this->DefaultPerPage : 10;
 		return $PerPage;
 	}
 	
 	function FixInvalidPage($fix_method = 'set_first')
 	{
 		// in case if current page > total page count,
 		// then set current page to last possible "set_last"
 		// or first possible "set_first"
 		$PerPage = $this->GetPerPage();
       	$NumPages = ceil( $this->GetNumPages($PerPage) );
 /*      	
       	echo "=====<br>";
       	echo "Class <b>".get_class($this)."</b>: Page ".$this->Page." of $NumPages<br>";
       	echo "PerPage: $PerPage<br>";
       	echo "Items Queries: ".$this->QueryItemCount."<br>";
       	echo "=====<br>";
 */      	
       	if($this->Page > $NumPages)
       	{
       		switch($fix_method)
       		{
       			case 'set_first': 
       				$this->Page = 1; 
       				//echo "Move 2 First (class <b>".get_class($this)."</b>)<br>"; 
       				break;
       			case 'set_last': 
       				$this->Page = $NumPages; 
       				//echo "Move 2 Last (class <b>".get_class($this)."</b>)<br>"; 
       				break;
     		}
     		$this->SaveNewPage();
     	}
 	}
     
     function SaveNewPage()
     {
     	// redefine in each list, should save to env array new page value	
     	
     }
     
     function GetPageLinkList($dest_template=NULL,$page = "",$PagesToList=10, $HideEmpty=TRUE)
     {
         global $objConfig, $var_list_update, $var_list;
 
       
         $v= $this->PageEnvar;
                      
         global ${$v};        
         
         if(!strlen($page))
             $page = GetIndexURL();
 
         $PerPage = $objConfig->Get($this->PerPageVar);
         if($PerPage<1)
             $PerPage=20;
         $NumPages = ceil($this->GetNumPages($PerPage));
         if($NumPages==1 && $HideEmpty)
             return "";
 
         if(strlen($dest_template))
         {
             $var_list_update["t"] = $dest_template;
         }
         else
             $var_list_update["t"] = $var_list["t"];
 
         $o = "";
         if($this->Page==0 || !is_numeric($this->Page))
           $this->Page=1;
         if($this->Page>$NumPages)
             $this->Page=$NumPages;
 
         $StartPage = (int)$this->Page - ($PagesToList/2);
         if($StartPage<1)
             $StartPage=1;
 
         $EndPage = $StartPage+($PagesToList-1);
         if($EndPage>$NumPages)
         {
             $EndPage = $NumPages;
             $StartPage = $EndPage-($PagesToList-1);
             if($StartPage<1)
                 $StartPage=1;
         }
 
         $o = "";
         if($StartPage>1)
         {
           ${$v}[$this->PageEnvarIndex] = $this->Page-$PagesToList;
 		  
           $prev_url = $page."?env=".BuildEnv();
           $o .= "<A HREF=\"$prev_url\">&lt;&lt;</A>";
         }
 
         for($p=$StartPage;$p<=$EndPage;$p++)
         {
             if($p!=$this->Page)
             {
                 ${$v}[$this->PageEnvarIndex]=$p;
                 $href = $page."?env=".BuildEnv();
                 $o .= " <A HREF=\"$href\">$p</A> ";
             }
             else
             {
                 $o .= " <SPAN class=\"current-page\">$p</SPAN>";
             }
         }
         if($EndPage<$NumPages && $EndPage>0)
         {
           ${$v}[$this->PageEnvarIndex]=$this->Page+$PagesToList;
 
           $next_url = $page."?env=".BuildEnv();
           $o .= "<A HREF=\"$next_url\"> &gt;&gt;</A>";
         }
         unset(${$v}[$this->PageEnvarIndex],$var_list_update["t"] );
         return $o;
     }   
     
     function GetAdminPageLinkList($url)
     {
         global $objConfig;
           
         $update =& $GLOBALS[$this->PageEnvar]; // env_var_update
                 
         // insteresting stuff :)
         if(!$this->PerPageVar) $this->PerPageVar = "Perpage_Links";
 
         $PerPage = $objConfig->Get($this->PerPageVar);
         if($PerPage < 1) $PerPage = 20;
           
         $NumPages = ceil($this->GetNumPages($PerPage));
         
         //echo $this->CurrentPage." of ".$NumPages." Pages";
 
         if($this->Page > $NumPages) $this->Page = $NumPages;
 
         $StartPage = $this->Page - 5;
         if($StartPage < 1) $StartPage = 1;
         $EndPage = $StartPage + 9;
         if($EndPage > $NumPages)
         {        
             $EndPage = $NumPages;
             $StartPage = $EndPage-9;
             if($StartPage < 1) $StartPage = 1;
         }
 
         $o = '';
 
         if($StartPage > 1)
         {
            $update[$this->PageEnvarIndex]= $this->Page - 10;
            $prev_url = $url.'?env='.BuildEnv();
            $o .= '<a href="'.$prev_url.'">&lt;&lt;</a>';
         }
 
         
         for($p = $StartPage; $p <= $EndPage; $p++)
         {
             if($p != $this->Page)
             {
                 $update[$this->PageEnvarIndex] = $p;
                 $href = $url.'?env='.BuildEnv();
                 $o .= ' <a href="'.$href.'" class="NAV_URL">'.$p.'</a> ';
             }
             else
             {
                 $o .= '<SPAN class="CURRENT_PAGE">'.$p.'</SPAN>';
             }
         }
         if($EndPage < $NumPages)
         {
           $update[$this->PageEnvarIndex] = $this->Page + 10;
           $next_url = $url.'?env='.BuildEnv();
           $o .= '<a href="'.$next_url.'"> &gt;&gt;</a>';
         }
         unset( $update[$this->PageEnvarIndex] );
         return $o;        
     }       
 }
 
 function ParseClipboard($clip)
 {
   $ret = array();
 
   $parts = explode(".",$clip,3);
   $command = $parts[0];
   $table = $parts[1];
   $prefix = GetTablePrefix();
   if(substr($table,0,strlen($prefix))==$prefix)
     $table = substr($table,strlen($prefix));
     
   $subparts = explode("=",$parts[2],2);
   $idfield = $subparts[0];
   $idlist = $subparts[1];
   $cmd = explode("-",$command);
   $ret["command"] = $cmd[0];
   $ret["source"] = $cmd[1];
   $ret["table"] = $table;
   $ret["idfield"] = $idfield;
   $ret["ids"] = $idlist;
 	//print_pre($ret);
   return $ret;
 }
 
 function UpdateCategoryItems($item,$NewCatList,$PrimaryCatId = false)
 {
   	global $objCatList;
   	
   	$CurrentList = explode(",",$item->CategoryMemberList());
   	$del_list = array();
   	$ins_list = array();
 
 
   if(!is_array($NewCatList))
   {
       if(strlen(trim($NewCatList))==0)
           $NewCatList = $objCatList->CurrentCategoryID();
   
       $NewCatList = explode(",",$NewCatList);
   }
   //print_r($NewCatList);
 
     for($i=0;$i<count($NewCatList);$i++)
   {
       $cat = $NewCatList[$i];
       if(!in_array($cat,$CurrentList))
          $ins_list[] = $cat;
   }
   for($i=0;$i<count($CurrentList);$i++)
   {
       $cat = $CurrentList[$i];
       if(!in_array($cat,$NewCatList))
           $del_list[] = $cat;
   }
   for($i=0;$i<count($ins_list);$i++)
   {
       $cat = $ins_list[$i];
       $item->AddToCategory($cat);
   }
   for($i=0;$i<count($del_list);$i++)
   {
       $cat = $del_list[$i];      
       $item->RemoveFromCategory($cat);
   }
   if($PrimaryCatId !== false) $item->SetPrimaryCategory($PrimaryCatId);
 }
 
 class clsCatItemList extends clsItemList 
 {
 	var $PerPageVarLong;
 	var $PerPageShortVar;
 	var $Query_SortField;
 	var $Query_SortOrder;
 	var $ItemType;
 	
   function clsCatItemList()
   {
   	$this->ClsItemList();
   	$this->Query_SortField = array();
   	$this->Query_SortOrder = array();
   }	
   
   function QueryOrderByClause($EditorsPick=FALSE,$Priority=FALSE,$UseTableName=FALSE)  
   {
   	global $objSession;
   	
     if($UseTableName)
     {
       $TableName = $this->SourceTable.".";
     }
     else {
       $TableName = "";	
     }
 
     $Orders = array();
 
     if($EditorsPick)  
     {
     	$Orders[] = $TableName."EditorsPick DESC";
     }
     if($Priority)
     {
        $Orders[] = $TableName."Priority DESC";  	
     }
   
     if(count($this->Query_SortField)>0)
     {
        for($x=0; $x<count($this->Query_SortField); $x++)
        {
        	 $FieldVar = $this->Query_SortField[$x];
        	 $OrderVar = $this->Query_SortOrder[$x];
        	 	   
          if(is_object($objSession))
          {
            $FieldVarData = $objSession->GetPersistantVariable($FieldVar);
            if(strlen($FieldVarData)>0)  
            {  		
 	           	$Orders[] = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". 
 	                   $objSession->GetPersistantVariable($OrderVar));          	
            }
          }
        }
     }
     
     if(count($Orders)>0)
     {
     	$OrderBy = "ORDER BY ".implode(", ",$Orders);
     }
     else   
 		$OrderBy="";
       
     return $OrderBy; 
   }
   
   function AddSortField($SortField, $SortOrder)
   {
   	 if(strlen($SortField))
   	 {
   	   $this->Query_SortField[] = $SortField;
   	   $this->Query_SortOrder[] = $SortOrder;
   	 }
   }
   
   function ClearSortFields()
   {
   	 $this->Query_SortField = array();
   	 $this->Query_SortOrder = array();
   }
   
   /* skeletons in this closet */
   
   function GetNewValue($CatId=NULL)
   {
   	return 0;
   }
   
   function GetPopValue($CategoryId=NULL)
   {
   	return 0;
   }  
   
   /* end of skeletons */
    
   function GetCountSQL($PermName,$CatId=NULL, $GroupId=NULL, $AdditonalWhere="")
   {
   	global $objSession, $objPermissions, $objCatList;
   	
   	$ltable = $this->SourceTable;
     $acl = $objSession->GetACLClause();
     $cattable = GetTablePrefix()."CategoryItems";
     $CategoryTable = GetTablePrefix()."Category";
     $ptable = GetTablePrefix()."PermCache";  	
     $VIEW = $objPermissions->GetPermId($PermName);
   	
   	$sql = "SELECT count(*) as CacheVal FROM $ltable ";
   	$sql .="INNER JOIN $cattable ON ($cattable.ItemResourceId=$ltable.ResourceId) ";
     $sql .="INNER JOIN $CategoryTable ON ($CategoryTable.CategoryId=$cattable.CategoryId) ";
     $sql .="INNER JOIN $ptable ON ($cattable.CategoryId=$ptable.CategoryId) ";
     $sql .="WHERE ($acl AND PermId=$VIEW AND $cattable.PrimaryCat=1 AND $CategoryTable.Status=1) ";
 
 	if(strlen($AdditonalWhere)>0)
     {
       $sql .= "AND (".$AdditonalWhere.")";
     }   
     
     return $sql;
   }
   
   function SqlCategoryList($attribs = array())
   { 	 
   	 $CatTable = GetTablePrefix()."CategoryItems";
      $t = $this->SourceTable;
      
      $sql = "SELECT *,$CatTable.CategoryId FROM $t INNER JOIN $CatTable ON $CatTable.ItemResourceId=$t.ResourceId ";
      $sql .="WHERE ($CatTable.CategoryId=".$catid." AND $t.Status=1)";
      
      return $sql;
   }
   
   
   function CategoryCount($attribs=array())
   {  	   	  
   	 global $objCatList, $objCountCache;
   	 
   	 $cat = $attribs["_catid"];
      if(!is_numeric($cat))
      {
         $cat = $objCatList->CurrentCategoryID();
      }
      if((int)$cat>0)
         $c = $objCatList->GetCategory($cat);  	       		 
            
   	 $CatTable = GetTablePrefix()."CategoryItems";
      $t = $this->SourceTable;
      
      $sql = "SELECT count(*) as MyCount FROM $t INNER JOIN $CatTable ON ($CatTable.ItemResourceId=$t.ResourceId) ";     
      if($attribs["_subcats"])
      {
      	$ctable = $objCatList->SourceTable;
      	$sql .= "INNER JOIN $ctable ON ($CatTable.CategoryId=$ctable.CategoryId) ";
      	$sql .= "WHERE (ParentPath LIKE '".$c->Get("ParentPath")."%' ";
      	if(!$attribs["_countcurrent"])
      	{
      	  $sql .=" AND $ctable.CategoryId != $cat) ";
      	}
      	else
      	  $sql .=") ";
      }
      else
        $sql .="WHERE ($CatTable.CategoryId=".$cat." AND $t.Status=1) ";  	
     
       if($attribs["_today"])
       {
         $today = mktime(0,0,0,date("m"),date("d"),date("Y"));             
         $sql .= "AND ($t.CreatedOn>=$today) ";	
       }
       //echo $sql."<br><br>\n";
 	  $rs = $this->adodbConnection->Execute($sql);
 	  $ret = "";
 	  if($rs && !$rs->EOF)
 	    $ret = (int)$rs->fields["MyCount"];
   	  return $ret;
   }
   
   function SqlGlobalCount($attribs=array())
   {
   	 global $objSession;
   	 
   	 $p = $this->BasePermission.".VIEW";
   	 $t = $this->SourceTable;
      if($attribs["_today"])
      {
         $today = mktime(0,0,0,date("m"),date("d"),date("Y"));             
         $where = "($t.CreatedOn>=$today)";	
      }  	 
      
     if($attribs["_grouponly"])
 	{
 	   $GroupList = $objSession->Get("GroupList");	    	  
 	}
 	else        		
 	   $GroupList = NULL;
 		        
   	 $sql = $this->GetCountSQL($p,NULL,$GroupList,$where);
   	 return $sql;
   }
   
   function DoGlobalCount($attribs)
   {
   	  global $objCountCache;
   	  
  	  $cc = $objCountCache->GetValue($this->CacheListType("_"),$this->ItemType,$this->CacheListExtraId("_"),(int)$attribs["_today"], 3600);
   	  if(!is_numeric($cc))
   	  {  	
   	  	$sql = $this->SqlGlobalCount($attribs);
   	  	$ret = QueryCount($sql);
   	  	$objCountCache->SetValue($this->CacheListType("_"),$this->ItemType,$this->CacheListExtraId("_"),(int)$attribs["_today"],$ret);
   	  }
   	  else
   	    $ret = $cc;
   	  return $ret;
   }
   
 
   function CacheListExtraId($ListType)
   {
   	global $objSession;
   	
   	if(!strlen($ListType))
   	  $ListType="_";  	
   	switch($ListType)
   	{  
   		case "_":
   			$ExtraId = $objSession->Get("GroupList");  			
   		break;
   		case "category":
   			$ExtraId = $objSession->Get("GroupList");
   		break;	
   		case "myitems":
   		     $ExtraId = $objSession->Get("PortalUserId");
   		break;
   		case "hot":
   			$ExtraId = $objSession->Get("GroupList");
   		break;
   		case "pop":
   			$ExtraId = $objSession->Get("GroupList");
   		break;
   		case "pick":
       		$ExtraId = $objSession->Get("GroupList");
   		break;
   		case "favorites":
       		$ExtraId = $objSession->Get("PortalUserId");
   		break;
   		case "new":
   			$ExtraId = $objSession->Get("GroupList");
   		break;	
   	}
   	return $ExtraId;
   }
   
   function CacheListType($ListType)
   {
   	if(!strlen($ListType))
   	  $ListType="_";  	
   	switch($ListType)
   	{  
   		case "_":
   			$ListTypeId = 0; 			
   		break;
   		case "category":
   			$ListTypeId = 1;
   		break;	
   		case "myitems":
   		     $ListTypeId = 2;
   		break;
   		case "hot":
   			$ListTypeId = 3;
   		break;
   		case "pop":
   			$ListTypeId = 4;
   		break;
   		case "pick":
       		$ListTypeId = 5;
   		break;
   		case "favorites":
       		$ListTypeId = 6;
   		break;
   		case "new":
   			$ListTypeId = 8;
   		break;	
   	}
   	return $ListTypeId;
   }  
 
   function PerformItemCount($attribs=array())
   {
   	global $objCountCache, $objSession;
   	       
   	$ret = "";
   	$ListType = $attribs["_listtype"];
   	if(!strlen($ListType))
   	  $ListType="_";
   	    
 	$ListTypeId = $this->CacheListType($ListType);
   	//echo "ListType: $ListType ($ListTypeId)<br>\n";  
 	$ExtraId = $this->CacheListExtraId($ListType);
   	switch($ListType)
   	{  
   		case "_":
   			$ret = $this->DoGlobalCount($attribs);
   		break;
   		case "category":  		
   			$ret = $this->CategoryCount($attribs);
   		break;	
   		case "myitems":
   		     $sql = $this->SqlMyItems($attribs);      		
   		break;
   		case "hot":
   			$sql = $this->SqlHotItems($attribs);      		
   		break;
   		case "pop":
   			$sql = $this->SqlPopItems($attribs);      		
   		break;
   		case "pick":
       		$sql = $this->SqlPickItems($attribs);
   		break;
   		case "favorites":
       		$sql = $this->SqlFavorites($attribs);
   		break;
   		case "search":
       		$sql = $this->SqlSearchItems($attribs);
   		break;
   		case "new":
   			$sql = $this->SqlNewItems($attribs);
   		break;	
   	}
   	//echo "SQL: $sql<br>";
   	if(strlen($sql))
   	{
   		if(is_numeric($ListTypeId))
   		{
   		  $cc = $objCountCache->GetValue($ListTypeId,$this->ItemType,$ExtraId,(int)$attribs["_today"], 3600);
   		  
   	   	  if(!is_numeric($cc) || $attribs['_nocache'] == 1)
   		  {
   			$ret = QueryCount($sql);
   			$objCountCache->SetValue($ListTypeId,$this->ItemType,$ExtraId,(int)$attribs["_today"],$ret);
   		  }
   		  else
   	  		$ret = $cc;
   		}
   		else
   		  $ret = QueryCount($sql);
   	}
   	  
   	return $ret;  
   }
   
   function GetJoinedSQL($PermName, $CatId=NULL, $AdditionalWhere="")
   {
   	global $objSession, $objPermissions;
   	
   	$ltable = $this->SourceTable;
     $acl = $objSession->GetACLClause();
     $cattable = GetTablePrefix()."CategoryItems";
     $CategoryTable = GetTablePrefix()."Category";
     $ptable = GetTablePrefix()."PermCache";  	
     $VIEW = $objPermissions->GetPermId($PermName);
     $sql ="INNER JOIN $cattable ON ($cattable.ItemResourceId=$ltable.ResourceId) ";
     $sql .="INNER JOIN $CategoryTable ON ($CategoryTable.CategoryId=$cattable.CategoryId) ";
     $sql .= "INNER JOIN $ptable ON ($cattable.CategoryId=$ptable.CategoryId) ";
     $sql .="WHERE ($acl AND  PermId=$VIEW AND PrimaryCat=1 AND $CategoryTable.Status=1) ";
     
     if(is_numeric($CatId))
     {
     	$sql .= " AND ($CategoryTable.CategoryId=$CatId) ";
     }
     if(strlen($AdditionalWhere)>0)
     {
       $sql .= "AND (".$AdditionalWhere.")";
     }
     return $sql;
   }
     
 	function CountFavorites($attribs)
 	{		
 		if($attribs["_today"])
 		{
         	global $objSession, $objConfig, $objPermissions;
 
         	$acl = $objSession->GetACLClause();
         	$favtable = GetTablePrefix()."Favorites";
         	$ltable = $this->SourceTable;
         	$cattable = GetTablePrefix()."CategoryItems";
         	$CategoryTable = GetTablePrefix()."Category";
         	$ptable = GetTablePrefix()."PermCache";
    	  		$today = mktime(0,0,0,date("m"),date("d"),date("Y"));             
       		
 	        $where = "PortalUserId=".$objSession->Get("PortalUserId")." AND $ltable.Status=1";
 	        $where .= " AND $favtable.Modified >= $today AND ItemTypeId=".$this->ItemType;     	   
     	    $p = $this->BasePermission.".VIEW";
         
         	$sql = "SELECT $ltable.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $favtable INNER JOIN $ltable ON ($favtable.ResourceId=$ltable.ResourceId) ";
         	$sql .= $this->GetJoinedSQL($p,NULL,$where);			
         	$ret = QueryCount($sql);
 		}
 		else
 		{
 		  if (!$this->ListType == "favorites")
 		  {
 			$this->ListType = "favorites";
 			$this->LoadFavorites($attribs);
 			$ret = $this->QueryItemCount;			
 	 	  }
 		  else
 			$ret = $this->QueryItemCount;
 		}
 		return $ret;
 	}
 	
 	
 	
 	function CountPickItems($attribs)
 	{		
 		if (!$this->ListType == "pick")
 		{
 			$this->ListType = "pick";
 			$this->LoadPickItems($attribs);
 			$ret = $this->QueryItemCount;			
 		}
 		else
 			$ret = $this->QueryItemCount;
 		
 		return $ret;
 	}
 	
 	function CountMyItems($attribs)
 	{		
 		if (!$this->ListType == "myitems")
 		{
 			$this->ListType = "myitems";
 			$this->LoadMyItems($attribs);
 			$ret = $this->QueryItemCount;			
 		}
 		else
 			$ret = $this->QueryItemCount;
 		
 		return $ret;
 	}
 		
 	function CountHotItems($attribs)
 	{		
 		if (!$this->ListType == "hotitems")
 		{
 			$this->ListType = "hotitems";
 			$this->LoadHotItems($attribs);
 			$ret = $this->QueryItemCount;			
 		}
 		else
 			$ret = $this->QueryItemCount;
 		
 		return $ret;
 	}
 	
 	function CountNewItems($attribs)
 	{		
 		if (!$this->ListType == "newitems")
 		{
 			$this->ListType = "newitems";
 			$this->LoadNewItems($attribs);
 			$ret = $this->QueryItemCount;			
 		}
 		else
 			$ret = $this->QueryItemCount;
 		
 		return $ret;
 	}
 	
 	function CountPopItems($attribs)
 	{		
 		if (!$this->ListType == "popitems")
 		{
 			$this->ListType = "popitems";
 			$this->LoadPopItems($attribs);
 			$ret = $this->QueryItemCount;			
 		}
 		else
 			$ret = $this->QueryItemCount;
 		
 		return $ret;
 	}
 		
 	
 	function CountSearchItems($attribs)
 	{		
 		if (!$this->ListType == "search")
 		{
 			$this->ListType = "search";
 			$this->LoadSearchItems($attribs);
 			$ret = $this->QueryItemCount;			
 		}
 		else
 			$ret = $this->QueryItemCount;
 		
 		return $ret;
 	}
 	
 	function SqlFavorites($attribs)
 	{
         global $objSession, $objConfig, $objPermissions;
 
         $acl = $objSession->GetACLClause();
         $favtable = GetTablePrefix()."Favorites";
         $ltable = $this->SourceTable;
         $cattable = GetTablePrefix()."CategoryItems";
         $CategoryTable = GetTablePrefix()."Category";
         $ptable = GetTablePrefix()."PermCache";
      	   
         $where = "PortalUserId=".$objSession->Get("PortalUserId")." AND $ltable.Status=1";
         if($attribs["_today"])
         {
    	  		$today = mktime(0,0,0,date("m"),date("d"),date("Y"));                   	
 	        $where .= " AND $favtable.Modified >= $today AND ItemTypeId=".$this->ItemType;          
         }
         $p = $this->BasePermission.".VIEW";
         
         $sql = "SELECT $ltable.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $favtable INNER JOIN $ltable ON ($favtable.ResourceId=$ltable.ResourceId) ";
         $sql .= $this->GetJoinedSQL($p,NULL,$where);
 
 
  	    $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE);
         $sql .= " ".$OrderBy;
 		return $sql;
 	}
   
     function LoadFavorites($attribs)
     {
 		global $objSession, $objCountCache;
 		
 		$sql = $this->SqlFavorites($attribs);
     	    
 	    if($objSession->HasSystemPermission("DEBUG.LIST"))
               echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
         if($attribs["_shortlist"])
         {
             $this->PerPageVar = $this->PerPageShortVar; 
         }
         else 
           $this->PerPageVar = $this->PerPageVarLong;
         
         $CachedCount = $objCountCache->GetValue($this->CacheListType("favorites"),$this->ItemType,$this->CacheListExtraId("favorites"),(int)$attribs["_today"],3600);         
         if(!is_numeric($CachedCount))
         {
           $this->QueryItemCount = QueryCount($sql);
           $objCountCache->SetValue($this->CacheListType("favorites"),$this->ItemType,$this->CacheListExtraId("favorites"),(int)$attribs["_today"],$this->QueryItemCount);
         }
         else
          $this->QueryItemCount = (int)$CachedCount;
         
         return $this->Query_Item($sql);           
     }
     
     function SqlPickItems($attribs)
     {
        global $objSession, $objCatList;
 
        $catid = (int)$attribs["_catid"];
        $scope = (int)$attribs["_scope"];
 	   //$JoinCats = (int)$attribs["_catinfo"] || $scope;	  
           	          
    	   $TableName = $this->SourceTable;
        if($scope)
        {
             if (!$catid) 
             {
                $catid = $objCatList->CurrentCategoryID();
             }                                            
             $where =  "CategoryId =".$catid." AND ".$TableName.".EditorsPick=1 AND ".$TableName.".Status=1";
        }
        else
        {
             $where = $TableName.".EditorsPick=1 AND ".$TableName.".Status=1 ";
             $catid=NULL;
        }
        if($attribs["_today"])
        {
    	  		$today = mktime(0,0,0,date("m"),date("d"),date("Y"));  
    	  		$where .= " AND ($TableName.CreatedOn>=$today)";
        }       
        $CategoryTable = GetTablePrefix()."Category";
  	   $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName ";
  	   $p = $this->BasePermission.".VIEW";
  	   $sql .= $this->GetJoinedSQL($p,$CatUd,$where);
  	   
        $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE);
        $sql .= " ".$OrderBy; 	         
        return $sql;
     }    	
     
     function LoadPickItems($attribs)
     {
        global $objSession, $objCountCache;
        
        $sql = $this->SqlPickItems($attribs);     
        if($objSession->HasSystemPermission("DEBUG.LIST"))
             echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
             
         if($attribs["_shortlist"])
         {
             $this->PerPageVar = $this->PerPageShortVar; 
         }
         else 
           $this->PerPageVar = $this->PerPageVarLong;
                       
        $CachedCount = $objCountCache->GetValue($this->CacheListType("pick"),$this->ItemType,$this->CacheListExtraId("pick"),(int)$attribs["_today"],3600);            
        if(!is_numeric($CachedCount))
        {
  	     $this->QueryItemCount= QueryCount($sql);
          $objCountCache->SetValue($this->CacheListType("pick"),$this->ItemType,$this->CacheListExtraId("pick"),(int)$attribs["_today"],$this->QueryItemCount);
        }
        else
          $this->QueryItemCount=$CachedCount;
 
        return $this->Query_Item($sql);  	   
     }
     
     function SqlMyItems($attribs= array())
     {
         global $objSession;
 
 		$TableName = $this->SourceTable;
  		$where =  " ".$TableName.".Status>-1 AND ".$TableName.".CreatedById=".$objSession->Get("PortalUserId");
         if($attribs["_today"])
         {
    	  		$today = mktime(0,0,0,date("m"),date("d"),date("Y"));  
    	  		$where .= " AND ($TableName.CreatedOn>=$today)";
         }
  		$CategoryTable = GetTablePrefix()."Category"; 	   
  		$sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName ";
  	    $p = $this->BasePermission.".VIEW";
  	    $sql .= $this->GetJoinedSQL($p,$CatUd,$where);
  	        	    
         $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE);
         $sql .= " ".$OrderBy; 	         
 	
         return $sql;
     }    
     
     function LoadMyItems($attribs=array())
     {        
     	global $objSession,$objCountCache;              
     	$sql = $this->SqlMyItems($attribs);
         if($objSession->HasSystemPermission("DEBUG.LIST"))
               echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
         if($attribs["_shortlist"])
         {
             $this->PerPageVar = $this->PerPageShortVar; 
         }
         else 
           $this->PerPageVar = $this->PerPageVarLong; 		
  		               
        $CachedCount = $objCountCache->GetValue($this->CacheListType("myitems"),$this->ItemType,$this->CacheListExtraId("myitems"),(int)$attribs["_today"],3600);            
        if(!is_numeric($CachedCount))
        {
  	     $this->QueryItemCount= QueryCount($sql);
          $objCountCache->SetValue($this->CacheListType("myitems"),$this->ItemType,$this->CacheListExtraId("myitems"),(int)$attribs["_today"],$this->QueryItemCount);
        }
        else
          $this->QueryItemCount=$CachedCount;
  
         return $this->Query_Item($sql);  	   
     }    
     
     function SqlNewItems($attribs = array())
     {
        global $objSession, $objCatList;
 
        $catid = (int)$attribs["_catid"];
        $scope = (int)$attribs["_scope"];
 	   //$JoinCats = (int)$attribs["_catinfo"] || $scope;	  	  
                  
    	   $TableName = $this->SourceTable;
 	   if($attribs["_today"])
        {
    	  		$cutoff = mktime(0,0,0,date("m"),date("d"),date("Y")); 
        }
        else
        {
        	  if($scope)
        	  {
             if (!$catid) 
             {
                $catid = $objCatList->CurrentCategoryID();
             }           	  	
          	$cutoff = $this->GetNewValue($catid);
        	  }
        	  else
        	    $cutoff = $this->GetNewValue();
        }
        if($scope)
        {
             if (!$catid) 
             {
                $catid = $objCatList->CurrentCategoryID();
             }           	  	                                        
             
             $where =  "CategoryId =".$catid." AND ((".$TableName.".CreatedOn >=".$cutoff." AND ".$TableName.".NewItem != 0) OR ".$TableName.".NewItem=1 ) AND ".$TableName.".Status=1 ";            
        }
        else
        {
             $where =  "((".$TableName.".CreatedOn >=".$this->GetNewValue()." AND ".$TableName.".NewItem != 0) OR ".$TableName.".NewItem=1 ) AND ".$TableName.".Status=1 ";
        }
 
        $CategoryTable = GetTablePrefix()."Category";
  	   $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName ";
  	   $p = $this->BasePermission.".VIEW";
  	   $sql .= $this->GetJoinedSQL($p,$CatUd,$where);
  	   
        $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE);
        $sql .= " ".$OrderBy;         
        return $sql;
     }
 
     function LoadNewItems($attribs)
     {
 		global $objSession,$objCountCache;
 		
 		$sql = $this->SqlNewItems($attribs);
 		
         if($objSession->HasSystemPermission("DEBUG.LIST"))
               echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
         if($attribs["_shortlist"])
         {
             $this->PerPageVar = $this->PerPageShortVar; 
         }
         else 
           $this->PerPageVar = $this->PerPageVarLong;
                         
        $CachedCount = $objCountCache->GetValue($this->CacheListType("new"),$this->ItemType,$this->CacheListExtraId("new"),(int)$attribs["_today"],3600);            
        if(!is_numeric($CachedCount))
        {
  	     $this->QueryItemCount= QueryCount($sql);
          $objCountCache->SetValue($this->CacheListType("new"),$this->ItemType,$this->CacheListExtraId("new"),(int)$attribs["_today"],$this->QueryItemCount);
        }
        else
          $this->QueryItemCount=$CachedCount;    
          
          
        return $this->Query_Item($sql);  	   
     }    
 
     function SqlPopItems($attribs)
     {
        global $objSession, $objCatList;
 
        $catid = (int)$attribs["_catid"];
        $scope = (int)$attribs["_scope"];
 	   //$JoinCats = (int)$attribs["_catinfo"] || $scope;	  	   
                  
    	   $TableName = $this->SourceTable;
 
        if($scope)
        {
             if (!$catid) 
             {
                $catid = $objCatList->CurrentCategoryID();
             }   
             $where =  "CategoryId =".$catid." AND ((".$TableName.".Hits >=".$this->GetLinkPopValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1";
        }
        else       	
        {
              $where =  "((".$TableName.".CachedRating >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0 ) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 ";
              
        		$where =  "((".$TableName.".Hits >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 ";
        }
         if($attribs["_today"])
         {
    	  		$today = mktime(0,0,0,date("m"),date("d"),date("Y"));  
    	  		$where .= " AND ($TableName.CreatedOn>=$today)";
         }        
        $CategoryTable = GetTablePrefix()."Category";
  	   $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName ";
  	   $p = $this->BasePermission.".VIEW";
  	   $sql .= $this->GetJoinedSQL($p,$catid,$where);
  	   
  	   $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE);
        $sql .= " ".$OrderBy;
        
     	return $sql;
     }
     
     function LoadPopItems($attribs)
     {
        global $objSession,$objCountCache;
        $sql = $this->SqlPopItems($attribs);
             
        if($objSession->HasSystemPermission("DEBUG.LIST"))
               echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
         if($attribs["_shortlist"])
         {
             $this->PerPageVar = $this->PerPageShortVar; 
         }
         else 
           $this->PerPageVar = $this->PerPageVarLong;
                         
        $CachedCount = $objCountCache->GetValue($this->CacheListType("pop"),$this->ItemType,$this->CacheListExtraId("pop"),(int)$attribs["_today"],3600);            
        if(!is_numeric($CachedCount))
        {
  	     $this->QueryItemCount= QueryCount($sql);
          $objCountCache->SetValue($this->CacheListType("pop"),$this->ItemType,$this->CacheListExtraId("pop"),(int)$attribs["_today"],$this->QueryItemCount);
        }
        else
          $this->QueryItemCount=$CachedCount;
         
        return $this->Query_Item($sql);  	   
     }    
 
     function SqlHotItems($attribs)
     {
        global $objSession, $objCatList;
 
        $catid = (int)$attribs["_catid"];
        $scope = (int)$attribs["_scope"];
 
 //       $JoinCats = (int)$attribs["_catinfo"] || $scope;	 
 
         $TableName = $this->SourceTable;	
 		  	
 		$OrderBy = $TableName.".CachedRating DESC";       
 
         if($scope)
         {
             if (!$catid) 
             {
                $catid = $objCatList->CurrentCategoryID();
             }        
             $where =  "CategoryId =".$catid." AND ((".$TableName.".CachedRating >=".$this->GetHotValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1";
         }
         else
         {
             $where =  "((".$TableName.".CachedRating >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0 ) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 ";
         }
         
         if($attribs["_today"])
         {
    	  		$today = mktime(0,0,0,date("m"),date("d"),date("Y"));  
    	  		$where .= " AND ($TableName.CreatedOn>=$today)";
         }        
         $CategoryTable = GetTablePrefix()."Category";
  	    $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName ";
  	    $p = $this->BasePermission.".VIEW";
  	    $CatId = !$scope? NULL : $catid; 	    
  	    $sql .= $this->GetJoinedSQL($p,$CatId,$where);
  	   
         if(strlen($OrderBy))
             $sql .= " ORDER BY $OrderBy "; 	    
                  
     	return $sql;
     }
     
     function LoadHotItems($attribs)
     {
         global $objSession,$objCountCache;    
     	
         $sql = $this->SqlHotItems($attribs);
         if($objSession->HasSystemPermission("DEBUG.LIST"))
               echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
               
         if($attribs["_shortlist"])
         {
             $this->PerPageVar = $this->PerPageShortVar; 
         }
         else 
           $this->PerPageVar = $this->PerPageVarLong;   
                      
        $CachedCount = $objCountCache->GetValue($this->CacheListType("hot"),$this->ItemType,$this->CacheListExtraId("hot"),(int)$attribs["_today"], 0);            
        if(!is_numeric($CachedCount))
        {
  	     $this->QueryItemCount= QueryCount($sql);
          $objCountCache->SetValue($this->CacheListType("hot"),$this->ItemType,$this->CacheListExtraId("hot"),(int)$attribs["_today"],$this->QueryItemCount);
        }
        else
          $this->QueryItemCount=$CachedCount;
         
        return $this->Query_Item($sql);  	       	
     }
     
     function SqlSearchItems($attribs = array())
     {
         global $objConfig, $objItemTypes, $objSession, $objPermissions, $CountVal;
 
         $acl = $objSession->GetACLClause();
         $this->Clear();
         //$stable = "ses_".$objSession->GetSessionKey()."_Search";
         $stable = $objSession->GetSearchTable();
         $ltable = $this->SourceTable;
         $catitems = GetTablePrefix()."CategoryItems";
         $cattable = GetTablePrefix()."Category";
         $ptable = GetTablePrefix()."PermCache";
         $p = $this->BasePermission.".VIEW";
         $i = new $this->classname();
         
         $sql =  "SELECT $cattable.CategoryId,$cattable.CachedNavbar,$ltable.*, Relevance FROM $stable ";
         $sql .= "INNER JOIN $ltable ON ($stable.ItemId=$ltable.".$i->id_field.") ";
         
         $where = "ItemType=".$this->ItemType." AND $ltable.Status=1";
         
         $sql .= $this->GetJoinedSQL($p,NULL,$where);               
         $sql .= " ORDER BY EdPick DESC,Relevance DESC ";
         
         $tmp = $this->QueryOrderByClause(FALSE,TRUE,TRUE);
         $tmp = substr($tmp,9);
         if(strlen($tmp))
         {
         	$sql .= ", ".$tmp." ";
         }
 		return $sql;    	
     }
         
     function LoadSearchItems($attribs = array())
     {
 		global $CountVal, $objSession;
         //echo "Loading <b>".get_class($this)."</b> Search Items<br>";
 		$sql = $this->SqlSearchItems($attribs);
         //echo "$sql<br>";
         $this->Query_Item($sql);
         $Keywords = GetKeywords($objSession->GetVariable("Search_Keywords"));
         //echo "SQL Loaded ItemCount (<b>".get_class($this).'</b>): '.$this->NumItems().'<br>';
         for($i = 0; $i < $this->NumItems(); $i++)
         {
           $this->Items[$i]->Keywords = $Keywords;
         }
         if(is_numeric($CountVal[$this->ItemType]))
         {
           $this->QueryItemCount = $CountVal[$this->ItemType];
           //echo "CACHE: <pre>"; print_r($CountVal); echo "</pre><BR>";
         }
         else
         {
           $this->QueryItemCount = QueryCount($sql);
           //echo "<b>SQL</b>: ".$sql."<br><br>";
           $CountVal[$this->ItemType] = $this->QueryItemCount;
         }
                 
     }
         
     function PasteFromClipboard($TargetCat,$NameField="")
     {
       global $objSession,$objCatList;
 	
       $clip = $objSession->GetVariable("ClipBoard");
       if(strlen($clip))
       {
           $ClipBoard = ParseClipboard($clip);
           $IsCopy = (substr($ClipBoard["command"],0,4)=="COPY") || ($ClipBoard["source"] == $TargetCat);
 
           $item_ids = explode(",",$ClipBoard["ids"]);
           for($i=0;$i<count($item_ids);$i++)
           {              
               $item = $this->GetItem($item_ids[$i]);
               if(!$IsCopy) // paste to other category then current
               {   
                   $item->MoveToCategory($ClipBoard["source"],$TargetCat);                                                   
                   $clip = str_replace("CUT","COPY",$clip);
                   $objSession->SetVariable("ClipBoard",$clip);
               }
               else
               {              
                     $item->CopyToNewResource($TargetCat,$NameField); // create item copy, but with new ResourceId
                     $item->AddToCategory($TargetCat);
                     UpdateCategoryCount($item->type,$TargetCat);
               
               }
           }
       }
-    }    
+    }
+    
+    function AdminPrintItems($template)
+	{
+	    // prints item listing for admin (browse/advanced view) tabs
+	    $o = '<table border="0" cellspacing="2" width="100%"><tbody><tr>';
+	
+		$i = 1;
+	    
+	    $topleft		=	0;
+	    $topright		=	0;
+	    $rightcount		=	0;
+	    $total_items	=	$this->NumItems();
+	    $topleft		=	ceil($total_items / 2);
+	    $topright		=	$total_items - $topleft;
+	  
+	    for($x = 0; $x < $topleft; $x++) 
+	    {
+	        //printingleft
+	        $item = $this->Items[$x];
+			if ($i > 2)
+			{
+				$o .= "</tr>\n<tr>";
+				$i = 1;
+			}
+			$o .= $item->AdminParseTemplate($template);
+			$i++;
+	        
+	        //printingright
+	        if ($rightcount < $topright && ( ($x + $topleft) < $total_items) ) 
+	        {
+	            $item = $this->Items[ $x + $topleft ];
+				if ($i > 2)
+				{	
+				    $o.="</tr>\n<tr>";
+				    $i = 1;
+				}
+				$o .= $item->AdminParseTemplate($template);
+				$i++;
+	            $rightcount++;
+	        }
+	    }
+		$o .= "\n</tr></tbody></table>\n";   
+
+		return $o;
+	}
+    
 }
 
 // -------------- NEW CLASSES -----------------------
 
 class DBList {
 	
 	// table related attributes
 	var $db = null;
 	var $table_name = '';
 	var $LiveTable = '';
 	var $EditTable = '';
 	
 	
 	// record related attributes
 	var $records = Array();
 	var $record_count = 0;
 	var $cur_rec = -1; // "-1" means no records, or record index otherwise
 	
 	// query related attributes
 	var $SelectSQL = "SELECT * FROM %s";
 	
 	function DBList()
 	{
 		// use $this->SetTable('live', 'table name');
 		// in inherited constructors to set table for list
 		$this->db =& GetADODBConnection();	
 	}
 	
 	function SetTable($action, $table_name = null)
     {
     	// $action = {'live', 'restore','edit'}
     	switch($action)
     	{
     		case 'live': 
     			$this->LiveTable = $table_name;
     			$this->table_name = $this->LiveTable;
     			break;
     		case 'restore': 
     			$this->table_name = $this->LiveTable; 
     			break;
     		case 'edit':
     			global $objSession;
     			$this->table_name = $objSession->GetEditTable($this->LiveTable);
     			break;
     	}
     }
 	
 	function Clear()
 	{
 		// no use of this method at a time :)
 		$this->records = Array();
 		$this->record_count = 0;
 		$this->cur_rec = -1;	
 	}
 	
 	function Query()
 	{
 		// query list	
 		$sql = sprintf($this->SelectSQL, $this->table_name);
 		echo "SQL: $sql<br>";
 		$rs =& $this->db->Execute($sql);
 		
 		if( $this->db->ErrorNo() == 0 )
 		{
 			$this->records = $rs->GetRows();
 			$this->record_count = count($this->records);
 			//$this->cur_rec = $this->record_count ? 0 : -1;
 		}
 		else
 			return false;
 	}
 	
 	function ProcessList($callback_method)
 	{
 		// process list using user-defined method called
 		// with one parameter - current record fields 
 		// (associative array)
 		if($this->record_count > 0)
 		{
 			$this->cur_rec = 0;
 			while($this->cur_rec < $this->record_count)
 			{
 				if( method_exists($this, $callback_method) )
 					$this->$callback_method( $this->GetCurrent() );
 				$this->cur_rec++;	
 			}
 		}
 	}
 	
 	function &GetCurrent()
 	{
 		// return currently processed record (with change ability)
 		return ($this->cur_rec != -1) ? $this->records[$this->cur_rec] : false;
 	}
 	
 	function GetDBField($field_name)
 	{
 		$rec =& $this->GetCurrent();
 		return is_array($rec) && isset($rec[$field_name]) ? $rec[$field_name] : false;
 	}
 }
 
 
 ?>

Property changes on: trunk/kernel/include/parseditem.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.18
\ No newline at end of property
+1.19
\ No newline at end of property
Index: trunk/kernel/include/itemdb.php
===================================================================
--- trunk/kernel/include/itemdb.php	(revision 341)
+++ trunk/kernel/include/itemdb.php	(revision 342)
@@ -1,548 +1,555 @@
 <?php
 
 define('FT_OPTION', 1); // option formatter
 
 class clsItemDB 
 { 
   var $Formatters = Array(); //  by Alex
   var $m_dirtyFieldsMap = array();
   var $Data = array();
   var $adodbConnection;
   var $tablename;
   var $BasePermission;
   var $id_field;
   var $NoResourceId;
   var $debuglevel;
 
   function clsItemDB()
   {
       $this->adodbConnection = GetADODBConnection();
       $this->tablename="";
       $this->NoResourceId=0;  
       $this->debuglevel=0;
   }
   
   // ============================================================================================
   function GetFormatter($field)
   {
   	return $this->HasFormatter($field) ? $this->Formatters[$field] : false;
   }
   
   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 FormatFields()
   {
 	// format item in list data before printing
 	
 	foreach($this->Formatters as $field => $formatter)
 		$this->Data[$field] = $this->FormatField($field);
   }
   */
   function FormatField($field)
   {
   	// formats single field if it has formatter
   	if( $this->HasFormatter($field) )
   	{
   		$fmt = $this->Formatters[$field];
   		switch($fmt['type'])
 		{
 			case FT_OPTION:
 				return $fmt['options'][ $this->Data[$field] ];
 				break;	
 		}
   	}
   	else
   		return $this->Get($field);
   }
   
   function HasFormatter($field)
   {
   	// checks if formatter is set for field
   	return isset($this->Formatters[$field]) ? 1 : 0;
   }
   // ============================================================================================
   
   function UnsetIdField()
   {
     $f = $this->IdField();
     unset($this->Data[$f]);
     unset($this->m_dirtyFieldsMap[$f]);
   }
 
   function UnsetField($field)
   {
       unset($this->Data[$field]);
       unset($this->m_dirtyFieldsMap[$field]);
   }
 
   function IdField()
   {
       if(!strlen($this->id_field))
       {      
         return $this->tablename."Id";
       }
       else
           return $this->id_field;
   }
 
   function UniqueId()
   {
       return $this->Get($this->IdField());
   }
 
   function SetUniqueId($value)
   {
       $var = $this->IdField();	  
       $this->Set($var, $value);
   }
 
   function SetModified($UserId=NULL)
   {
       global $objSession;
       
       $keys = array_keys($this->Data);
       if(in_array("Modified",$keys))
       {
           $this->Set("Modified",adodb_date("U"));
       }
       if(in_array("ModifiedById",$keys))
       {
           if(!$UserId)
               $UserId = $objSession->Get("PortalUserId");
           $this->Set("ModifiedById",$UserId);
       }
   }
 
   function PrintVars()
   {
       echo '<pre>'.print_r($this->Data, true).'</pre>';
   }
   
 // =================================================================
   function GetFormatted($name)
   {	
       // get formatted field value
       return $this->FormatField($name);
   }
 
   function Get($name)
   {	
       // get un-formatted field value
       //if( !isset($this->Data[$name]) ) print_pre( debug_backtrace() );
       return $this->HasField($name) ? $this->Data[$name] : '';
   }
 // =================================================================
 
 	function HasField($name)
 	{
 		// checks if field exists in item
 		return isset($this->Data[$name]) ? 1 : 0;	
 	}
 	
 	function Set($name, $value)
   	{	
 		//echo "Setting Field <b>$name</b>: = [$value]<br>";
 		if( is_array($name) )
       	{
           	for ($i=0; $i < sizeof($name); $i++)
           	{	
           		$var = "m_" . $name[$i];
               	if( !$this->HasField($name[$i]) || ($this->Data[$name[$i]] != $value[$i]))
               	{
               		$this->Data[$name[$i]] = $value[$i];
               		$this->m_dirtyFieldsMap[$name[$i]] = $value[$i];
             	}
           	}
       	}
       	else
       	{
        		$var = "m_" . $name;
        		if( !$this->HasField($name) || $this->Data[$name] != $value )
        		{
        			$this->Data[$name] = $value;
        			$this->m_dirtyFieldsMap[$name] = $value;
     		}
       	}
   	} 
 
   function Dirty($list=NULL)
   {
       if($list==NULL)
       {
         foreach($this->Data as $field => $value)
         {
         	$this->m_dirtyFieldsMap[$field] = $value;
         }
       }
       else
       {      
         foreach($list as $field) 
         {	
        		$this->m_dirtyFieldsMap[$field] = $this->Data[$field];
         }
       }
   }
 
   function Clean($list=NULL)
   {
       if($list == NULL)
       {
           unset($this->m_dirtyFieldsMap);
           $this->m_dirtyFieldsMap=array();
       }
       else
       {      
         foreach($list as $value) 
         {	
           $varname = "m_" . $value;
           unset($this->m_dirtyFieldsMap[$value]);
         }
       }
   }
 
   function SetDebugLevel($value)
   {
       $this->debuglevel = $value;
   }
 
   function SetFromArray($data, $dirty = false)
   { 
       if(is_array($data))
       {      
         $this->Data = $data;
         if($dirty) $this->m_dirtyFieldsMap = $data;
       }
   }
 
   function GetData()
   {
     return $this->Data;
   }
 
   function SetData($data, $dirty = false)
   {
       $this->SetFromArray($data, $dirty);
   }
 
   function Delete()
   {
       global $Errors;
 
       if($this->Get($this->IdField())==0)
       {
           $Errors->AddError("error.AppError",NULL,'Internal error: Delete requires set id',"",get_class($this),"Delete");
           return false;
       }
 
 
       $sql = sprintf('DELETE FROM %s WHERE %s = %s', $this->tablename, $this->IdField(),
                       $this->UniqueId());
       if($this->debuglevel>0)
         echo $sql."<br>";
       if ($this->adodbConnection->Execute($sql) === false)
       {
           $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Delete");
           return false;
       }
       return true;
   }
 
   function Update($UpdatedBy=NULL)
   {
       global $Errors, $objSession;
 		
       if(count($this->m_dirtyFieldsMap) == 0)
           return true;
 
       $this->SetModified($UpdatedBy);
       $sql = "UPDATE ".$this->tablename ." SET ";
       $first  = 1;
       
       foreach ($this->m_dirtyFieldsMap as $key => $value)
       {
           if(!is_numeric($key) && $key != $this->IdField())
           {          
             if($first)
             {
               $sql = sprintf("%s %s=%s",$sql,$key,$this->adodbConnection->qstr(stripslashes($value)));
               $first = 0;
             }
             else
             {
               $sql = sprintf("%s, %s=%s",$sql,$key,$this->adodbConnection->qstr(stripslashes($value)));
             }
           }
           if (!(($value == '' || $value == 0) && ($this->Data[$key] == 'NULL' || $this->Data[$key] == '0' || $this->Data[$key] == ''))) {
           	if (!strstr($key, 'Modif') && $key != 'CreatedOn') {
           		$objSession->SetVariable("HasChanges", 1);
         	}
           }  	
       }
 
       $sql = sprintf("%s WHERE %s = '%s'",$sql, $this->IdField(), $this->UniqueId());
 
      if($this->debuglevel>0)
           echo $sql."<br>";
       if ($this->adodbConnection->Execute($sql) === false)
       {
           $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Update");
           return false;
       }
       
 /*      if ($this->adodbConnection->Affected_Rows() > 0) {
       	$objSession->SetVariable("HasChanges", 1);
   	  }*/
       
       return true;
   }
 	
 	function ReplaceID($new_id)
 	{
 		// replace item's id, because Update method 
 		// is too dummy to do this autommatically
 		// USED in temporary table editing stuff
 		$db =& $this->adodbConnection;
 		$sql = "UPDATE %1\$s SET `%2\$s` = %3\$s WHERE `%2\$s` = %4\$s"; 
 		$sql = sprintf($sql, $this->tablename, $this->IdField(), $new_id, (int)$this->UniqueId() );
 		if($this->debuglevel > 0) echo $sql.'<br>';
 		$db->Execute($sql);
 	}
 	
   function CreateSQL()
   {
   	 global $Errors;
   	 
      $sql = "INSERT INTO ".$this->tablename." (";
      $first  = 1;
      foreach ($this->Data as $key => $value)
      {
           if($first)
           {
               $sql = sprintf("%s %s",$sql,$key);
               $first = 0;
           }
           else
           {
               $sql = sprintf("%s, %s",$sql,$key);
           }
      }
      $sql = sprintf('%s ) VALUES (',$sql);
      $first = 1;
      foreach ($this->Data as $key => $value)
      {
           if($first)
           {
+              if( is_array($value) )
+              { 
+              	echo "Invalid Value: ";
+              	print_pre($value);
+              	echo "Tracing:<br>";
+              	trace();
+              }
               $sql = sprintf("%s %s",$sql,$this->adodbConnection->qstr(stripslashes($value)));
               $first = 0;
           }
           else
           {
               $sql = sprintf("%s, %s",$sql,$this->adodbConnection->qstr(stripslashes($value)));
           }
      }
      $sql = sprintf('%s)',$sql);
      
   	return $sql;
   }
   
   function Create()
   {
      global $Errors, $objSession;
      
 	if($this->debuglevel) echo "Creating Item: ".get_class($this)."<br>";
      if($this->NoResourceId!=1 && (int)$this->Get("ResourceId")==0)
      {
         $this->Set("ResourceId", GetNextResourceId());
      }
      $sql = $this->CreateSql();
      
      if($this->debuglevel>0)
         echo $sql."<br>\n";
 
      if ($this->adodbConnection->Execute($sql) === false)
       {
           $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Create");
           return false;
       }
 
       $this->SetUniqueId($this->adodbConnection->Insert_ID());
       
       
       if ($this->adodbConnection->Affected_Rows() > 0) {
       	$objSession->SetVariable("HasChanges", 1);
   	  }      
       
       return true;
   }
 
   function Increment($field)
   {	    
       global $Errors;
 
       $sql = "Update ".$this->tablename." set $field=$field+1 where ".$this->IdField()."=" . $this->UniqueId();
       if($this->debuglevel>0)
           echo $sql."<br>";
       $result = $this->adodbConnection->Execute($sql);
       if ($result === false)
       {
           $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Increment");
           return false;
       }
       $this->Set($field,$this->Get($field)+1);
   }
 
   function Decrement($field)
   {	
       global $Errors;
 
       $sql = "Update ".$this->tablename." set $field=$field-1 where ".$this->IdField()."=" . $this->UniqueId();
       if($this->debuglevel>0)
           echo $sql;
       $result = $this->adodbConnection->Execute($sql);
       if ($result === false)
       {
           $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Decrement");
           return false;
       }
       $this->Set($field,$this->Get($field)-1);
   }
   
   function GetFieldList($UseLoadedData=FALSE)
   {
   	if(count($this->Data) && $UseLoadedData==TRUE)
   	{
   		$res = array_keys($this->Data);
   	}
   	else
   	{
   		$res = $this->adodbConnection->MetaColumnNames($this->tablename);
   	}
   	return $res;
   }
   
   function UsingTempTable()
   {
   	global $objSession;
   	
   	$temp = $objSession->GetEditTable($this->tablename);
   	$p = GetTablePrefix()."ses";
   	$t = substr($temp,0,strlen($p));
   	$ThisTable = substr($this->tablename,0,strlen($p));  	
   	if($t==$ThisTable)
   	{
   		return TRUE;
   	}
   	else
   	  return FALSE;
   }
   
     function LoadFromDatabase($Id, $IdField = null) // custom IdField by Alex
     {
 		global $objSession,$Errors;
        
         if(!isset($Id))
         {
             $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase");
             return false;
         }
        
        // --------- multiple ids allowed: begin -----------------
        $id_field = isset($IdField) ? $IdField : $this->IdField();
        if( !is_array($id_field) ) $id_field = Array($id_field);
        if( !is_array($Id) ) $Id = Array($Id);
        
        $i = 0; $id_count = count($id_field);
        $conditions = Array();
        while($i < $id_count)
        {
        		$conditions[] = "(`".$id_field[$i]."` = '".$Id[$i]."')";
        		$i++;
        }
        $sql = sprintf('SELECT * FROM %s WHERE %s', $this->tablename, implode(' AND ', $conditions) );
        // --------- multiple ids allowed: end --------------------
        if($this->debuglevel) echo "Load SQL: $sql<br>"; 
         $result = $this->adodbConnection->Execute($sql);
         if ($result === false)
         {
             $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase");
             return false;
         }
         $data = $result->fields;
 		if($this->debuglevel) print_pre($data);
 		if(is_array($data))
           $this->SetFromArray($data);
         $this->Clean();
         return TRUE;
     }
     
     function FieldExists($field)
     {
       $res = array_key_exists($field,$this->Data);
       return $res;	
     }
   
     function ValueExists($Field,$Value)
     {
     	$sql = "SELECT $Field FROM ".$this->tablename." WHERE $Field='$Value'";
     	$rs = $this->adodbConnection->Execute($sql);
     	if($rs && !$rs->EOF)
     	{
     		return TRUE;
     	}
     	else
     	  return FALSE;
     }
 
     function FieldMax($Field)
     {
     	$sql = "SELECT Max($Field) as m FROM ".$this->tablename;
     	$rs = $this->adodbConnection->Execute($sql);
     	if($rs && !$rs->EOF)
     	{
     		$ret = $rs->fields["m"];
     	}
     	else
     	  $ret = 0;
     }
     
     function FieldMin($Field)
     {
     	$sql = "SELECT Min($Field) as m FROM ".$this->tablename;
     	$rs = $this->adodbConnection->Execute($sql);
     	if($rs && !$rs->EOF)
     	{
     		$ret = $rs->fields["m"];
     	}
     	else
     	  $ret = 0;
     }
     
     function TableExists($table = null)
     {
     	// checks if table specified in item exists in db	
     	$db =& $this->adodbConnection;
     	$sql = "SHOW TABLES LIKE '%s'";
     	if($table == null) $table = $this->tablename;
     	$rs = $db->Execute( sprintf($sql, $table) );
     	
     	if( $rs->RecordCount() == 1 ) // table exists in normal case
     		return 1;
     	else // check if table exists in lowercase
     		$rs = $db->Execute( sprintf($sql, strtolower($table) ) );
     	
     	return ($rs->RecordCount() == 1) ? 1 : 0;
     }	
     	
 }
 ?>

Property changes on: trunk/kernel/include/itemdb.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.2
\ No newline at end of property
+1.3
\ No newline at end of property
Index: trunk/kernel/include/permissions.php
===================================================================
--- trunk/kernel/include/permissions.php	(revision 341)
+++ trunk/kernel/include/permissions.php	(revision 342)
@@ -1,416 +1,428 @@
 <?php
 class clsPermission extends clsItemDB 
 {
     var $Inherited;
 
     function clsPermission($PermissionId=NULL)
     {        
         $this->clsItemDB();
         $this->tablename = GetTablePrefix()."Permissions";
         $this->BasePermission="GRANT";
         $this->id_field = "PermissionId";
         $this->NoResourceId = 1;
         $this->Inherited=FALSE;
         if($PermissionId)
            $this->LoadFromDatabase($PermissionId);
     }
     
     function LoadFromDatabase($Id)
     {
 		global $Errors;
        
         if(!isset($Id))
         {
             $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase");
             return false;
         }        
         $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$Id);
         $result = $this->adodbConnection->Execute($sql);
         if ($result === false)
         {
             $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase");
             return false;
         }
 
         $data = $result->fields;
 
         $this->SetFromArray($data);
         $this->Clean();
         return true;
     }
 }
 
 class clsPermList extends clsItemCollection
 {
     var $CatId;
     var $GroupId;
     var $CatBranch;
 
     function clsPermList($CatId=NULL,$GroupId=NULL)
     {
       $this->clsItemCollection();
       $this->classname = "clsPermission";
       $this->SourceTable = GetTablePrefix()."Permissions";
       $this->Clear();      
       $this->GroupId = $GroupId;
       $this->CatId = $CatId;
     }
 
     function GetPermId($PermName)
     {
         $val = 0;
         $sql = "SELECT PermissionConfigId,PermissionName FROM ".GetTablePrefix()."PermissionConfig WHERE PermissionName='$PermName'";
         //echo $sql."<br>\n";
         $rs = $this->adodbConnection->Execute($sql);
         if($rs && !$rs->EOF)
             $val = $rs->fields["PermissionConfigId"];
         return $val;
     }
 
     function GetPermByName($Perm)
     {
         foreach($this->Items as $p)
         {
             if($p->Get("Permission")==$Perm && $p->Get("GroupId")==$this->GroupId)
             {
                 return $p;
             }
         }
         return false;
     }
 
     function AddItemFromArray($data)
     {
     	global $objCatList;
     	
         $p = new clsPermission();
 
         foreach($data as $field => $value)
            $p->Set($field,$value);
         if($data["Type"]==0)
         {        
           if($p->Get("CatId") != $this->CatId)
           {   
               $p->Inherited = TRUE;
           }
           else
              $p->Inherited = FALSE;
         }
         array_push($this->Items,$p);
     }
 
     function LoadCategory($Id)
     {
         if($this->GroupId == NULL)
         {
             $sql = "SELECT * FROM ".$this->SourceTable." WHERE CatId=$Id AND Type=0 AND GroupId IS NULL";
         }
         else
           $sql = "SELECT * FROM ".$this->SourceTable." WHERE CatId=$Id AND Type=0 AND GroupId=".$this->GroupId;
 
         $rs = $this->adodbConnection->Execute($sql);
         while ($rs && !$rs->EOF) 
         {            
             $data = $rs->fields;
             $current = $this->GetPermByName($data["Permission"]);
             if(!is_object($current))
             {
                $this->AddItemFromArray($data);
             }
             unset($current);
             $rs->MoveNext();
         }
     }    
 
     function LoadPermTree($c)
     {        
         /* load all permissions for group on this category */
         global $objCatList;
 
         $this->CatId=$c->Get("CategoryId");        
         $cats = explode("|",substr($c->Get("ParentPath"),1,-1));
         if(is_array($cats))
         {             
           $cats = array_reverse($cats);  
           $cats[] = 0;
           $this->CatBranch = $cats;
           foreach($cats as $catid)
           { 
             $this->LoadCategory($catid);
           }        
         }
     }
     
     function GetDefinedCategory($Perm,$GroupId)
     {
     	$ret = "";
     	if(is_array($this->CatBranch))
     	{
           for($index=0;$index<count($this->CatBranch);$index++)	
           {
           	foreach($this->Items as $p)
           	{
           		if($p->Get("Permission")==$Perm)
           		{
           		  if($p->Get("Permission")==$Perm && $p->Get("GroupId")==$GroupId && 
           		     $p->Get("CatId")==$this->CatBranch[$index])
           		  {
           		     $ret = $this->CatBranch[$index];
           		     break;
           	  	  }
           		}
           	}
           	if(is_numeric($ret))
           	  break;
           }
     	}
     	return $ret;
     }
 
 
     function GetPermissionValue($PermName)
     {
       $p = $this->GetPermByName($PermName);
       if(!is_object($p))
       {
           $ret = NULL;
       }
       else
           $ret = $p->Get("PermissionValue");
       return $ret;
     }
 
     function LoadSystemPermissions()
     {
         $sql = "SELECT * FROM Permissions WHERE Type=1 AND GroupId=".$this->GroupId;
         $rs = $this->adodbConnection->Execute($sql);
         $this->clear();
         $this->CatId=NULL;
         while($rs && !$rs->EOF)
         {
             $data = $rs->fields;
             $this->AddItemFromArray($data);
         }
     }
 
+	function Set_Permission($CategoryId,$GroupId,$PermName,$Value,$Type)
+	{
+		$Perm = $this->GetPermByName($PermName);
+		if($Perm)
+		{
+			$Id = $Perm->Get("PermissionId");
+			$this->Edit_Permission($Id,$CategoryId,$GroupId,$PermName,$Value,$Type);
+		}
+		else
+			$this->Add_Permission($CategoryId,$GroupId,$PermName,$Value,$Type);
+	}
+
     function Add_Permission($CategoryId,$GroupId,$PermName,$Value,$Type)
     {
         $p = new clsPermission();
         $p->Set(array("CatId","GroupId","Permission","PermissionValue","Type"),
                 array($CategoryId,$GroupId,$PermName,$Value,$Type));
         $p->Create();
         array_push($this->Items,$p);
         return $p;
     }
 
     function Edit_Permission($PermissionId,$CategoryId,$GroupId,$PermName,$Value,$Type)
     {
         $p = $this->GetItem($PermissionId);
         if(is_object($p))
         {
          $p->Set(array("CatId","GroupId","Permission","PermissionValue","Type"),
                  array($CategoryId,$GroupId,$PermName,$Value,$Type));
          $p->Update();
         }
         return $p;
     }
 
     function Delete_Permission($PermissionId)
     {
         $p = $this->GetItem($PermissionId);
         if(is_object($p))
         {
             $p->Delete();
         }
     }
 
     function Copy_Permissions($SrcCat,$DestCat)
     {
        $sql = "DELETE FROM ".$this->SourceTable." WHERE CatId=$DestCat";
        $this->adodbConnection->Execute($sql);
        $sql = "SELECT * FROM ".$this->SourceTable." WHERE CatId=".$SrcCat;
        $rs = $this->adodbConnection->Execute($sql);
        while($rs && !$rs->EOF)
        {
            $data = $rs->fields;
            $this->Add_Permission($DestCat,$data["GroupId"],$data["Permission"],$data["PermissionValue"],$data["Type"]);
            $rs->MoveNext();
        }
     }
 
     function Delete_CatPerms($CatId)
     {
        $sql = "DELETE FROM ".$this->SourceTable." WHERE CatId=$CatId";
        $this->adodbConnection->Execute($sql);       
     }
 
     /* return an array of group ids which have access to permission $perm for a category*/
     function GetGroupPermList($c, $Perm, $AllGroups)
     {
         $ret = array();
         $this->Clear();        
         if(strlen($Perm) && count($AllGroups))
         {
            for($i=0;$i<count($AllGroups);$i++)
            {
                $this->CatId=$c->Get("CategoryId");
                $this->GroupId = $AllGroups[$i];
                $this->LoadPermTree($c);
                if($this->GetPermissionValue($Perm)==1)
                {               
                    $ret[] = $AllGroups[$i];
                }
            }
         }
         return $ret;
     }
 
     function GetAllViewPermGroups($c, $AllGroups)
     {
         $perms = array();
         $sql = "SELECT PermissionConfigId, PermissionName FROM ".GetTablePrefix()."PermissionConfig WHERE PermissionName LIKE '%.VIEW'";
         //echo $sql."<br>\n";
         $rs = $this->adodbConnection->Execute($sql);
         while($rs && !$rs->EOF)
         {
             $perms[$rs->fields["PermissionName"]] = $this->GetGroupPermList($c,$rs->fields["PermissionName"],$AllGroups);
             $rs->MoveNext();
         }
         return $perms;
     }
 }
 
 class clsPermCache extends clsItemDB 
 {
     function clsPermCache($id=NULL)
     {
         $this->clsItemDB();
         $this->tablename = GetTablePrefix()."PermCache";
         $this->BasePermission="GRANT";
         $this->id_field = "PermCacheId";
         $this->NoResourceId = 1;
 
         if($id)
            $this->LoadFromDatabase($id);
     }
     
     function LoadFromDatabase($Id)
     {
 		global $Errors;
        
         if(!isset($Id))
         {
             $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase");
             return false;
         }        
         $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$Id);
         $result = $this->adodbConnection->Execute($sql);
         if ($result === false)
         {
             $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase");
             return false;
         }
 
         $data = $result->fields;
 
         $this->SetFromArray($data);
         $this->Clean();
         return true;
     }
 }
 
 class clsPermCacheList extends clsItemCollection 
 {
     function clsPermCacheList()
     {
       $this->clsItemCollection();
       $this->classname = "clsPermCache";
       $this->SourceTable = GetTablePrefix()."PermCache";
       $this->Clear();   
     }
 
     function &GetPerm($CategoryId,$PermId)
     {
         $found = FALSE;
         foreach($this->Items as $p)
         {
           if($p->Get("CategoryId")==$CategoryId && $p->Get("PermId")==$PermId)
           {
               $found = TRUE;
               break;
           }
         }
         if(!$found)
         {
             $sql = "SELECT * FROM ".$this->SourceTable." WHERE CategoryId=$CategoryId AND PermId=$PermId";
             $rs = $this->adodbConnection->Execute($sql);
             if($rs && !$rs->EOF)
             {
                 $data = $rs->fields;
                 $p = $this->AddItemFromArray($data);
             }
             else
                 $p = FALSE;
         }
         return $p;
     }
 
     function &AddPermCache($CatId,$PermId,$Acl,$Dacl)
     {
         if(strlen($Acl)>0 || strlen($Dacl)>0)
         {        
           $p = new $this->classname;
           $p->Set(array("CategoryId","PermId","ACL","DACL"),array($CatId,$PermId,$Acl,$Dacl));
           $p->Create();        
           return $p;
         }
         else
             return FALSE;
     }
 
     function EditPermCache($PermCacheId,$CatId,$PermId,$Acl,$Dacl)
     {
         if($PermCacheId)
         {        
           $p = $this->GetItem($PermCacheId);
           if(is_object($p))
           {
               $p->Set(array("CategoryId","PermId","ACL","DACL"),array($CatId,$PermId,$Acl,$Dacl));
               $p->Update();
           }
         }
     }
 
     function DeletePermCache($PermCacheId)
     {
         if($PermCacheId)
         {        
           $p = $this->GetItem($PermCacheId);
           if(is_object($p))
           {
               $p->Delete();
           }
         }
     }
 
     function DeleteCategory($CategoryId)
     {
         $this->adodbConnection->Execute("DELETE FROM ".$this->SourceTable." WHERE CategoryId=$CategoryId");
     }
 
     function CopyCategory($SourceCat,$DestCat)
     {
         $this->Clear();
         $this->Query_Item("SELECT * FROM ".$this->SourceTable." WHERE CategoryId=$SourceCat");
         if($this->NumItems()>0)
         {
             foreach($this->Items as $p)
             {
                 $p->UnsetIdField();
                 $p->Set("CategoryId",$DestCat);
                 $p->Create();
             }
         }
     }
 }
 ?>

Property changes on: trunk/kernel/include/permissions.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.1
\ No newline at end of property
+1.2
\ No newline at end of property
Index: trunk/admin/browse/checkboxes_new.js
===================================================================
--- trunk/admin/browse/checkboxes_new.js	(revision 341)
+++ trunk/admin/browse/checkboxes_new.js	(revision 342)
@@ -1,669 +1,666 @@
 var animationTimeout = 500;//ms
 
 var focusType = "";
 var tabIDs = new Array();
 var tabSelection = new Array();
 var LastCheckedItem = null;
 var enableContextMenus= true;
 var doubleClickAction = "edit";
 var CurrentTab =  new String("");
 var PasteButton = false;
 var start_tab = null;
 var selcount = 0;
 
 var _single_select = false;
 
 function initCheckBoxes(selChangedHandler, use_cats)
 {
 	if(use_cats == null && typeof(use_cats) == 'undefined') use_cats = true;
 
 	//set single_select to true to turn on radio-buttons select mode
 	if (typeof(single_select) != 'undefined') _single_select = single_select;
 	
    	var checkBoxContainers = document.body.getElementsByTagName("DIV");
    	for (var i = 0; i < checkBoxContainers.length; i++)
 		if( checkBoxContainers[i].getAttribute("isTab") )
       	{
 			if(tabIDs.length == 0) start_tab =  checkBoxContainers[i].id;
          	tabIDs[tabIDs.length] = checkBoxContainers[i].id
          	tabSelection[checkBoxContainers[i].id] = 0;
       	}
 
    	tabSelection['categories'] = 0;
 	
 	if(use_cats == true)
 	{
    		categoriesTab = document.getElementById('categories');
    		var catInputs = categoriesTab.getElementsByTagName("INPUT");
    		for (var i = 0; i < catInputs.length; i++) catInputs.checked = false;
    		if (categoriesTab) categoriesTab.active = true;
    	}
    	 
    var unique_id = 1;
    for (var i = 0; i < checkBoxContainers.length; i++) {
       
       if (checkBoxContainers[i].getAttribute("inportalType"))
       {
          var inputs = checkBoxContainers[i].getElementsByTagName("INPUT");
          var checkBox;
          for (var j = 0; j < inputs.length; j++)
             if (inputs[j].type == "checkbox")
             {
                checkBox = inputs[j];
                if (_single_select) {
                	
                	if (document.all) {
                		unique_id++;
 
                		checkBox.outerHTML = '<INPUT ID="swapped_to_radio_'+unique_id+'" TYPE="radio" NAME="'+checkBox.name+'" VALUE="'+checkBox.value+'" ItemType="'+checkBox.ItemType+'" inportalType="'+checkBoxContainers[i].getAttribute("inportalType")+'">';
                		checkBox = document.getElementById('swapped_to_radio_'+unique_id);
 
                	}
               	else {
 			         		radio = document.createElement('input');
 			         		radio.type = 'radio';
 			         		radio.name = checkBox.name;
 			         		radio.value = checkBox.value;
 			         		radio.checked = true;
 			         		radio.ItemType = checkBox.getAttribute('ItemType');
 			         		checkBox.parentNode.replaceChild(radio, checkBox);	
 			         	  checkBox = radio;
 			         	}
 			         }
                break;
             }
          checkBox.inportalType = checkBoxContainers[i].getAttribute("inportalType");
          checkBox.onclick = checkBoxClick;
          checkBox.container = checkBoxContainers[i];
 
-         var selNode = (checkBox.container.getAttribute("inportalType") == "categories" || checkBox.container.getAttribute("inportalType") == "category") ? checkBox.container.parentNode : checkBox.container.parentNode.parentNode;
-         
+         var selNode = (checkBox.container.getAttribute("inportalType") != "topics") ? checkBox.container.parentNode : checkBox.container.parentNode.parentNode;
          selNode.chB = checkBox;
          
          document.body.onclick = function(e)
          {
          		//alert('body click');
             var srcElement = (document.all) ? event.srcElement : e.target;
             if (!srcElement) return;
             if (srcElement.onclick || srcElement.onmousedown || srcElement.onmouseup) return;
             if (selcount == 0) {
             	unselectAll('categories')
             	if (activeTab) unselectAll(activeTab.id)
             }
             else {
             	selcount = 0;
             }            
          }
 
          if(enableContextMenus==true)
          {         
            selNode.oncontextmenu = function(e)
            {
 //           	alert('menu');
 //            unselectAll('categories')
 //            if (activeTab) unselectAll(activeTab.id)
             if (!this.chB.checked)
             {
                unselectAll('categories')
                if (activeTab) unselectAll(activeTab.id)
                this.chB.checked = true;
                this.chB.onclick();
             }
             var evt = (!document.all) ? e : event; if (evt)
             {
                evt.cancelBubble = true;
                evt.returnValue = false;
             }
             showContextMenu(evt);
             return false;
            }
         }
         selNode.style.cursor = 'default';
 //         document.onselectstart = function(){return false;}
          selNode.ondblclick = function(e)
          {
             unselectAll('categories')
             if (activeTab) unselectAll(activeTab.id)
 
             this.chB.checked = (!this.chB.checked);
             this.chB.onclick();
             this.action = doubleClickAction;
             actionHandler(this);
 
             var evt = (!document.all) ? e : event; if (evt)
             {
                evt.cancelBubble = true;
                evt.returnValue = false;
                return false;
             }
          }
                 
          selNode.onclick = function(e)
          {      
          		//alert('onclick of selNode');
             var evt = (!document.all) ? e : event; 
             if (!evt) return;
             if (evt)
             {
                evt.cancelBubble = true;
 //               evt.returnValue = false;
             }
 //            alert('d')
             if (_single_select || (!evt.ctrlKey && !evt.shiftKey))
             {  
             	 //alert('unselectAll');        
                unselectAll('categories')
                if (activeTab) unselectAll(activeTab.id)
                if (this.chB.checked == true) return
                //alert('setting '+this.chB.name+' '+this.chB.value+'  checked = true');
                this.chB.checked = true;
                //alert('calling onclick');
                this.chB.onclick();
                return;
             }
 
             if (document.all) document.selection.empty()
             else
             {
                var selection = window.getSelection();
             }
             if (evt.shiftKey)
             {   
                
                var container = (this.chB.inportalType == "categories") ? document.getElementById("categories") : activeTab;
                var inputs = container.getElementsByTagName("INPUT");
                var checkboxes = new Array();
 
                for (var i = 0; i < inputs.length; i++)
                   if ((inputs[i].type == "checkbox" || inputs[i].type == "radio") && inputs[i].container) checkboxes[checkboxes.length] = inputs[i];
 
 
                var cIndex; var maxIndex = 0; maxLcp = 0;
                for (var i = 0; i < checkboxes.length; i++)
                {
                   if (checkboxes[i] == this.chB) cIndex = i;
                   if (checkboxes[i].lcp > maxLcp)
                   {
                      maxIndex = i;
                      maxLcp = checkboxes[i].lcp;
                   }
 //                  checkboxes[i].onclick();
                   
                }
                checkboxes[maxIndex].onclick();
                for (var i = 0; i < checkboxes.length; i++)
                   selectContainer(checkboxes[i], (i <= cIndex && i >= maxIndex && maxIndex <= cIndex || i >= cIndex && i <= maxIndex && maxIndex > cIndex) )
                   
 //selectContainer(checkBox, value, doNotFireSelectionEvent)
                return;
             }
 //                alert(evt.srcElement)
             
             this.chB.checked = (!this.chB.checked);
             this.chB.onclick();
 
             return false;
          }       
 
          checkBox.checked = false;
 //         checkBoxContainers[i].className = (checkBox.checked) ? "selectedContainer" : "unselectedContainer";
          selectContainer(checkBox, checkBox.checked, true)
          if (checkBox.checked)
             tabSelection[checkBox.inportalType]++;
 
       }
    }
    tabChanged();
    selectionChanged();
 
    initTabsForAnimation();
 }
 function clear_checkboxes(){
 		//alert('clear checkboxes');
         var inputs = document.body.getElementsByTagName("INPUT");
         for (var j = 0; j < inputs.length; j++)
             if ((inputs[j].type == "checkbox") && (inputs[j].inportalType))
             {
               inputs[j].checked = false;
             }
 }
 
 var lcp = 1;
 function checkBoxClick(e)
 {
 	//alert('click '+this.checked + ' inptype: ' + this.inportalType);
    this.lcp = lcp++;
    
    if (_single_select) {
    	ch = this.checked;
    	this.checked = false;
    	unselectAll('categories')
    	if (activeTab) unselectAll(activeTab.id)
    	this.checked = ch;
    }
    
    if (this.inportalType == "categories")
    {              
       if (activeTab) unselectAll(activeTab.id)
    }
    else unselectAll("categories");
 
    
 
    selectContainer(this, this.checked);
    if (this.checked)
    {   
       tabSelection[this.inportalType]++
       LastCheckedItem = this;
    }
    else
    { 
       tabSelection[this.inportalType]--;
       LastCheckedItem = null;
    }
    updateStatus();
    var evt = (typeof(document.all) == 'undefined') ? e : event;
    if (!evt) return;
    evt.cancelBubble = true;
 //   evt.returnValue = false;
    return;
 
 }
 
 function toggleTab(tabId, atm)
 {
    var tab = document.getElementById(tabId);
    if (!tab) return;
    for (var i = 0; i < tabIDs.length; i++)
    {
       if (tabIDs[i] != tabId)
       {          
          inactiveTab = document.getElementById(tabIDs[i]);
          if(inactiveTab.getAttribute("isTab"))
          {         
            unselectAll(tabIDs[i]);
            if (inactiveTab.style.display != "none")
            {
               inactiveTab.style.top = inactiveTab.pTop - inactiveTab.oHeight;
               inactiveTab.pY = -inactiveTab.oHeight;
            }
            inactiveTab.style.display = "none";
            inactiveTab.active = false;
          }
       }
    }
    tab.style.display = "";
    tab.active = true;
    if(toolbar) toolbar.setTab(tabId);
    activeTab = tab;
    tabChanged();   
    showTab(atm);
    CurrentTab = activeTab.tabTitle;
 }
 
 var collapseTab;
 
 function showTab(atm)
 {                  
    var container = (activeTab) ? activeTab : collapseTab;
    if (!container) return;
 	var scrollJumpA = scrollJump;
 	if (!container.startTime)
 	{
 	   container.startTime = new Date();
 	   
 	}
 	else
 	{
 		var cDate = new Date();
 		if (cDate - container.startTime >= animationTimeout) scrollJumpA = container.oHeight;
 	}
    var sj = (atm) ? container.oHeight :scrollJumpA;
    container.pY += (container.active) ? sj : -sj;
    if (container.pY > container.pTop) container.pY = container.pTop;
    if (container.pY < -container.oHeight) container.pY = -container.oHeight;
 
    container.style.top = container.pY;
 
    if ((container.pY != container.pTop && container.active) || (container.pY != -container.oHeight && !container.active))
       setTimeout("showTab()", 0)
       
    else
    {   
       unselectAll(container.id);
       if (container.active)
       {
          var devider = document.getElementById("tabsDevider");
          devider.style.display = "none";
          theMainScript.SetCookie('active_tab', container.id);
          theMainScript.SetCookie('tabs_on',1);
       }
       else
       {
          container.style.top = container.pTop - container.oHeight;
          container.style.display = "none";
          theMainScript.SetCookie('tabs_on',0);
       }
 	  container.startTime = null;
    }
 }
 
 
 
 function toggleCategories(instant)
 {
    var tab = document.getElementById("categories");
    tab.active = (!tab.active);
    if(tab.active)
        CurrentTab = 'Categories';
    var devider = document.getElementById("categoriesDevider");
    if (!tab.active) devider.style.display = "";
 
    toolbar.showButton('new_cat', tab.active)
    unselectAll("categories");
    tabChanged();
 
    var container = document.getElementById("firstContainer");
    
    if (!container.pY) container.pY = 0;
    if (!container.pTop && container.pTop != 0) container.pTop = -1;
    showCategories(instant);
 }
 
 var scrollJump = 8;
 function showCategories(instant)
 {
    var container = document.getElementById("firstContainer");
    var categories = document.getElementById("categories"); 
 	var scrollJumpA = scrollJump;
 	
 	scrollJumpA = (instant) ? container.offsetHeight : scrollJumpA;
 	
 	if (!categories.startTime)
 	{
 	   categories.startTime = new Date();
 	   
 	}
 	else
 	{
 		var cDate = new Date();
 		if (cDate - categories.startTime >= animationTimeout) scrollJumpA = categories.offsetHeight;
 		//ert(animationTimeout);
 	}
    (categories.active) ? container.pY += scrollJumpA : container.pY -= scrollJumpA;
    if (container.pY < container.pTop - categories.offsetHeight) 
        container.pY = container.pTop - categories.offsetHeight;
 
    if (container.pY > container.pTop) 
        container.pY = container.pTop;
 
    container.style.top = container.pY;
    if (((Math.abs(container.pY) <= categories.offsetHeight + container.pTop) && (!categories.active)) || ((container.pY < container.pTop) && (categories.active)))
       setTimeout("showCategories()", 0)
    else
    {
       unselectAll("categories");
       if (categories.active) //shown categories
       {
          var devider = document.getElementById("categoriesDevider");
          //devider.style.display = "none";
          theMainScript.SetCookie('cats_tab_on', 1);
       }
     	else { //hidden categories
     		theMainScript.SetCookie('cats_tab_on', 0);
     	}
 	  categories.startTime = null;
    }
 }
 
 /*
 function toggleCategories()
 {
    var tab = document.getElementById("categories");
    var devider = document.getElementById("categoriesDevider");
    devider.style.display = (tab.style.display == "none") ? "" : "none";
 
 //   tab.style.display = (tab.style.display == "none") ? "" : "none";
    
    tab.active = (tab.style.display != "none");
    toolbar.showButton('new_cat', tab.active)
    unselectAll("categories");
    tabChanged();
 
    var container = document.getElementById("firstContainer");
    
    if (!container.pY) container.pY = 0;
    showCategories();
 }
 
 function showCategories()
 {
    var container = document.getElementById("firstContainer");
    var categories = document.getElementById("categories");
    container.style.top = (categories.active) ? container.pY++ : container.pY--;
    if (((Math.abs(container.pY) < categories.offsetHeight) && (!categories.active)) || ((container.pY < 0) && (categories.active)))
       setTimeout("showCategories()", 10)
    else
       unselectAll("categories");
 }
 */
 
 function selectAllC(tabId)
 {
 	if (tabId != 'categories') {
 		unselectAll('categories');
 	}
 	else {
 		unselectAll('links');
 		unselectAll('news');
 		unselectAll('topics');
 	}
 	selcount = 0;
 	changeSelection(tabId, 0);
 }
 
 function unselectAll(tabId)
 {
 	selcount = 0;
 	changeSelection(tabId, 1);
    	LastCheckedItem = null;
 }
 
 function invert(tabId)
 {
 	if (tabId != 'categories') {
 		unselectAll('categories');
 	}
 	else {
 		unselectAll('links');
 		unselectAll('news');
 		unselectAll('topics');
 	}
    	selcount = 0;
 	changeSelection(tabId, 2);   
 }
 
 function changeSelection(tabId, action)
 {
 	if (selcount == 0) {
 		selcount++;
 		//alert('change Selection');
 	   if(toolbar)
 	   {   
 	     var tab = document.getElementById(tabId);
 	     if (!tab) return;
 	     var inputs = tab.getElementsByTagName("INPUT");
 	     //alert(inputs.length);
 	     for (var j = 0; j < inputs.length; j++) {
 	     	//alert(inputs[j].type + ' ' + inputs[j].name + ' ' + inputs[j].inportalType);
 	      if ((inputs[j].type == "checkbox" || inputs[j].type == "radio") && (inputs[j].inportalType))
 	      {
 	      	//alert('will do');
 	         switch (action)
 	         {
 	            case (0) :
 	               selectContainer(inputs[j], true, true)
 	            break;
 	            case (1) :
 	               selectContainer(inputs[j], false, true)
 	            break;
 	            default:
 	               selectContainer(inputs[j], (!inputs[j].checked), true)
 	            break;
 	         }
 	
 	      }
 	    }
 	     selectionChanged();
 	   }
 	}
 	else {
 		selcount = 0;
 	}
 }
 
 function selectContainer(checkBox, value, doNotFireSelectionEvent)
 {
 	//alert('select cont');
-   if (!checkBox) return;
-   if (checkBox.checked != value)
-   {
-   	//alert('setting '+value);
-      checkBox.checked = value;
-      if (value)
-         tabSelection[checkBox.inportalType]++
-      else
-         tabSelection[checkBox.inportalType]--;
-   }
-   var selNode = (checkBox.container.getAttribute("inportalType") == "categories" || checkBox.container.getAttribute("inportalType") == "category") ? checkBox.container.parentNode : checkBox.container.parentNode.parentNode;
-
-   if (!selNode.oriCN && checkBox.checked || selNode.className != "selectedContainer" && selNode.className != "unselectedContainer")
-         selNode.oriCN = (selNode.className) ? selNode.className : "";
+   	if (!checkBox) return;
+   	if (checkBox.checked != value)
+   	{
+   		//alert('setting '+value);
+      	checkBox.checked = value;
+      	if(value)
+         	tabSelection[checkBox.inportalType]++
+      	else
+         	tabSelection[checkBox.inportalType]--;
+   	}
+	var selNode = (checkBox.container.getAttribute("inportalType") != "topics") ? checkBox.container.parentNode : checkBox.container.parentNode.parentNode;
+   	if (!selNode.oriCN && checkBox.checked || selNode.className != "selectedContainer" && selNode.className != "unselectedContainer")
+		selNode.oriCN = (selNode.className) ? selNode.className : "";
 
  
-   selNode.className = (checkBox.checked) ? "selectedContainer" : ((selNode.oriCN != "") ? selNode.oriCN : "unselectedContainer");
-//   checkBox.container.className = (checkBox.checked) ? "selectedContainer" : "unselectedContainer";
-   if (!doNotFireSelectionEvent)
-      selectionChanged();
+   	selNode.className = (checkBox.checked) ? "selectedContainer" : ((selNode.oriCN != "") ? selNode.oriCN : "unselectedContainer");
+	//checkBox.container.className = (checkBox.checked) ? "selectedContainer" : "unselectedContainer";
+   	if (!doNotFireSelectionEvent) selectionChanged();
 }
 
 function updateStatus()
 {
    var StatusString="";
    for (var i = 0; i < tabIDs.length; i++)
       StatusString+= tabIDs[i] + ": " + tabSelection[tabIDs[i]] + "; ";
 
    StatusString+= "categories: " + tabSelection['categories'] + "; ";
    window.status = StatusString;
 }
 
 
 function selectionChanged()
 {
           setTimeout('selectionChangedA()', 0)
 }
 var activeTab;
 
 function TabPasteEnabled(TabTitle)
 {
   //alert('Checking '+TabTitle);
   var Enable_Paste = false; 
   try
   {
 	  Enable_Paste = eval(TabTitle+'_Paste');
 	  return Enable_Paste;
   }
   catch (e)
   {
   	return;
   }
 }
 
 function selectionChangedA()
 {
    var categories = document.getElementById('categories');
   
 
    for (var i = 0; i < tabIDs.length; i++)
    {
       var thisTab = document.getElementById(tabIDs[i])
       if (!thisTab) continue;
       if (thisTab.active)
       {
          activeTab = thisTab;
          activeTab.title = getTabTitle(tabIDs[i]);    
                  break;
       }
    }
 
    var numCategoriesSelected = tabSelection['categories'];
    var numActiveTabSelected = (activeTab) ? tabSelection[activeTab.id] : 0;
 
    if(toolbar)
    {
      //toolbar.enableButton("edit", (numCategoriesSelected + numActiveTabSelected == 1));
      var enableMiscButtons = (numCategoriesSelected + numActiveTabSelected > 0 && numCategoriesSelected * numActiveTabSelected == 0);
      var enableCurrentButton = !enableMiscButtons;
 
      toolbar.enableButton("editcat",enableCurrentButton);
      toolbar.enableButton("edit", enableMiscButtons);
      toolbar.enableButton("delete", enableMiscButtons);
      toolbar.enableButton("approve", enableMiscButtons);
      toolbar.enableButton("decline", enableMiscButtons);
      toolbar.enableButton("cut", enableMiscButtons);
      toolbar.enableButton("copy", enableMiscButtons);
      toolbar.enableButton("paste", PasteButton);
      toolbar.enableButton("move_up", enableMiscButtons);
      toolbar.enableButton("move_down", enableMiscButtons);
    }
 }
 
 function tabChanged()
 {
       if (activeTab)
       {
         //alert('now active: '+activeTab.id)
       }
 
 //      toggleMenu();
 }
 
 function getTabTitle(tabId)
 {
    var tab = document.getElementById(tabId);
    if (!tab) return;
    return tab.getAttribute("tabTitle");
 }
 
 function isAnyChecked(tabId)
 {
 	//return theMainScript.Grids[tabId].CountSelected() > 0;
    return tabSelection[tabId] > 0;
 }
 
 
 function initTabsForAnimation()
 { 
    var iniTop = 0;
 
    for (var i = 0; i < tabIDs.length; i++)
    {
       var tab = document.getElementById(tabIDs[i]);
       if (!tab) continue;
       tab.oHeight = tab.offsetHeight;
       tab.style.top = -iniTop;
       iniTop += tab.offsetHeight;
       tab.pTop = -1;
 
    }
    for (var i = 0; i < tabIDs.length; i++)
    {
       var tab = document.getElementById(tabIDs[i]);
       if (!tab) continue;
       tab.style.top = tab.pTop - tab.offsetHeight;
       tab.pY = -tab.offsetHeight;
       tab.style.visibility = "inherit";
       tab.style.display = "none";
    }
 
 }
\ No newline at end of file

Property changes on: trunk/admin/browse/checkboxes_new.js
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.2
\ No newline at end of property
+1.3
\ No newline at end of property