Index: trunk/kernel/include/parseditem.php
===================================================================
--- trunk/kernel/include/parseditem.php	(revision 3906)
+++ trunk/kernel/include/parseditem.php	(revision 3907)
@@ -1,3117 +1,3137 @@
 <?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())
 	{
 		global $objSession;
 		
 		if (isset($attribs['_tz'])) {
 			$timezone = $attribs['_tz'] == 'auto' ? null : $objSession->Get('tz');
 			$d = GetLocalTime($d, $timezone);
 		}
 		
 		$part = isset($attribs['_part']) ? strtolower($attribs['_part']) : '';
 		if ($part) {
 			$ret = ExtractDatePart($part,$d);
 		}
 		else {
 			$ret = $d <= 0 ? '' : 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 'primarycategorylink':
 					$m_var_list_update['cat'] = (int)$this->GetPrimaryCategory();
 	                $m_var_list_update['p'] = 1;
 	                $ret = str_replace('advanced_view.php','browse.php',$_SERVER['PHP_SELF']).'?env='.BuildEnv();
 	                unset($m_var_list_update['cat']);
 	                unset($m_var_list_update['p']);
 	                return $ret;
             		break;
             	
             	case 'primarycategory':
 					$db =& GetADODBConnection();
             		$sql = 'SELECT CachedNavbar FROM '.$objCatList->SourceTable.' WHERE CategoryId = '.(int)$this->GetPrimaryCategory();
             		$ret = prompt_language($objConfig->Get("Root_Name"));
             		if( $this->GetPrimaryCategory() ) $ret .= '>'.$db->GetOne($sql); 
             		break;
             	
             	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->GetAttributeByName('_separator');
                       }
                     }
                     break;
                 }
             break;
             case "reviews":
                 $today = FALSE;
                 
                 if(method_exists($this,"ReviewCount"))
                 {                
                 	if($element->GetAttributeByName("_today"))
                       $today = TRUE;                      
     	            $ret = $this->ReviewCount($today);
        	          	$ret = ($element->GetAttributeByName("_dataexists") && empty($ret))? "" : $ret; 
                 }
                 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->GetAttributeByName('_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"];
                   $listvalue =  $element->attributes["_listvalue"];
                   $default = $element->attributes["_default"];
                   if (strlen($field))
                   	$ret = $this->GetCustomFieldValue($field, $default, $listvalue);
             	}
             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;
             case 'perm':
             	$cat_id = $this->GetPrimaryCategory();
             	$element->attributes['_category'] = $cat_id;
             	$ret = m_perm_text($element->attributes);
             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;
 		
       //echo 'Saving ID'.$this->UniqueId().' in Main parseTempalate<br>';
       //$GLOBALS[$this->TagPrefix.'_ID'] = $this->UniqueId();
       LogEntry("Parsing $tname\n");
       $LogLevel++;
       $html = "";
       $t = $objTemplate->GetTemplate($tname);
       //$t = $this->Parser->GetTemplate($tname);
       if( is_array($this->Parser->stack) ) $this->Parser->stack = Array();
       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;
     
     // enshure that same sql won't be queried twice
     var $QueryDone = false;
     var $LastQuerySQL = '';
     
+    
+	/**
+	 * Application object
+	 *
+	 * @var kApplication
+	 */
+	var $Application = null;
+	
+	/**
+	 * Connection to database
+	 *
+	 * @var kDBConnection
+	 */
+	var $Conn = 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="";
+    	if (class_exists('kApplication')) {
+			// just in case when aplication is not found
+	  		$this->Application =& kApplication::Instance();      
+	  		$this->Conn =& $this->Application->GetADODBConnection();
+		}
+		
+		$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);
               $n->Set( $n->IdField(), $ID ); // in case if no loaded set ID anyway
               $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)
     {
     	if( !is_array($Field) ) $Field = Array($Field);
     	if( !is_array($Value) ) $Value = Array($Value);
 
     	$found = false;
     	if( is_array($this->Items) )
     	{
     		foreach($this->Items as $i)
     		{
     			$sub_found = true;
     			foreach($Field as $key_index => $field_name)
     			{
     				$sub_found = $sub_found && ( $i->Get($field_name) == $Value[$key_index] );
     			}
 
     			if($sub_found)
     			{
     				$found = true;
     				break;
     			}
     		}
     	}
 
     	if( !$found && $LoadFromDB == true )
     	{
     		$sql = 'SELECT * FROM '.$this->SourceTable.' WHERE ';
     		foreach($Field as $key_index => $field_name)
     		{
     			$sql .= '(`'.$field_name.'` = '.$this->adodbConnection->qstr($Value[$key_index]).') AND ';
     		}
     		$sql = preg_replace('/(.*) AND $/', '\\1', $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, $objConfig;        
 		//echo "Method QItem [<b>".get_class($this).'</b>], sql: ['.$sql.']<br>';
         $dummy =& $this->GetDummy();
        	if( !$dummy->TableExists() )
        	{
        		if($this->debuglevel) echo "ERROR: table <b>".$dummy->tablename."</b> missing.<br>";
        		$this->Clear();
        	 	return false;
        	}
        	//echo "<b>".get_class($this)."</b><br>";
        	//echo "Rows = $rows && Offset = $offset<br>";
         if($rows>-1 && $offset>-1)
         {
         	//print_pre(debug_backtrace());
 	       	//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");
             if($this->debuglevel) {
             	echo '<br><br>'.$sql.'<br><br>';
             	echo "Error: ".$this->adodbConnection->ErrorMsg()."<br>";            	
             }
             $this->Clear();
             return false;
         }
        
         $this->Clear();
 
         if($this->debuglevel > 0)
         {
         	 echo "This SQL: $sql<br><br>";
         	 if( ($this->debuglevel > 1) && ($result->RecordCount() > 0) )
         	 {
         	 	echo '<pre>'.print_r($result->GetRows(), true).'</pre>';
         	 	$result->MoveFirst();
         	 }
        	}
 		//echo "SQL: $sql<br><br>";
         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");
 		$result->Free();
         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);
         //echo $insert."<br>";
     }
 
     function CopyFromEditTable($idfield = null)
     {
         global $objSession;
 		$GLOBALS['_CopyFromEditTable']=1;
 
 		$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 "In Main <b>CopyFromEditTable</b> in class <b>".get_class($this).'</b><br>';
         //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();
             }
             $item_ids[]=$c->UniqueId(); // save item id for future use
           	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"),true);
             	}
 			}
             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);
 				}    	
             }           			
             
 			$GLOBALS['_CopyFromEditTable']=1;
             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();
         }
         
         $objReviews = new clsItemReviewList();
         $objReviews->PurgeEditTable();
         
         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"));
 		unset($GLOBALS['_CopyFromEditTable']);
 		
 		return $item_ids;
     }
 	
 	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->GetEditTable("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 RefreshPage($page_var, $total_items)
     {
     	global $objConfig, $objSession;
     	
     	$this->QueryItemCount = $total_items;
     	
     	if ( (int)GetVar('lpn') > 0)
     	{
     		$this->Page = $_GET['lpn'];
     	}
     	elseif ($objConfig->Get($page_var))
     	{
     		$this->Page = $objConfig->Get($page_var);
     	}
     	
     	if ( ($this->Page > $this->GetNumPages($this->PerPage) || $this->Page == 0) && ($this->PerPage != -1) )
       	{
       		$this->Page = 1; 
     	}
     	
     	$objSession->SetVariable($page_var, $this->Page);
     }
     
     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);
 
 		// remove empty elements
       	$SearchListTmp=Array();
       	for($f = 0; $f < count($SearchList); $f++)
 			if($SearchList[$f])
 				$SearchListTmp[]=$SearchList[$f];
 		$SearchList=$SearchListTmp;
 
       	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, $DetectCategories = false)
     {
         global $objCatList;
         
         $l =& $this->GetItem($Id);
         $l->BasePermission=$this->BasePermission;
         
         if (!$DetectCategories) {
         	$l->DeleteCategoryItems($objCatList->CurrentCategoryID());    	
         }
         else {
         	$l->RemoveFromAllCategories();
         	$l->Delete();
         }
     }
     
     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;
 	
 	var $LastLimitClause = '';	// used to store last limit cluse used in query
 	
 	function setPageFromENV()
 	{
 		$this->Page=$GLOBALS[$this->PageEnvar][$this->PageEnvarIndex];
 	}
 	
 	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, '.$this->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;
 			//echo "Got PerPage: ".$this->GetPerPage()."<br>";
 			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);
     		
     		// specially made for cats delete
 			if ( GetVar('Action', true) != 'm_cat_delete') {
     			return parent::Query_Item($sql,$this->GetPageOffset(),$this->GetPageRowCount());    			
 			}
 			else {				
 				return parent::Query_Item($sql);
 			}
     	}
     }  	
 
     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()
 	{ 
 		//echo "Getting Per Page ".get_class($this)."<br>";
 		// return category perpage
 		global $objConfig;
 		$PerPage = $objConfig->Get( $this->PerPageVar );
       	if( !is_numeric($PerPage) ) $PerPage = $this->DefaultPerPage ? $this->DefaultPerPage : 10;
       	//print_pre(debug_backtrace());
       	//echo "Returning: $PerPage<br>";
 		return $PerPage;
 	}
 	
 	/**
 	 * Returns current page from env var
 	 *
 	 * @return int
 	 */
 	function getEnvPage()
 	{
 		$var_name = preg_replace('/(.*)_update$/', '\\1', $this->PageEnvar);
 		return $GLOBALS[$var_name]['p'];
 	}
 	
 	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->getEnvPage() ) $fix_method = 'set_current';
 		
       	if( ($this->Page > $NumPages || $this->Page == 0) && $PerPage != -1)
       	{
       		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;
       			case 'set_current':
       				$this->Page = $this->getEnvPage();
       				//echo "Move 2 Page reflected in env (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,$EnvSuffix = '', $extra_attributes = '')
     {
     	global $objConfig, $var_list_update, $var_list;
 
     	$url_params = $EnvSuffix ? ExtractParams($EnvSuffix) : Array();
       
         $v= $this->PageEnvar;
                      
         global ${$v};        
         
 //        if(!strlen($page)) $page = GetIndexURL(2);
 
         $PerPage = $objConfig->Get($this->PerPageVar);
         if($PerPage < 1) $PerPage = 20;
         $NumPages = ceil( $this->GetNumPages($PerPage) );
         if($NumPages == 1 && $HideEmpty) return '';
         
 		$var_list_update['t'] = isset($dest_template) && $dest_template ? $dest_template : $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 = HREF_Wrapper('', $url_params);
           $o .= '<a href="'.$prev_url.'" '.$extra_attributes.'>&lt;&lt;</a>';
         }
 
         for($p = $StartPage; $p <= $EndPage; $p++)
         {
             if($p != $this->Page)
             {
                 ${$v}[$this->PageEnvarIndex] = $p;
                 $href = HREF_Wrapper('', $url_params);
                 $o .= ' <a href="'.$href.'"'.$extra_attributes.'>'.$p.'</a> ';
             }
             else
             {
                 $o .= ' <span class="current-page">'.$p.'</span>';
             }
         }
         if($EndPage < $NumPages && $EndPage > 0)
         {
           ${$v}[$this->PageEnvarIndex] = $this->Page + $PagesToList;
 
           $next_url = HREF_Wrapper('', $url_params);
           $o .= '<a href="'.$next_url.'"'.$extra_attributes.'> &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
 		
         $page_backup = $update[$this->PageEnvarIndex];
         
         // 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>';
         }
         $update[$this->PageEnvarIndex] = $page_backup;
         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);
   					//echo "FieldVar: $FieldVar<br>";
   					if(strlen($FieldVarData)>0)
   					{
   						$Orders[] = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ".
   						$objSession->GetPersistantVariable($OrderVar));
   					}
   				}
   			}
   		}
 
   		if(count($Orders)>0)
   		{
   			$OrderBy = "ORDER BY ".implode(", ",$Orders);
   		}
   		else
   		$OrderBy="";
   		//echo "ORDER BY: $OrderBy<br>";
   		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) AND ($t.Status=1)";
      	}
      	else
      	  $sql .=") AND ($t.Status=1)";
      }
      else
        $sql .="WHERE ($CatTable.CategoryId=".$cat." AND $t.Status=1) ";  	
     
       if($attribs["_today"])
       {
         $today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_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;
 	
 	  	$where = '';
 	  	$p = $this->BasePermission.'.VIEW';
 	  	$t = $this->SourceTable;
 	  	if( getArrayValue($attribs,'_today') )
 	  	{
 	  		$today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y"));
 	  		$where = "($t.CreatedOn>=$today)";
 	  	}
      
      	$GroupList = getArrayValue($attribs,'_grouponly') ? $objSession->Get('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)getArrayValue($attribs,'_today'), 3600);
   	  if(!is_numeric($cc))
   	  {  	
   	  	$sql = $this->SqlGlobalCount($attribs);
   	  	$ret = QueryCount($sql);
   	  	$objCountCache->SetValue($this->CacheListType("_"),$this->ItemType,$this->CacheListExtraId("_"),(int)getArrayValue($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;
   }
   
   
   /**
    * Return all listype (from tags) to id mappings
    *
    * @return Array
    * @access private
    */
   function GetListTypes()
   {
   	return Array('_' => 0, 'category' => 1, 'myitems' => 2, 'hot' => 3, 'pop' => 4, 'pick' => 5, 'favorites' => 6, 'new' => 8);
   }
   
   function CacheListType($ListType)
   {
   	if(empty($ListType))
   		$ListType='_';
   		
   	$mapping = $this->GetListTypes();
   	
   	return $mapping[$ListType];
   }  
 
   function PerformItemCount($attribs=array())
   {
   	global $objCountCache, $objSession;
   	       
   	$ret = "";
   	$sql = "";
   	$ListType = getArrayValue($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(!empty($sql) && $ListType != "_")
   	{
   		if(is_numeric($ListTypeId) && $ListTypeId)
   		{
   		  $cc = $objCountCache->GetValue($ListTypeId,$this->ItemType,$ExtraId,(int)getArrayValue($attribs,'_today'), 3600);
   		  
   	   	  if(!is_numeric($cc) || $attribs['_nocache'] == 1)
   		  {
   			$ret = QueryCount($sql);
   			$objCountCache->SetValue($ListTypeId,$this->ItemType,$ExtraId,(int)getArrayValue($attribs,'_today'),$ret);
   		  }
   		  else
   	  		$ret = $cc;
   		}
   		else
   		  $ret = QueryCount($sql);
   	}
   	  
   	return $ret;  
   }
   
   function GetJoinedSQL($PermName, $CatId=NULL, $AdditionalWhere="", $LoadOnlyPrimary = true)
   {
   	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) ";
     
     // here will come checking for PrimaryCat on search
     if ($LoadOnlyPrimary) {
     	$sql .="WHERE ($acl AND  PermId=$VIEW AND PrimaryCat=1 AND $CategoryTable.Status=1) ";
     }
     else {
     	$sql .="WHERE ($acl AND  PermId=$VIEW AND $CategoryTable.Status=1) ";
     }
     
     if(is_numeric($CatId) && $CatId > 0)
     {
     	$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 = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_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 = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_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, $objConfig;
 		
 		$sql = $this->SqlFavorites($attribs);
     	    
 	    if($objSession->HasSystemPermission("DEBUG.LIST"))
               echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
         if($attribs["_shortlist"])
         {
             if ($objConfig->Get($this->PerPageShortVar) > 0) {
         		$this->PerPageVar = $this->PerPageShortVar; 
             }
             else {
             	$this->PerPageVar = $this->PerPageVarLong;
             }
         }
         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)getArrayValue($attribs,'_catid');
        $scope = (int)getArrayValue($attribs,'_scope');
 	   //$JoinCats = (int)$attribs["_catinfo"] || $scope;	  
           	          
    	   $TableName = $this->SourceTable;
        if($scope)
        {
             if (!$catid) 
             {
                $catid = $objCatList->CurrentCategoryID();
             }                                            
             $where =  GetTablePrefix()."CategoryItems.CategoryId =".$catid." AND ".$TableName.".EditorsPick=1 AND ".$TableName.".Status=1";
        }
        else
        {
             $where = $TableName.".EditorsPick=1 AND ".$TableName.".Status=1 ";
             $catid=NULL;
        }
        if(getArrayValue($attribs,'_today'))
        {
    	  		$today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_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; 
 	    
        //echo "SQL: $sql<br>";     
        
        return $sql;
     }    	
     
     function LoadPickItems($attribs)
     {
        global $objSession, $objCountCache, $objConfig;
        
        $sql = $this->SqlPickItems($attribs);     
        if($objSession->HasSystemPermission("DEBUG.LIST"))
             echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
             
         if($attribs["_shortlist"])
         { 
             if ($objConfig->Get($this->PerPageShortVar) > 0) {
         		$this->PerPageVar = $this->PerPageShortVar; 
             }
             else {
             	$this->PerPageVar = $this->PerPageVarLong;
             }
         }
         else 
           $this->PerPageVar = $this->PerPageVarLong;
                       
        $CachedCount = $objCountCache->GetValue($this->CacheListType("pick"),$this->ItemType,$this->CacheListExtraId("pick"),(int)getArrayValue($attribs,'_today'),3600);            
        if(!is_numeric($CachedCount))
        {
  	     $this->QueryItemCount= QueryCount($sql);
          $objCountCache->SetValue($this->CacheListType("pick"),$this->ItemType,$this->CacheListExtraId("pick"),(int)getArrayValue($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(getArrayValue($attribs,'_today'))
         {
    	  		$today = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_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,null,$where); // maybe null should be replaced by some CategoryId
  	        	    
         $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"])
         {
             if ($objConfig->Get($this->PerPageShortVar) > 0) {
         		$this->PerPageVar = $this->PerPageShortVar; 
             }
             else {
             	$this->PerPageVar = $this->PerPageVarLong;
             }
         }
         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)getArrayValue($attribs,'_catid');
        $scope = (int)getArrayValue($attribs,'_scope');
        $show_since_last = (int)getArrayValue($attribs,'_show_since_last');
 	   //$JoinCats = (int)$attribs["_catinfo"] || $scope;	  	  
        //echo "Last: $scope<br><br>";
    	   $TableName = $this->SourceTable;
 	   if(getArrayValue($attribs,'_today'))
        {
    	  		$cutoff = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_date("Y")); 
        }
        else
        {
        	  if($scope)
        	  {
             if (!$catid) 
             {
                $catid = $objCatList->CurrentCategoryID();
             } 
             if (!$show_since_last) {
          		$cutoff = $this->GetNewValue($catid);
             }
             else {            	
             	$cutoff = $scope;
             }
        	  }
        	  else
        	    $cutoff = $this->GetNewValue();
        }
        if($scope)
        {
             if (!$catid) 
             {
                $catid = $objCatList->CurrentCategoryID();
             }           	  	                                        
             
             if (!$show_since_last) {
             	$where =  "CategoryId =".$catid." AND ((".$TableName.".CreatedOn >=".$cutoff." AND ".$TableName.".NewItem != 0) OR ".$TableName.".NewItem=1 ) AND ".$TableName.".Status=1 ";            
             }
             else {
             	$where =  $TableName.".CreatedOn >=".$cutoff." 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,$catid,$where);
  	   
        $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE);
        $sql .= " ".$OrderBy;  
        //echo "SQL: $sql<br><br>";       
        return $sql;
     }
 
     function LoadNewItems($attribs)
     {
 		global $objSession,$objCountCache,$objConfig;
 		
 		$sql = $this->SqlNewItems($attribs);
 		
         if($objSession->HasSystemPermission("DEBUG.LIST"))
               echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
         if( getArrayValue($attribs,'_shortlist') )
         {
             if ($objConfig->Get($this->PerPageShortVar) > 0) {
         		$this->PerPageVar = $this->PerPageShortVar; 
             }
             else {
             	$this->PerPageVar = $this->PerPageVarLong;
             }
         }
         else 
           $this->PerPageVar = $this->PerPageVarLong;
                         
        $CachedCount = $objCountCache->GetValue($this->CacheListType("new"),$this->ItemType,$this->CacheListExtraId("new"),(int)getArrayValue($attribs,'_today'),3600);            
        if(!is_numeric($CachedCount))
        {
  	     $this->QueryItemCount= QueryCount($sql);
          $objCountCache->SetValue($this->CacheListType("new"),$this->ItemType,$this->CacheListExtraId("new"),(int)getArrayValue($attribs,'_today'),$this->QueryItemCount);
        }
        else
          $this->QueryItemCount=$CachedCount;    
          
        $ret = $this->Query_Item($sql);
        return $ret;  	   
     }    
 
     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 = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_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"])
         {
             if ($objConfig->Get($this->PerPageShortVar) > 0) {
         		$this->PerPageVar = $this->PerPageShortVar; 
             }
             else {
             	$this->PerPageVar = $this->PerPageVarLong;
             }
         }
         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 = adodb_mktime(0,0,0,adodb_date("m"),adodb_date("d"),adodb_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"])
         {
             if ($objConfig->Get($this->PerPageShortVar) > 0) {
         		$this->PerPageVar = $this->PerPageShortVar; 
             }
             else {
             	$this->PerPageVar = $this->PerPageVarLong;
             }
         }
         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";
         
         $load_multiple = $objConfig->Get("Search_ShowMultiple_".$attribs['multiple']);
         $LoadOnlyPrimary = true;
         
         if ($load_multiple == 1) {
         	$LoadOnlyPrimary = false;
         }
         
         $sql .= $this->GetJoinedSQL($p,NULL,$where, $LoadOnlyPrimary);              
         $tmp = $this->QueryOrderByClause(FALSE,TRUE,TRUE);        
         //echo "TMP: $tmp<br>";
         //$tmp = substr($tmp,9);
         if(strlen($tmp))
         {
         	$sql .= $tmp.", ";
         }        
         
         $sql .= " EdPick DESC,Relevance DESC ";        
         //echo "SQL Search Items: $sql<br><br>";
 		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;
         }
                 
     }
     
     /**
      * Updates count cache for selected ids in list
      *
      * @param Array $item_ids
      * @access protected
      */
     function FlushCache($item_ids)
     {
     	$db =& GetADODBConnection();
     	if(is_array($item_ids)) $item_ids=implode(',',$item_ids);
     	
     	$sql = 'SELECT ResourceId FROM '.$this->SourceTable.' WHERE '.$this->GetIDField().' IN ('.$item_ids.')';
     	$resource_ids=$db->GetCol($sql);
     	$sql='SELECT CategoryId FROM '.GetTablePrefix().'CategoryItems WHERE ItemResourceId IN ('.implode(',',$resource_ids).')';
     	$cat_ids=$db->GetCol($sql);
     	UpdateCategoryCount($this->ItemType, $cat_ids, $this->GetListTypes());
     }
     
     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, $this->GetListTypes() );
               
               }
           }
       }
     }
     
     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;
 	}
 }
 
 
 ?>
\ No newline at end of file

Property changes on: trunk/kernel/include/parseditem.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.86
\ No newline at end of property
+1.87
\ No newline at end of property
Index: trunk/kernel/include/portaluser.php
===================================================================
--- trunk/kernel/include/portaluser.php	(revision 3906)
+++ trunk/kernel/include/portaluser.php	(revision 3907)
@@ -1,1126 +1,1134 @@
 <?php
 
 RegisterPrefix("clsPortalUser","user","kernel/include/portaluser.php");
 
 class clsPortalUser extends clsItem  
 {
     var $Vars;               //contains the PersistantSessionData for the user
     var $VarsLoaded;        
     var $PrimeGroup;
 
     function clsPortalUser($UserId=NULL)
     {
  //     $this->clsParsedItem();
         $this->clsItem();
         $this->tablename=GetTablePrefix()."PortalUser";
         $this->type=6;
         $this->BasePermission="USER";
         $this->id_field = "PortalUserId";
         $this->TagPrefix="user";
 
         $this->Vars = Array();
         $this->VarsLoaded = FALSE;
         $this->debuglevel = 0;
         if(isset($UserId))
             $this->LoadFromDatabase($UserId);
     }
 
     function Create()
     {
 		$ret = parent::Create();
 		if ($ret && $this->isLiveTable())
 		{
 			$application =& kApplication::Instance();
 			$sync_manager =& $application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 			$sync_manager->performAction('createUser', $this->Data);
 		}
 		return $ret;
     }
     
     function Update($UpdatedBy = null, $modificationDate = null)
 	{
 		$ret = parent::Update($UpdatedBy, $modificationDate);
 		if ($ret && $this->isLiveTable())
 		{
 			$application =& kApplication::Instance();
 			$sync_manager =& $application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 			$sync_manager->performAction('updateUser', $this->Data);
 		}
 		return $ret;
 	}
     
     function Delete()
     {
         global $objGroups, $objFavorites;
         
         $g = $objGroups->GetPersonalGroup($this->Get("Login"));
         if (is_object($g)) $g->Delete();
             
         $objFavorites->DeleteUser($this->Get("PortalUserId")); //delete favorites
         $ret = parent::Delete();
         
         if($ret && $this->isLiveTable())
         {
         	$application =& kApplication::Instance();
 			$sync_manager =& $application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 			$sync_manager->performAction('deleteUser', $this->Data);
         }
         
         return $ret;
     }
 
     function RemoveFromAllGroups()
     {
         $sql = "DELETE FROM ".GetTablePrefix()."UserGroup WHERE PortaluserId=".$this->Get("PortalUserId");
         $this->adodbConnection->Execute($sql);	
     }   
     
     function RemoveFromGroup($GroupId)
     {
         $sql = "DELETE FROM ".GetTablePrefix()."UserGroup WHERE PortaluserId=".$this->Get("PortalUserId");
         $sql .= " AND GroupId=$GroupId";
         $this->adodbConnection->Execute($sql);	      	
     }
     
     function PrimaryGroup($ReturnField = "GroupId")
     {
       global $objGroups;
 
       $ret = "";
 
       if(!is_object($this->PrimeGroup))
       {
          if((int)$this->Get("GroupId")>0)
          {
              $this->PrimeGroup =& $objGroups->GetItem($this->Get("GroupId"));
          }
          else
          {                  
              $this->PrimeGroup = new clsPortalGroup();
              $sql = "SELECT * FROM ".GetTablePrefix()."UserGroup INNER JOIN ".GetTablePrefix()."PortalGroup ON (".GetTablePrefix()."UserGroup.GroupId=".GetTablePrefix()."PortalGroup.GroupId) WHERE PrimaryGroup = 1 AND PortalUserId=".$this->Get("PortalUserId");
              //echo $sql;
              $rs = $this->adodbConnection->Execute($sql);
 
              if($rs && !$rs->EOF)
                  $this->PrimeGroup->SetFromArray($rs->fields);
          }
       }
       $ret = $this->PrimeGroup->Get($ReturnField);
       return $ret;
     }
     
     function SetPrimaryGroup($GroupId)
     {
       if($this->IsInGroup($GroupId))
       {
       	$sql = "UPDATE ".GetTablePrefix()."UserGroup SET PrimaryGroup=0 WHERE PortalUserId=".$this->Get("PortalUserId");
       	$this->adodbConnection->Execute($sql);
       	$sql = "UPDATE ".GetTablePrefix()."UserGroup SET PrimaryGroup=1 WHERE GroupId=$GroupId AND PortalUserId=".$this->Get("PortalUserId");
       	$this->adodbConnection->Execute($sql);
       }
     }
 
     function GetGroupList()
     {
         $ret = array();
         $sql = "SELECT GroupId FROM %sUserGroup WHERE PortalUserId = %s ORDER BY PrimaryGroup";
         $sql = sprintf($sql, GetTablePrefix(), $this->Get("PortalUserId"));
         $ret = $this->adodbConnection->GetCol($sql);
         return $ret;
     }
     
     function IsInGroup($GroupId)
     {
       $groups = $this->GetGroupList();
       if( $groups === false ) return false;
       return in_array($GroupId, $groups) ? true : false;
     }
 	
 	function GetPersonalGroup($CreateIfMissing = FALSE)
 	{
 	  global $objGroups;
 
 	  $n = "_".$this->Get("Login");
 	  $g = $objGroups->GetItemByField("Name",$n);
 	  if(!is_object($g) && $CreateIfMissing)
 	    $g = $this->CreatePersonalGroup();
 	  return $g;
 	}
 
     function CreatePersonalGroup()
     {
         global $objGroups;
 
         $Description = $this->Get("FirstName")." ".$this->Get("LastName");
         $CreatedOn = adodb_mktime();
 		$n = "_".$this->Get("Login");
         $g = $objGroups->Add_Group($n, $Description, $CreatedOn, 1, 0);
 		$g->Set("Personal",1);
 		$g->Set("System",0);
 		$g->Set("Enabled",1);
 		$g->Update();
         if(is_object($g))
           $g->AddUser($this->Get("PortalUserId"));
         return $g;
     }
 
     function Validate()
     {
         global $Errors;
 
         $dataValid = true;
         if(!strlen($this->Get("Login")))
         {
             $Errors->AddError("error.fieldIsRequired",'Login',"","",get_class($this),"Validate");
             $dataValid = false;
         }
                 
         if(!strlen($this->Get("Email")))
         {
             $Errors->AddError("error.fieldIsRequired",'Email',"","",get_class($this),"Validate");
             $dataValid = false;
         }
         
 		return $dataValid;
     }
 
 	function Approve()
 	{
 	  $this->Set("Status", 1);
 	  $this->Update();
       $this->SendUserEventMail("USER.APPROVE",$this->Get("PortalUserId"));
       $this->SendAdminEventMail("USER.APPROVE");
 	}
 
     function Deny($IsBanned = 0)
     {
         $this->Set( Array('Status','IsBanned'), Array(0,$IsBanned) );
         $this->Update();
         $this->SendUserEventMail("USER.DENY",$this->Get("PortalUserId"));
         $this->SendAdminEventMail("USER.DENY");
     }
 
 	function HasSystemPermission($PermissionName)
     {
 	    global $objGroups;
 
 		  $GroupList = $this->GetGroupList();		  
   	      for($i=0;$i<count($GroupList);$i++)
 		  {
                $g = $objGroups->GetItem($GroupList[$i]);
                $value = $g->HasSystemPermission($PermissionName);
 		       if($value != -1)
                  break;
 		  }
 		return $value;
     }
   
     function LoadPersistantVars()
     {
     	global $objConfig;
 
     	unset($this->Vars);
         $this->Vars = Array();
         $user_id = $this->HasField('PortalUserId') ? $this->Get('PortalUserId') : 0;
         
         $sql = "SELECT VariableName, VariableValue FROM ".GetTablePrefix()."PersistantSessionData WHERE PortalUserId = ".(int)$user_id." ORDER BY PortalUserId ASC";
         $result = $this->adodbConnection->Execute($sql);
         while ($result && !$result->EOF)
         {
           $data = $result->fields;
           $this->Vars[$data["VariableName"]] =  $data["VariableValue"];
           
           if( basename($_SERVER['PHP_SELF']) != 'edit_config.php' )
           {
           	$objConfig->Set($data["VariableName"], $data["VariableValue"], 1, 1);
           }
           $result->MoveNext();
         }
         $this->VarsLoaded = TRUE;
     }
 	
     function SetPersistantVariable($variableName, $variableValue)
 	{
 	  global $objConfig;
 
       if(!$this->VarsLoaded)
           $this->LoadPersistantVars();
 	  $userid = $this->Get("PortalUserId");  
       $objConfig->Set($variableName,$variableValue,1);
       $fields = array_keys($this->Vars);
           
       if(strlen($variableValue)>0)
       {                 
           if(in_array($variableName,$fields))
           {
               $sql = "UPDATE ".GetTablePrefix()."PersistantSessionData SET VariableValue='$variableValue' WHERE VariableName='$variableName' AND PortalUserId=$userid";
           }
           else
               $sql = "INSERT INTO ".GetTablePrefix()."PersistantSessionData (VariableName,VariableValue,PortalUserId) VALUES ('$variableName','$variableValue',$userid)";
       }
       else
         $sql = "DELETE FROM ".GetTablePrefix()."PersistantSessionData  WHERE VariableName='$variableName' AND PortalUserId=$userid"; 
       
       $this->Vars[$variableName] = $variableValue;
       
 //      echo "<BR>SQL: $sql<BR>";
       
       $this->adodbConnection->Execute($sql);
 	}
 
 	function GetPersistantVariable($variableName)
 	{
         global $objConfig, $objSession;
           
         if(!$this->VarsLoaded)
         {
             $this->LoadPersistantVars();
         }
 
         $fields = array_keys($this->Vars);
                 
         if(in_array($variableName,$fields))
         {
             $val = $this->Vars[$variableName];
         }
         else
         {
           	if( $this->UniqueId() == $objSession->Get('PortalUserId') )
           	{
         		$val =  $objConfig->Get($variableName);
           	}
           	else
           	{
           		$val = '';
           	}
         }
         
         return $val;
 	}    
 
     function GetAllPersistantVars()
     {
         if(!$this->VarsLoaded)
         {
             $this->LoadPersistantVars();
         }
         return $this->Vars;
     }
 
 	function GetIcon()
 	{	
 	}
 
     function StatusIcon()
     {
         global $imagesURL;
 
         $url = $imagesURL."/itemicons/icon16_user";
         if($this->Get("Status")==0)
         {
             $url .= "_disabled";
         }
         else
           if($this->Get("Status")==2)
           {        
             $url .= "_pending";
           }
         $url .= ".gif";
         return $url;
     }
 
     function IsFriend($UserId)
     {
         $ftable = GetTablePrefix()."Favorites";
         $sql = "SELECT count(*) as FriendCount FROM $ftable WHERE PortalUserId=$UserId AND ResourceId=";
         $sql .=$this->Get("ResourceId")." AND ItemTypeId=6";
         $rs = $this->adodbConnection->Execute($sql);
         if($rs && !$rs->EOF)
             return ($rs->fields["FriendCount"]>0);
         return FALSE;
     }
 
     function GetUserTime($timestamp)
     {
         if(is_numeric($this->Get("tz")))
         {
             return GetLocalTime($timestamp,$this->Get("tz"));
         }
         else
             return GetLocalTime($timestamp);
     }
 
     function ParseObject($element)
     { 
         global $objConfig, $objUsers, $objCatList,$objSession, $var_list_update, $var_list, $m_var_list_update;
         //echo "<PRE>"; print_r($element); echo "</pre>";
         //echo "Tag Prefix: ".$this->TagPrefix." Element: ".$element->name."<br>";
         $this->clsPortalUser();
         if (strtolower($element->name) == 'touser') {
         	$this->TagPrefix = "touser";
         }
         
         $extra_attribs = ExtraAttributes($element->attributes);
         if(strtolower($element->name)==$this->TagPrefix)
         {   
             $field = strtolower($element->attributes["_field"]); 
             if(substr($field,0,3)=="pp_")
             {
                 $perm = $objSession->GetPersistantVariable($field);
                 if($perm)
                 {                
                     $field = substr($field,3);
                 }
                 else
                     $field = "";
             }
             switch($field)
             {     
             	/*
             	@field:user.login
             	@description:User's login name
             	*/
             case "username":
             case "login":
                 $ret = $this->Get("Login");
             break;
 			case "firstname":
 				$ret = $this->Get("FirstName");
 			break;
 			case "lastname":
 				$ret = $this->Get("LastName");
 			break;            
             case "password":
             	/*
             	@field:user.password            
             	@description:User password
             	*/
                 /*$ret = $objSession->Get("password");
                 $objSession->Set("password", '');*/
                 $ret = GetVar('user_password');
             break;
 			case "email":
 			  $ret = $this->Get("Email");
 			break;  
 			case "street":
 			  $ret = $this->Get("Street");
 			break;
 			case "city":
 			  $ret = $this->Get("City");
 			break;
 			case "state":
 			  $ret = $this->Get("State");
 			break;
 			case "zip":
 			  $ret = $this->Get("Zip");
 			break;
 			case "phone":
 			  $ret = $this->Get("Phone");
 			break;      
 			case "country":
 			  $ret = $this->Get("Country");
 			break;
             case "primarygroup":
               /*
               @field:user.primarygroup
               @description:Parses a field from the user's primary group
               @attrib:_groupfield::group field name to parse, defaults to group name
               */
               $groupfield = $element->attributes["_groupfield"];
               if(!strlen($groupfield))
                   $groupfield="Name";
               $ret = $this->PrimaryGroup($groupfield);
             break;
             case "date":    
             	/*
   				@field:user.date
   				@description:Returns the date/time the user was created
   				@attrib:_tz:bool:Convert the date to the user's local time
   				@attrib:_part::Returns part of the date.  The following options are available: month,day,year,time_24hr,time_12hr
             	*/                            
                 $d = $this->Get("CreatedOn");
                 if($element->attributes["_tz"])
                 {
                     $d = GetLocalTime($d,$objSession->Get("tz"));
                 }
 
                 $part = strtolower($element->attributes["_part"]);
                 if(strlen($part))
                 {
                     $ret = ExtractDatePart($part,$d);
                 }
                 else
                 {                
                   if($d<=0)
                   {                  
                     $ret = "";
                   }
                   else
                     $ret = LangDate($d);
                 }
             break;  
             case "dob":
             	/*
   				@field:user.dob
   				@description:Returns the date/time of the users date of birth
   				@attrib:_tz:bool:Convert the date to the user's local time
   				@attrib:_part::Returns part of the date.  The following options are available: month,day,year,time_24hr,time_12hr
             	*/                
                 $d = $this->Get("dob");
                 if($element->attributes["_tz"])
                 {
                     $d = GetLocalTime($d,$objSession->Get("tz"));
                 }
                 $part = strtolower($element->attributes["_part"]);
                 if(strlen($part))
                 {
                     $ret = ExtractDatePart($part,$d);
                 }
                 else
                 {                
 //                  if($d<=0)
 //                  {                  
 //                    $ret = "";
 //                  }
 //                  else
                     $ret = LangDate($d);
                 }
             break;  
 
             case "modified":
             	/*
   				@field:user.modified
   				@description:Returns the date/time the user was last modified
   				@attrib:_tz:bool:Convert the date to the user's local time
   				@attrib:_part::Returns part of the date.  The following options are available: month,day,year,time_24hr,time_12hr
             	*/                
                 $d = $this->Get("Modified");
                 if($d<=0)
                     $d = $this->Get("CreatedOn");
 
                 if($element->GetAttributeByName('_tz'))
                 {
                     $d = GetLocalTime($d,$objSession->Get("tz"));
                 }
                 
                 $part = strtolower($element->GetAttributeByName('_part'));                 
                 if(strlen($part))
                 {
                      $ret = ExtractDatePart($part,$d);
                 }
                 else
                 {                
                    if($d<=0)
                    {                  
                      $ret = "";
                    }
                    else
                      $ret = LangDate($d);
                 }
             break;
             
             case 'send_pm_link':
             	$var_list_update['t'] = $element->GetAttributeByName('_Template');
             	$ret = HREF_Wrapper('', Array('ToUser' => $this->Get('Login') ) );
             	break;
             	
             case "profile_link":
             	/*
             	@field:user.profile_link
             	@description:Create a link to the user's profile
             	@attrib:_template:tpl:template the link should point to
             	*/
                 $t = $element->attributes["_template"];
                 if(strlen($t))
                 {                
                     $var_list_update["t"] = $t;
                 }
                 else
                 {
                     $var_list_update["t"] = $var_list["t"];
                 }
                 $ret = HREF_Wrapper('', Array('UserId' => $this->Get('PortalUserId') ) );
             break;
             case "add_friend_link":
                 /*
                 @field:user.add_friend_link
                 @description:link to add a user to the friends list
                 @attrib:_template:tpl:Template link shoukd point to
 				*/
                 if($element->attributes["_force"] || !$this->IsFriend($objSession->Get("PortalUserId")) && 
                    $this->Get("PortalUserId") != $objSession->Get("PortalUserId"))
                 {                
                     $t = $element->attributes["_template"];
                     if(strlen($t))
                     {                
                         $var_list_update["t"] = $t;
                     }
                     else
                     {
                         $var_list_update["t"] = $var_list["t"];
                     }
                     $ret = HREF_Wrapper('', Array('Action' => 'm_add_friend', 'UserId' => $this->Get('PortalUserId') ) );
                 }
                 else
                     $ret = "";
             break;
             case "del_friend_link":
                 /*
                 @field:user.del_friend_link
                 @description:link to remove a user from the friends list
                 @attrib:_template:tpl:Template link shoukd point to
 				*/            
                 if($element->attributes["_force"] || $this->IsFriend($objSession->Get("PortalUserId")) && 
                    $this->Get("PortalUserId") != $objSession->Get("PortalUserId"))
                 {                
                   $t = $element->attributes["_template"];
                   if(strlen($t))
                   {                
                     $var_list_update["t"] = $t;
                   }
                   else
                   {
                     $var_list_update["t"] = $var_list["t"];
                   }
                   $ret = HREF_Wrapper('', Array('Action' => 'm_del_friend', 'UserId' => $this->Get('PortalUserId') ) );
                 }
                 else
                     $ret = "";
             break;
             case "icon":
                 $ret = $this->GetIcon();
             break;    
             case "image":
             	/*
  				@field:user.image
  				@description:Return an image associated with the user
   				@attrib:_default:bool:If true, will return the default image if the requested image does not exist
   				@attrib:_name::Return the image with this name
   				@attrib:_thumbnail:bool:If true, return the thumbnail version of the image
   				@attrib:_imagetag:bool:If true, returns a complete image tag. exta html attributes are passed to the image tag
                */    
                $avatar = $element->attributes["_avatar"];         
                $default = $element->attributes["_primary"];
                $name = $element->attributes["_name"];
                if ($avatar) 
                {
                		$img = $this->GetAvatarImage();
                }
                elseif(strlen($name))
                {
                    $img = $this->GetImageByName($name);
                   // echo "<PRE>";print_r($img); echo "</PRE>";
                }
                elseif ($default) 
            	   {
                  	$img = $this->GetDefaultImage();
            	   }
                
                if($img)
                {
                    if($element->attributes["_thumbnail"])
                    {                        
                      $url = $img->parsetag("thumb_url");
                    }
                    else
                      $url = $img->parsetag("image_url");                   
                }
                else
                {
                   $url = $element->attributes["_defaulturl"];
                }
 
                if($element->attributes["_imagetag"])
                {
                    if(strlen($url))
                    {                        
                      $ret = "<IMG src=\"$url\" $extra_attribs >";
                    }
                    else
                        $ret = "";
                }
                else
                    $ret = $url;
             break;
 
             case "custom":                
                 /*
                 @field:cat.custom
                 @description:Returns a custom field
   				@attrib:_customfield::field name to return
   				@attrib:_default::default value
   				*/             
                 $field =  $element->attributes["_customfield"]; 
                 $default = $element->attributes["
                 "];
                 $ret = $this->GetPersistantVariable($field);
                 if(!strlen($ret))
                     $ret = $this->GetCustomFieldValue($field,$default);
             break;
             default:
             	$ret = "Undefined:".$element->name;
             	break;            
             }
         }
         else
         {
             $ret = $this->parsetag($element->name);        
         }
         
         return $ret;
     }
 
     function parsetag($tag)
     {	
         global $m_var_list_update, $var_list_update, $var_list, $objConfig;
         if(is_object($tag))
         {        
             $tagname = $tag->name;
         }
         else
             $tagname = $tag;            
             
         switch($tagname)
         {	
 		case "user_id":
             return $this->Get("ResourceId");
             break;
 		case "user_login":
 			return $this->Get("Login");
 			break;
         case "user_group":
             return $this->Get("PrimaryGroupName");
             break;
 		case "user_firstname":
 			return $this->Get("FirstName");
 			break;
 		case "user_lastname":
 			return $this->Get("LastName");
 			break;
 		case "user_email":
 			return $this->Get("Email");
 			break;
         case "user_date":
 			return LangDate($this->Get("CreatedOn"));
 			break;
         case "user_time":
 			return LangTime($this->Get("CreatedOn"));
 			break;
         case "user_dob":
 			return LangDate($this->Get("dob"));
 			break;
 
 		case "user_password":
 			return $this->Get("Password");
 			break;
 		case "user_phone":
 			return $this->Get("Phone");
 			break;	
 		case "user_street":
 			return $this->Get("Street");
 			break;	
 		case "user_city":
 			return $this->Get("City");
 			break;	
 		case "user_state":
 			return $this->Get("State");
 			break;	
 		case "user_zip":
 			return $this->Get("Zip");
 			break;	
 		case "user_country":
 			return $this->Get("Country");
 			break;
 		case "user_resourceid":
 			return $this->Get("ResourceId");
 			break;	
 		case "user_icon":
 			return $this->GetIcon();
 		break;
 		case "user_profile_link":
 			$var_list_update["t"] = "user_profile";
 			$m_var_list_update["action"] = $this->Get("UserId");
 			$ret = HREF_Wrapper();
 			unset($m_var_list_update["action"], $var_list_update["t"]);
 			return $ret;
 			break;
         case "user_messages":
             return $this->NewMessages();
             break;
         case "user_messages_link":
 			$var_list_update["t"] = "inbulletin/bb_private_msg_list";
 			return HREF_Wrapper();
 			unset($var_list_update);
 			break;
 		default:
 				return "Undefined:$tagname";
 			break;
         }
     }    
 
 } /* class clsPortalUser*/
 
 
 class clsUserManager extends clsItemList //clsItemCollection
 {
 	/*this class wraps common user-related functions */
    // var $Page;
 
 	function clsUserManager()
 	{
       $this->clsItemCollection(); // clsItemList() // need to use this, but double limit clause being created (normal+default 0,100)
       $this->classname = "clsPortalUser";
       $this->SetTable('live', GetTablePrefix().'PortalUser');
 	  $this->Page = isset($_GET['lpn']) ? $_GET['lpn'] : 1;
 	  $this->EnablePaging = true;
   	  $this->PerPageVar = "Perpage_User";      
       $this->AdminSearchFields = array("Login","FirstName","LastName","Email","Street","City", "State","Zip","Country","Phone");
 	}
 
     function GetPageLinkList($dest_template=NULL,$link_template=NULL,$page = "")
     {
         global $objConfig, $m_var_list_update, $var_list_update, $var_list;
 
 //        if(!strlen($page)) $page = GetIndexURL(2);
         $NumPages = $this->GetNumPages($objConfig->Get("Perpage_Topics"));
         if(strlen($dest_template)>0)
         {
             $var_list_update["t"]=$dest_template;
         }
         else
         {
             $var_list_update["t"] = $var_list["t"];            
         }
         $o = "";
         if($this->Page>1)
         {
           $m_var_list_update["p"]=$this->Page-1;
           $prev_url = HREF_Wrapper();
         }
         if($this->Page<$NumPages)
         {
           $m_var_list_update["p"]=$this->Page+1;
           $next_url = HREF_Wrapper();
         }
         
         for($p=1;$p<=$NumPages;$p++)
         {
             $t = template($link_template);
             if($p!=$this->Page)
             {
                 $m_var_list_update["p"]=$p;
                 $href = HREF_Wrapper();
                 $t = str_replace("<%page_link%>", $href, $t);
                 $t = str_replace("<%page_number%>",$p,$t);
                 $t = str_replace("<%prev_url%>",$prev_url,$t);
                 $t = str_replace("<%next_url%>",$next_url,$t);
                 $o .= $t;
             }
             else
             {
                 $o .= "<SPAN class=\"CURRENT_PAGE\">$p</SPAN>";
             }
         }
         return $o;
     }
 
 
     function GetUser($ID)
     {
         $u =  $this->GetItem($ID);
         return $u;
     }
 
  	function GetUserName($Id)
 	{
 	    $rs = $this->adodbConnection->Execute("SELECT Login from ".$this->SourceTable." where PortalUserId=$Id");
 		return $rs->fields["Login"];
 	}
 
 	function GetUserId($Login)
 	{
 	    $rs = $this->adodbConnection->Execute("SELECT PortalUserId from ".$this->SourceTable." where Login LIKE '$Login'");
 		return $rs->fields["PortalUserId"];
 	}
 
 
 	function GetTotalUsers()
 	{
 	  return $this->UserCount("1");
 	}
 
 
 	function GetLatestUser()
 	{
   	  global $Errors;
 
 	  $sql = "SELECT max(CreatedOn) as LastDate FROM ".$this->SourceTable;
 	  $result = $this->adodbConnection->Execute($sql);
 	  if ($result === false || !is_object($result))
           {
             $Errors->AddError("error.DatabaseError",NULL,$adodbConnection->ErrorMsg(),"",get_class($this),"GetLatestUser");
             return false;
           }
 	  $sql = "SELECT PortalUserId FROM ".$this->SourceTable." WHERE CreatedOn >= ".$result->fields["LastDate"];
 	  $result = $this->adodbConnection->Execute($sql);
 	  if (!rs || $rs->EOF)
           {
             $Errors->AddError("error.DatabaseError",NULL,$adodbConnection->ErrorMsg(),"",get_class($this),"GetLatestUser");
             return false;
           }
           $u = $this->GetUser($result->fields["PortalUserId"]);
 	  return $u;
 	}
 	
 	function &Add_User($Login, $Password, $Email, $CreatedOn, $FirstName="", $LastName="", $Status=2, 
                       $Phone="", $Street="", $City="", $State="", $Zip="", $Country="", $dob=0, $ip="", $CheckBanned=FALSE)
 	{
 		$u = new clsPortalUser(NULL);
 		$u->tablename = $this->SourceTable;
         //echo "Creating User..<br>\n";
 		$u->Set(array("Login", "Password", "FirstName", "LastName", "Email", "Status", 
                       "Phone","Street", "City", "State", "Zip", "Country", "CreatedOn","dob"), 
                 array($Login, $Password, $FirstName, $LastName, $Email, $Status,  
                       $Phone, $Street, $City, $State, $Zip, $Country, $CreatedOn, $dob));
 	    
 	    $BrokenRule = $CheckBanned ? $u->CheckBanned() : false;
 	    if(!$BrokenRule)	
 	    {	                 	     
 		  $u->Create();
   		  return $u;
 	    }
 		return $BrokenRule;	    
 		/*md5($Password)*/
 	}
 
 	function &Add_User_NEW($fields_hash, $check_banned = false)
 	{
 		$user = new clsPortalUser(NULL);
 		$user->tablename = $this->SourceTable;
 	    
 		foreach ($fields_hash as $field_name => $field_value) {
 			$user->Set($field_name, $field_value);
 		}
 		
 	    $broken_rule = $check_banned ? $user->CheckBanned() : false;
 	    if (!$BrokenRule) {
 		  $user->Create();
   		  return $user;
 	    }
 	    
 		return $BrokenRule;	    
 	}
 	
 	function &Edit_User_NEW($id, $fields_hash)
 	{        
 		$user =& $this->GetItem($id);
           
 		if (!is_object($user)) {
 			return $user;
 		}
 		
 		$fields_hash['IsBanned'] = $user->Get('IsBanned');
 		if ($fields_hash['Status'] == 1) {
 			$fields_hash['IsBanned'] = 0;
 		}
 
-		if (getArrayValue($fields_hash['Password'])) {
-			$user->Set('Password', $fields_hash['Password']); 
+		if (isset($fields_hash['Password']) && !$fields_hash['Password']) {
 			unset($fields_hash['Password']);
 		}
 		
 		foreach ($fields_hash as $field_name => $field_value) {
 			$user->Set($field_name, $field_value);
 		}
 		
 		$user->Update();
 		
         return $user;		
 	}
 	
 	function &Edit_User($UserId, $Login, $Password, $Email, $CreatedOn, $FirstName="", $LastName="",  
                        $Status=2, $Phone="", $Street="", $City="", $State="", $Zip="", $Country="", $dob=0, $MinPwResetDelay=300)
 	{        
 		//echo "<font color=\"red\">Editing User: [$UserId]</font><br>";
 		
 		$u =& $this->GetItem($UserId);
 		
         if(!$CreatedOn)
             $CreatedOn = $u->Get("CreatedOn");
         
 //        $u->debuglevel=1;  
           
 		if (is_object($u))
 		{
 			$IsBanned = $u->Get('IsBanned');
 			if($Status == 1) $IsBanned = 0;
 			$u->Set(array("Login", "FirstName", "LastName", "Email", "Status", 
                           "Phone",  "Street", "City", "State", "Zip", "Country", "CreatedOn","dob","IsBanned", "MinPwResetDelay"), 
                     array($Login, $FirstName, $LastName, $Email, $Status, 
                           $Phone, $Street, $City, $State, $Zip, $Country, $CreatedOn,$dob,$IsBanned,$MinPwResetDelay));
 			if(strlen($Password))
 			  $u->Set("Password",$Password);   
 			$u->Update();
 		}
         return $u;		
 	}
 
 	function Delete_User($UserId)
 	{
 		$u = $this->GetItemByField("ResourceId",$UserId);
 		if(is_object($u))
 		{
 		  $u->RemoveFromAllGroups();	
 		  $u->Delete();
 		}
 	}
 
 
     function LoadUsers($where = "",$orderBy = "")
     {
         global $objConfig;
 
         $this->Clear();
         if($this->Page<1)
             $this->Page=1;
 
         if(is_numeric($objConfig->Get("Perpage_Users")))
         {
             $Start = ($this->Page-1)*$objConfig->Get("Perpage_Users");
             $limit = "LIMIT ".$Start.",".$objConfig->Get("Perpage_Users");
         }
         else
             $limit = NULL;
 
         $where = trim($where);
         $orderBy = trim($orderBy);
         if(!strlen($where))
             $where = "1";
 
         $this->QueryItemCount=TableCount($this->SourceTable,$where,0);
 
         if($this->QueryItemCount>0)
         {
             if ($orderBy!="")
             {
                 $this->Query_PortalUser($where,$orderBy,$limit);
             }
             else
             {
                 $this->Query_PortalUser($where,"Login DESC",$limit);
             }
         }
     }
 
     function Query_PortalUser($whereClause,$orderByClause="", $limitClause="")
     {
         global $m_var_list,$Errors, $objSession;
 
         $resultSet = array();
 
         $utable = $this->SourceTable;
         $gtable = GetTablePrefix()."UserGroup";
         $sql = "SELECT * FROM $utable LEFT JOIN $gtable ON ($utable.PortalUserId=$gtable.PortalUserId)";
         
         if(isset($whereClause))
             $sql = sprintf('%s WHERE %s',$sql,$whereClause);
 
         if(isset($orderByClause))
           if(strlen(trim($orderByClause))>0)
             $sql = sprintf('%s ORDER BY %s',$sql,$orderByClause);
 
         if(isset($limitClause))
             $sql = sprintf('%s %s',$sql,$limitClause);
         
         return $this->Query_Item($sql);
     }
 
     function Query_GroupPortalUser($whereClause,$orderByClause)
     {
         global $m_var_list,$objSession,$Errors;
 
         $resultSet = array();
 
 
         $table = $this->SourceTable;
         $sql = "SELECT * FROM $table LEFT JOIN ".GetTablePrefix()."UserGroup USING (PortalUserId) ";
 
         if(isset($whereClause))
             $sql = sprintf('%s WHERE %s',$sql,$whereClause);
 
         if(isset($orderByClause))
             $sql = sprintf('%s ORDER BY %s',$sql,$orderByClause);
 	
         return $this->query_item($sql);
     }
 
     function UserCount($whereClause)
     {
         $count = TableCount($this->SourceTable,$whereClause,0);
         return $count;
     }
 
     function CountActive()
     {
         return $this->UserCount("Status=1");
     }
 
     function CountPending()
     {
         return $this->UserCount("Status=2");
     }
     
     function CountDisabled()
     {
         return $this->UserCount("Status=0");
     }
     
     function CopyFromEditTable($idfield)
     {
         global $objSession;
 		$GLOBALS['_CopyFromEditTable']=1;
 
         $edit_table = $objSession->GetEditTable($this->SourceTable);        
         $sql = "SELECT * FROM $edit_table";
         $rs = $this->adodbConnection->Execute($sql);
+        $user_dummy =& $this->Application->recallObject('u.-item', null, Array('skip_autoload' => true));
         
-        //echo $sql."<BR>";
         $item_ids = Array();
-        while($rs && !$rs->EOF)
-        {
+        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();
-               $c->Create();
-               $sql = "UPDATE ".GetTablePrefix()."UserGroup SET PortalUserId=".$c->Get("PortalUserId");
-               $sql .=" WHERE PortalUserId=0";
-               $this->adodbConnection->Execute($sql);
+            $user_dummy->SetDBFieldsFromHash($data);
+            
+            if ($c->Get($idfield) < 1) {
+				$old_id = $c->Get($idfield);
+				$c->UnsetIdField();
+				$c->Create();
+				$sql = "UPDATE ".GetTablePrefix()."UserGroup SET PortalUserId=".$c->Get("PortalUserId");
+				$sql .=" WHERE PortalUserId=0";
+				$this->adodbConnection->Execute($sql);
+				$event_name = 'OnAfterItemCreate';
             }
-            else
-            {
-              $c->Update();
+            else {
+				$c->Update();
+				$event_name = 'OnAfterItemUpdate';
             }
+			$user_dummy->setID($c->UniqueId());
+			
+            // process after hooks: begin
+			$event = new kEvent('u.-item:'.$event_name);
+			$event->setEventParam('id', $user_dummy->GetID() );
+			$this->Application->HandleEvent($event);
+            // process after hooks: end
+            
             $item_ids[] = $c->UniqueId();
             
             unset($c);            
             $rs->MoveNext();
         }                
         @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");          
 		unset($GLOBALS['_CopyFromEditTable']);
 		return $item_ids;
     }
     
     function PurgeEditTable()
     {
     	parent::PurgeEditTable();
     	$sql = "DELETE FROM ".GetTablePrefix()."UserGroup WHERE PortalUserId=0";
     	$this->adodbConnection->Execute($sql);
     }    	
 } /*clsUserManager*/
 ?>

Property changes on: trunk/kernel/include/portaluser.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.32
\ No newline at end of property
+1.33
\ No newline at end of property
Index: trunk/kernel/include/itemdb.php
===================================================================
--- trunk/kernel/include/itemdb.php	(revision 3906)
+++ trunk/kernel/include/itemdb.php	(revision 3907)
@@ -1,640 +1,684 @@
 <?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;
-
-  var $SelectSQL = 'SELECT * FROM %s WHERE %s';
+	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;
+	
+	var $SelectSQL = 'SELECT * FROM %s WHERE %s';
+  
+	/**
+	 * Application object
+	 *
+	 * @var kApplication
+	 */
+	var $Application = null;
+	
+	/**
+	 * Connection to database
+	 *
+	 * @var kDBConnection
+	 */
+	var $Conn = null;
   
   function clsItemDB()
   {
-      $this->adodbConnection = &GetADODBConnection();
-      $this->tablename="";
-      $this->NoResourceId=0;  
-      $this->debuglevel=0;
+		if (class_exists('kApplication')) {
+			// just in case when aplication is not found
+	  		$this->Application =& kApplication::Instance();      
+	  		$this->Conn =& $this->Application->GetADODBConnection();
+		}
+		
+  		$this->adodbConnection = &GetADODBConnection();
+  		$this->tablename="";
+  		$this->NoResourceId=0;
+  		$this->debuglevel=0;
   }
   
   // ============================================================================================
   function GetFormatter($field)
   {
   	return $this->HasFormatter($field) ? $this->Formatters[$field] : false;
   }
   
   function isLiveTable()
   {
   	global $objSession;
   	return !preg_match('/'.GetTablePrefix().'ses_'.$objSession->GetSessionKey().'_edit_(.*)/', $this->tablename);
   }
 
   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();	  
       
       if( $this->UsingTempTable() ) $value = $this->UniqueId();
       
       $this->Set($var, $value);
   }
 
   function SetModified($UserId=NULL,$modificationDate=null)
   {
       global $objSession;
       
       $keys = array_keys($this->Data);
       if(in_array("Modified",$keys))
       {
           $this->Set("Modified", isset($modificationDate) ? $modificationDate : 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;	
 	}
 	
 	/**
 	 * Set's value(-s) of field(-s) specified.
 	 * Modifies HasChanges flag automatically.
 	 *
 	 * @param string/array $name
 	 * @param string/array $value
 	 * @access public
 	 */
 	function Set($name, $value)
 	{
 		//echo "Setting Field <b>$name</b>: = [$value]<br>";
 		if( is_array($name) )
 		{
 			for ($i=0; $i < sizeof($name); $i++)
 			{
 				$this->_Set($name[$i],$value[$i]);
 			}
 		}
 		else
 		{
 			$this->_Set($name,$value);
 		}
 	}
 	
 	
 	/**
 	 * Set's value(-s) of field(-s) specified.
 	 * Modifies HasChanges flag automatically.
 	 *
 	 * @param string $name
 	 * @param string $value
 	 * @access private
 	 */
 	function _Set($name,$value)
 	{
 		$var = 'm_'.$name;
 		if( !$this->HasField($name) || $this->Data[$name] != $value )
 		{
 			if( !(isset($_GET['new']) && $_GET['new']) ) {
 				$this->DetectChanges($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,$modificationDate = null)
 	{
   		global $Errors, $objSession;
 
+  		if( !$this->raiseEvent('OnBeforeItemUpdate') ) return false;
+  		
   		if( count($this->m_dirtyFieldsMap) == 0 ) return true;
 
   		$this->SetModified($UpdatedBy, $modificationDate);
   		$sql = 'UPDATE '.$this->tablename .' SET ';
 
   		foreach ($this->m_dirtyFieldsMap as $key => $value)
   		{
   			if(!is_numeric($key) && $key != $this->IdField() && $key!='ResourceId')
   			{
 				if( is_null($value) )
 				{
 					$value = 'NULL';	
 				}
 				else
 				{
 					$value = $this->adodbConnection->qstr( isset($GLOBALS['_CopyFromEditTable']) ? $value : stripslashes($value) );	
 				}
   				$sql .= '`'.$key.'` = '.$value.', ';
   			}
   		}
 		$sql = preg_replace('/(.*), $/','\\1',$sql);
   		
   		$sql .= ' WHERE '.$this->IdField().' = '.$this->adodbConnection->qstr( $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( $objSession->GetVariable('HasChanges') == 2 ) $objSession->SetVariable('HasChanges', 1);
+  		
+  		$this->raiseEvent('OnAfterItemUpdate');
+  		
 		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 IGNORE 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( is_array($value) )
      	{
      		global $debugger;
      		$debugger->dumpVars($value);
      		$debugger->appendTrace();
      		trigger_error('Value of array type not allowed in method <b>CreateSQL</b> of <b>clsItemDB</b> class', E_USER_ERROR);
      	}
      	if($first)
      	{
 			if(isset($GLOBALS['_CopyFromEditTable']))
 	     		$sql = sprintf("%s %s",$sql,$this->adodbConnection->qstr(($value)));
 	     	else
 	     		$sql = sprintf("%s %s",$sql,$this->adodbConnection->qstr(stripslashes($value)));
      		$first = 0;
      	}
      	else
      	{
 			if(isset($GLOBALS['_CopyFromEditTable']))
 	     		$sql = sprintf("%s, %s",$sql,$this->adodbConnection->qstr(($value)));
 	     	else
 	     		$sql = sprintf("%s, %s",$sql,$this->adodbConnection->qstr(stripslashes($value)));
      	}
      }
      $sql = sprintf('%s)',$sql);
      
   	return $sql;
   }
   
   /**
    * Set's HasChanges flag based on new field
    * with $name with value $value.
    *
    * @param string $name
    * @param string $value
    * @access private
    */
   function DetectChanges($name, $value)
   {  	
   	global $objSession;
   	if( !is_object($objSession) ) return false;
   	
   	//echo "<b>class: ".get_class($this)."</b><br>";
   	if (!isset($this->Data[$name]) ) return false;
   	
 	if ( getArrayValue($this->Data, $name) != $value && $value != '') {		
 		//echo "$name Modified tt ".$this->Data[$name]." tt $value<br>";
 		if ($objSession->GetVariable("HasChanges") != 1) {
 			$objSession->SetVariable("HasChanges", 2);		
 		}
 	}
   }
   
   function Create()
   {
   	global $Errors, $objSession;
-
+	
+  	if( !$this->raiseEvent('OnBeforeItemCreate') ) return false;
+  	
   	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 ($objSession->GetVariable("HasChanges") == 2)    {
   		$objSession->SetVariable("HasChanges", 1);
   	}
 
   	/*if ($this->adodbConnection->Affected_Rows() > 0) {
   	$objSession->SetVariable("HasChanges", 1);
   	}  */
 
+  	$this->raiseEvent('OnAfterItemCreate');
+  	
   	return true;
   }
 
   function Increment($field, $calculate_hot = false)
   {	    
       global $Errors;
       
       if ($calculate_hot) {
       	$sql = "SELECT $field FROM ".$this->tablename." WHERE ".$this->IdField()." = ".$this->UniqueId();
       	$rs = $this->adodbConnection->Execute($sql);
       	
       	$sql = "SELECT MAX($field) AS max_value FROM ".$this->tablename." WHERE ROUND($field) = ".round($rs->fields[$field]);
       	$rs = $this->adodbConnection->Execute($sql);
       	//echo "MAX VALUE: ".$rs->fields['max_value']."<br>";
       	//echo "MAX SQL: $sql<br>";
 		$new_val = $rs->fields['max_value'] + 1;
 		
 		$sql = "SELECT count($field) AS count FROM ".$this->tablename." WHERE $field = $new_val";
 	    $rsc = $this->adodbConnection->Execute($sql);		
 		
 		while ($rsc->fields['count'] != 0) {
 			$sql = "SELECT count($field) AS count FROM ".$this->tablename." WHERE $field = $new_val";
 	      	$rsc = $this->adodbConnection->Execute($sql);		
 	      	//echo "New Value:$new_val<br>";
 	      	if ($rsc->fields['count'] > 0) {
 	      		$new_val = $new_val + 0.000001;
 	      	}
 		}
       	
       	$sql = "Update ".$this->tablename." set $field=$new_val where ".$this->IdField()."=" . $this->UniqueId();
       }
 	  else {
       	$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;
       }
       
       if ($calculate_hot) {
       	$this->Set($field,$new_val);
       }
       else {
       	$this->Set($field, $this->Get($field) + 1);
       }
   }
 
   function Decrement($field)
   {	
       global $Errors;
 
       $sql = "Update ".$this->tablename." set $field=$field-1 where ".$this->IdField()."=" .(int)$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($this->SelectSQL, $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 =& GetADODBConnection();
     	$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;
-    }	
+    }
+    
+    function raiseEvent($name, $id = null)
+	{
+		return true;
+		
+		/*if (!getArrayValue($GLOBALS, '_CopyFromEditTable')) {
+			return true;
+		}
+		
+		if( !isset($id) ) $id = $this->GetID();
+		$event = new kEvent( Array('name'=>$name,'prefix'=>$this->Prefix,'special'=>$this->Special) );
+		$event->setEventParam('id', $id);
+		$this->Application->HandleEvent($event);
+		return $event->status == erSUCCESS ? true : false;*/
+	}
     	
 }
 ?>

Property changes on: trunk/kernel/include/itemdb.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.33
\ No newline at end of property
+1.34
\ No newline at end of property
Index: trunk/kernel/units/users/users_item.php
===================================================================
--- trunk/kernel/units/users/users_item.php	(revision 3906)
+++ trunk/kernel/units/users/users_item.php	(revision 3907)
@@ -1,234 +1,251 @@
 <?php
 	class UsersItem extends kDBItem {
 		
 		var $CustomFields = Array();
 		var $persistantVars = Array();
 		
 		function Init($prefix, $special, $event_params = null)
 		{
 			parent::Init($prefix, $special, $event_params);
 			
 			$item_type = $this->Application->getUnitOption($this->Prefix, 'ItemType');
 			$sql = 'SELECT CustomFieldId, FieldName FROM '.TABLE_PREFIX.'CustomField WHERE Type = %s';
 			$this->CustomFields = $this->Conn->GetCol( sprintf($sql, $item_type), 'FieldName' );
 		}
 		
 		
 		function defineFields()
 		{
 			parent::defineFields();
 			
 			// add custom fields definitions (as virtual fields)
 			$add_fields = Array();
 			$custom_field_options = Array('default' => '', 'not_null' => 1);
 			foreach ($this->CustomFields as $custom_field => $custom_id)
 			{
 				$add_fields[$custom_field] = $custom_field_options;
 			}
 			
 			if($add_fields)
 			{
 				$add_fields = array_merge_recursive2($add_fields, $this->VirtualFields);
 				$this->setVirtualFields($add_fields);
 			}
 		}
 	
 		/**
 		 * Load custom fields values as virtual fields for dbitem
 		 *
 		 * @return bool
 		 */
 		function LoadCustomFields()
 		{
 			if (!$this->CustomFields) return false;
 			
 			$custom_ids = implode(',', $this->CustomFields);
 			$sql = 'SELECT Value, CustomFieldId
 					FROM '.TABLE_PREFIX.'CustomMetaData 
 					WHERE ResourceId = '.$this->GetDBField('ResourceId').' AND CustomFieldId IN ('.$custom_ids.')';
 			$custom_values = $this->Conn->GetCol($sql, 'CustomFieldId');
 			if (!$custom_values) return false;
 			
 			$custom_fields = array_flip($this->CustomFields);
 			foreach ($custom_values as $custom_id => $custom_value)
 			{
 				$this->SetDBField($custom_fields[$custom_id], $custom_value);
 			}
 			return true;
 		}
 		
 		function LoadPersistantVars()
 		{
 			$sql = 'SELECT VariableValue, VariableName
 					FROM '.TABLE_PREFIX.'PersistantSessionData
 					WHERE PortalUserId = '.$this->GetID();
 			$this->persistantVars = $this->Conn->GetCol($sql, 'VariableName');
 		}
 		
 		function setPersistantVar($var_name, $var_value)
 		{
 			$this->persistantVars[$var_name] = $var_value;
 			
 			$replace_hash = Array(	'PortalUserId'	=>	$this->GetID(),
 									'VariableName'	=>	$var_name,
 									'VariableValue'	=>	$var_value
 							);
 			$this->Conn->doInsert($replace_hash, TABLE_PREFIX.'PersistantSessionData', 'REPLACE');
 		}
 		
 		function getPersistantVar($var_name)
 		{
 			return getArrayValue($this->persistantVars, $var_name);
 		}
 		
 		function UpdateCustomFields()
 		{
 			$data_table = TABLE_PREFIX.'CustomMetaData';
 			
 			// get values already written, to find their ids
 			$sql = 'SELECT CustomDataId, CustomFieldId
 					FROM '.$data_table.'
 					WHERE ResourceId = '.$this->GetDBField('ResourceId');
 			$custom_value_ids = $this->Conn->GetCol($sql, 'CustomFieldId');
 			$sql = 'REPLACE INTO '.$data_table.'(CustomDataId,ResourceId,CustomFieldId,Value) VALUES (%1$s,%2$s,%3$s,%4$s)';
 			
 			foreach ($this->CustomFields as $custom_field => $custom_id)
 			{
 				$data_id =  isset($custom_value_ids[$custom_id]) ? $custom_value_ids[$custom_id] : 0;
 				$custom_value = $this->GetDBField($custom_field);
 				
 				if (!$custom_value && $data_id)
 				{
 					$temp_sql = 'DELETE FROM '.$data_table.' WHERE CustomDataId = '.$data_id;
 					$this->Conn->Query($temp_sql);	
 				}
 				elseif($custom_value)
 				{
 					$temp_sql = sprintf($sql, $data_id, $this->GetDBField('ResourceId'), $custom_id, $this->Conn->qstr( $this->GetDBField($custom_field) ) );
 					$this->Conn->Query($temp_sql);	
 				}
 			}
 		}
 		
 		function Load($id, $id_field_name = null)
 		{
 			$ret = parent::Load($id, $id_field_name);
 			if($ret)
 			{
 				$this->LoadCustomFields();
 				$this->LoadPersistantVars();
 			}
 			return $ret;
 		}
 		
 		/**
 		 * Returns IDs of groups to which user belongs and membership is not expired
 		 *
 		 * @return Array
 		 * @access public
 		 */
 		function getMembershipGroups($force_reload = false)
 		{
 			$user_groups = $this->Application->RecallVar('UserGroups');
 			if($user_groups === false || $force_reload)
 			{
 				$sql = 'SELECT GroupId FROM %s WHERE (PortalUserId = %s) AND ( (MembershipExpires IS NULL) OR ( MembershipExpires >= UNIX_TIMESTAMP() ) )';
 				$sql = sprintf($sql, TABLE_PREFIX.'UserGroup', $this->GetID() );
 				return $this->Conn->GetCol($sql);
 			}
 			else
 			{
 				return explode(',', $user_groups);
 			}
 		}
 		
 		/**
 		 * Set's Login from Email if required by configuration settings
 		 *
 		 */
 		function setLogin()
 		{
 			if( $this->Application->ConfigValue('Email_As_Login') )
 			{
 				$this->SetDBField('Login', $this->GetDBField('Email') );	
 			}
 		}
 		
 		function SendEmailEvents()
 		{
 			switch( $this->GetDBField('Status') )
 			{
 				case 1:
 					$this->Application->EmailEventAdmin('USER.ADD', $this->GetID() );
 					$this->Application->EmailEventUser('USER.ADD', $this->GetID() );
 					break;
 					
 				case 2:
 					$this->Application->EmailEventAdmin('USER.ADD.PENDING', $this->GetID() );
 					$this->Application->EmailEventUser('USER.ADD.PENDING', $this->GetID() );
 					break;
 			}
 		}
 		
 		function isSubscriberOnly()
 		{
 			$subscribers_group_id = $this->Application->ConfigValue('User_SubscriberGroup');
 			$sql = 'SELECT PortalUserId
 					FROM '.TABLE_PREFIX.'UserGroup
 					WHERE 	GroupId = '.$subscribers_group_id.' AND 
 							PortalUserId = '.$this->GetDBField('PortalUserId').' AND 
 							PrimaryGroup = 1';
 			return $this->Conn->GetOne($sql) == $this->GetDBField('PortalUserId');
 		}
 		
 		function Create($force_id=false, $system_create=false)
 		{
 			$ret = parent::Create($force_id, $system_create);
 			if ($ret)
 			{
 				$this->UpdateCustomFields();
 				
 				// find out how to syncronize user only when it's copied to live table
 				$sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 				$sync_manager->performAction('createUser', $this->FieldValues);
 			}
 			return $ret;
 		}
 		
 		
 		function Update($id=null, $system_update=false)
 		{
 			$ret = parent::Update($id, $system_update);
 			if ($ret)
 			{
 				$this->UpdateCustomFields();
 				
 				// find out how to syncronize user only when it's copied to live table
 				$sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 				$sync_manager->performAction('updateUser', $this->FieldValues);
 			}
 			return $ret;
 		}
 		
 		/**
 		* Deletes the record from databse
 		*
 		* @access public
 		* @return bool
 		*/
 		function Delete($id = null)
 		{
 			$ret = parent::Delete($id);
 			
 			if ($ret)
 			{
 				$sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 				$sync_manager->performAction('deleteUser', $this->FieldValues);
 			}
 			
 			return $ret;
 		}
 		
+		function setName($full_name)
+		{
+			$full_name = explode(' ', $full_name);
+			
+			if (count($full_name) > 2) {
+				$last_name = array_pop($full_name);
+				$first_name = implode(' ', $full_name);
+			}
+			else {
+				$last_name = $full_name[1];
+				$first_name = $full_name[0];
+			}
+			
+			$this->SetDBField('FirstName', $first_name);
+			$this->SetDBField('LastName', $last_name);
+		}
+		
 	
 	}
 ?>
\ No newline at end of file

Property changes on: trunk/kernel/units/users/users_item.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.7
\ No newline at end of property
+1.8
\ No newline at end of property
Index: trunk/kernel/units/users/users_config.php
===================================================================
--- trunk/kernel/units/users/users_config.php	(revision 3906)
+++ trunk/kernel/units/users/users_config.php	(revision 3907)
@@ -1,116 +1,119 @@
 <?php
 
 $config	=	Array(
 					'Prefix'			=>	'u',
 					'ItemClass'			=>	Array('class'=>'UsersItem','file'=>'users_item.php','build_event'=>'OnItemBuild'),
 					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
 					'EventHandlerClass'	=>	Array('class'=>'UsersEventHandler','file'=>'users_event_handler.php','build_event'=>'OnBuild'),
 					'TagProcessorClass' =>	Array('class'=>'UsersTagProcessor','file'=>'users_tag_processor.php','build_event'=>'OnBuild'),
 					'RegisterClasses'	=>	Array(
 												Array('pseudo' => 'UsersSyncronizeManager', 'class' => 'UsersSyncronizeManager', 'file' => 'users_syncronize.php', 'build_event' => ''),
 											),
 
 					'AutoLoad'			=>	true,
 					'Hooks'				=>	Array(
 												Array(
 													'Mode' => hAFTER,
 													'Conditional' => false,
 													'HookToPrefix' => 'u',
 													'HookToSpecial' => '',
 													'HookToEvent' => Array('OnAfterItemLoad', 'OnBeforeItemCreate', 'OnBeforeItemUpdate', 'OnUpdateAddress'),
 													'DoPrefix' => '',
 													'DoSpecial' => '',
 													'DoEvent' => 'OnPrepareStates',
 												),
 
 												Array(
 														'Mode' => hBEFORE,
 														'Conditional' => false,
 														'HookToPrefix' => 'affil',
 														'HookToSpecial' => '',
 														'HookToEvent' => Array('OnCheckAffiliateAgreement'),
 														'DoPrefix' => '',
 														'DoSpecial' => '',
 														'DoEvent' => 'OnSubstituteSubscriber',
 													),
 
 											),
 
 					'QueryString'		=>	Array(
 												1	=>	'id',
 												2	=>	'page',
 												3	=>	'event',
 											),
 
 					'RegularEvents'		=>	Array(
 													'membership_expiration' =>	Array('EventName' => 'OnCheckExpiredMembership', 'RunInterval' => 1800, 'Type' => reAFTER),
 											),
 
 					'IDField' 			=>	'PortalUserId',
 					'ItemType'			=>	6,	// used for custom fields only (on user's case)
 					'TableName'			=>	TABLE_PREFIX.'PortalUser',
 
 					'ListSQLs'			=>	Array(	''=>'SELECT * FROM %s',
 																		), // key - special, value - list select sql
 					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
 																		),
 					'ListSortings'	=> 	Array(
 																'' => Array(
 																	'Sorting' => Array('Login' => 'asc'),
 																)
 															),
 
 					'SubItems'		=> Array('addr'),
 
 					'Fields' => Array
 							    (
 							        'PortalUserId' => Array(),
 							        'Login' => Array('type' => 'string', 'unique'=>Array('Login'), 'default' => '','required'=>1, 'error_msgs' => Array('unique'=>'!lu_user_already_exist!')),
 							        'Password' => Array('type' => 'string', 'formatter' => 'kPasswordFormatter', 'encryption_method' => 'md5', 'verify_field' => 'VerifyPassword', 'skip_empty' => 1, 'default' => md5('') ),
 							        'FirstName' => Array('type' => 'string','default' => ''),
 							        'LastName' => Array('type' => 'string','default' => ''),
+							        'Company' => Array('type' => 'string','not_null' => '1','default' => ''),
 							        'Email' => Array('type' => 'string', 'formatter'=>'kFormatter', 'regexp'=>'/^[_a-zA-Z0-9-\.]+@[a-zA-Z0-9-\.]+\.[a-z]{2,4}$/', 'unique'=>Array('Email'), 'not_null' => '1', 'required'=>1, 'default' => '', 'error_msgs' => Array('invalid_format'=>'!la_invalid_email!', 'unique'=>'!lu_email_already_exist!') ),
 							        'CreatedOn' => Array('type'=>'int', 'formatter' => 'kDateFormatter', 'default' => '#NOW#', 'not_null' => '1' ),
 							        'Phone' => Array('type' => 'string','default' => ''),
+							        'Fax' => Array('type' => 'string','not_null' => '1','default' => ''),
 							        'Street' => Array('type' => 'string','default' => ''),
+							        'Street2' => Array('type' => 'string', 'not_null' => '1', 'default' => ''),
 							        'City' => Array('type' => 'string','default' => ''),
 							        'State' => Array('formatter'=>'kOptionsFormatter',
 							            							'options' => Array(),
 												            		'option_key_field'=>'DestAbbr','option_title_field'=>'Translation',
 												            		'not_null' => '1','default' => ''),
 							        'Zip' => Array('type' => 'string','default' => ''),
 							        'Country' => Array('formatter'=>'kOptionsFormatter',
 							            				'options_sql'=>'SELECT %1$s
 																				FROM '.TABLE_PREFIX.'StdDestinations
 																				LEFT JOIN '.TABLE_PREFIX.'Phrase
 																					ON '.TABLE_PREFIX.'Phrase.Phrase = '.TABLE_PREFIX.'StdDestinations.DestName
 																				WHERE
 																					DestType=1
 																					AND
 																					LanguageId = %2$s
 																				ORDER BY Translation',
 												            		'option_key_field'=>'DestAbbr','option_title_field'=>'Translation',
 												           'not_null' => '1','default' => ''),
 							        'ResourceId' => Array('type' => 'int','not_null' => '1','default' => '0'),
 							        'Status' => Array('type' => 'int', 'formatter'=>'kOptionsFormatter', 'options'=>Array(1=>'la_Enabled', 0=>'la_Disabled', 2=>'la_Pending'), 'use_phrases'=>1, 'not_null' => '1','default' => 2),
 							        'Modified' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'not_null' => '1', 'default' => '#NOW#' ),
 							        'dob' => Array('type'=>'int', 'formatter' => 'kDateFormatter', 'not_null' => '1', 'default' => '', 'required'=>1),
 							        'tz' => Array('type' => 'int','default' => ''),
 							        'ip' => Array('type' => 'string','default' => ''),
 							        'IsBanned' => Array('type' => 'int','not_null' => '1','default' => '0'),
 							        'PassResetTime' => Array('type' => 'int','default' => ''),
 							        'PwResetConfirm' => Array('type' => 'string','default' => ''),
 							        'PwRequestTime' => Array('type' => 'int','default' => ''),
 							        'MinPwResetDelay' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array('300' => '5', '600' => '10', '900' => '15', '1800' => '30', '3600' => '60'), 'use_phrases' => 0, 'not_null' => '1',  'default' => 30),
 							    ),
 
 					'VirtualFields'	=> 	Array(
 											'ValidateLogin' => Array('type'=>'string','default'=>''),
 											'SubscribeEmail' => Array('type'=>'string','default'=>''),
 										),
 
 					'Grids'	=> Array(),
 
 	);
 
 ?>
\ No newline at end of file

Property changes on: trunk/kernel/units/users/users_config.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.11
\ No newline at end of property
+1.12
\ No newline at end of property
Index: trunk/admin/include/mainscript.php
===================================================================
--- trunk/admin/include/mainscript.php	(revision 3906)
+++ trunk/admin/include/mainscript.php	(revision 3907)
@@ -1,574 +1,581 @@
 <?php
 global $imagesURL,$objConfig,$adminURL,$rootURL, $en;
 
 $group_select = $adminURL."/users/group_select.php";
 $item_select = $adminURL."/relation_select.php";
 $user_select = $adminURL."/users/user_select.php";
 $cat_select = $adminURL."/cat_select.php";
 $missing_edit = $adminURL."/config/missing_label_search.php";
 
 $lang_Filter = language("la_Text_Filter");
 $lang_View = language("la_Text_View");
 $lang_Sort = language("la_Text_Sort");
 $lang_Select = language("la_Text_Select");
 $lang_Unselect = language("la_Text_Unselect");
 $lang_Invert = language("la_Text_Invert");
 $lang_PerPage = language("la_prompt_PerPage");
 $lang_All = language("la_Text_All");
 $lang_Asc = language("la_common_ascending");
 $lang_Desc = language("la_common_descending");
 $lang_Disabled = language("la_Text_Disabled");
 $lang_Enabled = language("la_Text_Enabled");
 $lang_Pending = language("la_Text_Pending");
 $lang_Default = language("la_Text_Default");
 $lang_CreatedOn = language("la_prompt_CreatedOn");
 $lang_None = language("la_Text_None");
 $lang_PerPage = language("la_prompt_PerPage");
 $lang_Views = language("la_Text_Views");
 $lang_URL = language("la_ColHeader_Url");
 $lang_Status = language("la_prompt_Status");
 $lang_Name = language("la_prompt_Name");
 $lang_MoveDn = language("la_prompt_MoveDown");
 $lang_MoveUp = language("la_prompt_MoveUp");
 $lang_Delete = language("la_prompt_Delete");
 $lang_Edit = language("la_prompt_Edit");
 $errormsg = language("la_validation_AlertMsg");
 
 $env2 = BuildEnv();
 if(is_numeric($en))
 {
 	$env2 =  BuildEnv() . "&en=$en";
 }
   
 $editor_url = $adminURL."/editor/editor.php?env=$env2";
 $email_url = $adminURL."/email/sendmail.php?env=$env2";
 $phrase_edit = $adminURL."/config/edit_label.php?env=".$env2;
 $submit_done  = isset($_REQUEST['submit_done']) ? 1 : 0; // returns form submit status
 
 $Cal = GetDateFormat();
 if(strpos($Cal,"y"))
 {
   $Cal = str_replace("y","yy",$Cal);
 }
 else
   $Cal = str_replace("Y","y",$Cal);
 
 
 $Cal = str_replace("m","mm",$Cal);
 $Cal = str_replace("n","m",$Cal);
 $Cal = str_replace("d","dd",$Cal); 
 
 $format = GetStdFormat(GetDateFormat());
  
 $yearpos =  (int)DateFieldOrder($format,"year");
 $monthpos = (int)DateFieldOrder($format,"month");
 $daypos = (int)DateFieldOrder($format,"day");
 
 $ampm =  is12HourMode() ? 'true' : 'false';
 
+$processable_formats = Array('m/d/y', 'm/d/Y');
+
+$skip_date_validation = in_array(GetDateFormat(), $processable_formats) ? 'false' : 'true';
 $SiteName = addslashes( strip_tags( $GLOBALS['objConfig']->Get('Site_Name') ) );
 
 require_once($pathtoroot.$admin."/lv/js/js_lang.php");
 print <<<END
 <script type="text/javascript" src="$adminURL/lv/js/in-portal.js"></script>
 <script language="Javascript">
 
 var main_title = '$SiteName';
 
 var CurrentTab= new String();
 var \$Menus = new Array();
 if(!\$fw_menus) var \$fw_menus = new Array();
 
 var lang_Filter = "$lang_Filter";
 var lang_Sort = "$lang_Sort";
 var lang_Select = "$lang_Select";
 var lang_Unselect = "$lang_Unselect";
 var lang_Invert = "$lang_Invert";
 var lang_PerPage = "$lang_PerPage";
 var lang_All = "$lang_All";
 var lang_Asc = "$lang_Asc";
 var lang_Desc = "$lang_Desc";
 var lang_Disabled = "$lang_Disabled";
 var lang_Pending = "$lang_Pending";
 var lang_Default = "$lang_Default";
 var lang_CreatedOn = "$lang_CreatedOn";
 var lang_View = "$lang_View";
 var lang_Views = "$lang_Views";
 var lang_None = "$lang_None";
 var lang_PerPage = "$lang_PerPage";
 var lang_Enabled = "$lang_Enabled";
 var lang_URL = "$lang_URL";
 var lang_Status = "$lang_Status";
 var lang_Name = "$lang_Name";
 
 var lang_Edit = "$lang_Edit";
 var lang_Delete = "$lang_Delete";
 var lang_MoveUp = "$lang_MoveUp";
 var lang_MoveDn = "$lang_MoveDn";
 var ampm = $ampm;
+var skip_date_validation = $skip_date_validation;
 var listview_clear=1;
 var CalDateFormat = "$Cal";
 
 var yearpos = $yearpos;
 var monthpos = $monthpos;
 var daypos = $daypos;
 var ErrorMsg = '$errormsg';
 //en = $en
 var rootURL = '$rootURL';
 
 function clear_list_checkboxes()
 {  
       var inputs = document.getElementsByTagName("INPUT");
       for (var i = 0; i < inputs.length; i++)
         if (inputs[i].type == "checkbox" && inputs[i].getAttribute("isSelector"))
         {
            inputs[i].checked=false;
         }
 }
 
 
 function getRealLeft(el) {
     xPos = el.offsetLeft;
     tempEl = el.offsetParent;
     while (tempEl != null) {
         xPos += tempEl.offsetLeft;
         tempEl = tempEl.offsetParent;
     }
     return xPos;
 }
 
 function getRealTop(el) {
     yPos = el.offsetTop;
     tempEl = el.offsetParent;
     while (tempEl != null) {
         yPos += tempEl.offsetTop;
         tempEl = tempEl.offsetParent;
     }
     return yPos;
 }
 
 function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
 }
 
 function SetButtonStateByImage(btn_id, img_src)
 {
 	// set state depending on image name
 	var btn = document.getElementById(btn_id);
 	if(btn)
 	{
 		if( !HasParam(img_src) ) img_src = btn.getAttribute('src');
 		var img_name = img_src.split('/');
       	img_name = img_name.length ? img_name[img_name.length - 1] : img_name;
       	img_name = img_name.split('.');
       	img_name = img_name[0].split('_');
       	img_name = img_name.length ? img_name[img_name.length - 1] : img_name;
       	if(img_name)
       	{
       		switch(img_name)
       		{
       			case 'f2': btn.setAttribute('ButtonState','over'); break;
       			case 'f3': btn.setAttribute('ButtonState','disabled'); break;
       			default: btn.setAttribute('ButtonState','enabled'); break;
 			}
     	}
 	}
 }
 
 
 function swap(imgid, src, module_name){
 	// swaps toobar icons from kernel
 	// admin or from module specified
 	
 	var ob = document.getElementById(imgid);
 	if(ob)
 	{
 		SetButtonStateByImage(imgid, src);
 		var s = src;
 		s = s.slice(0,4);
 		if(s=='http')
 		{
 			ob.src = src;
 		}
 		else
 		{
 			if(module_name == null)
 				ob.src = '$adminURL' + '/images/' + src;
 			else
 			{
 				ob.src = '$rootURL' + module_name + '/$admin/images/' + src;
 			}
 		}
 	}
 }
 
 function flip(val)
 {
 	if (val == 0)
 		return 1;
 	else
 		return 0;
 }
 
 function config_val(field, val2,url){
     //alert('Setting ' + field + ' to ' + val2);
     if(url)
         document.viewmenu.action=url;
 	document.viewmenu.Action.value = "m_SetVariable";
 	document.viewmenu.fieldname.value = field;
 	document.viewmenu.varvalue.value = val2;
 	document.viewmenu.submit();
 }
 
 function session_val(field, val2){
     //alert('Setting ' + field + ' to ' + val2);
 	document.viewmenu.Action.value = "m_SetSessionVariable";
 	document.viewmenu.fieldname.value = field;
 	document.viewmenu.varvalue.value = val2;
 	document.viewmenu.submit();
 }
 
 function Submit_ListSearch(action)
 { 
     f = document.getElementById('ListSearchForm');
     s = document.getElementById('ListSearchWord');
     if(f)
     {    
       f.Action.value = action;
       f.list_search.value = s.value;
       f.submit();
     }
 }
 
 function ValidTime(time_str)
 {
   	var valid = true;
   	
   	if( trim(time_str) == '' ) return true; // is valid in case if not entered
   	time_str = time_str.toUpperCase();
     parts = time_str.split(/\s*[: ]\s*/);
     hour = parseInt(parts[0]);
     minute = parseInt(parts[1]);
     sec = parseInt(parts[2]);
   	if(ampm == true)
   	{
       	amstr = parts[3];
       	var am_valid = (amstr == 'AM' || amstr == 'PM');
       	if(am_valid && hour > 12) valid = false;
       	if(amstr == 'PM' && hour <= 12) hour = hour + 12;
       	if(hour == 24) hour = 0;
       	if(!am_valid) valid = false;
   	}
   	valid = valid && (hour > -1 && hour < 24);
   	valid = valid && (minute > -1 && minute < 60);
   	valid = valid && (sec > -1 && sec < 60);
   	return valid;
 }
 
 function ValidCustomName(name_str)
 {
 	if (trim(name_str) == '') return false;
 	var re = new RegExp('^[a-zA-Z0-9_]{1,}$');
 	if (name_str.match(re)) {
 		return true;
 	}
 	else {
 		return false;
 	}
 }
 
 function ValidThemeName(name_str)
 {
 	if (trim(name_str) == '') return false;
 	var re = new RegExp('^[a-zA-Z0-9-_]{1,}$');
 	if (name_str.match(re)) {
 		return true;
 	}
 	else {
 		return false;
 	}
 }
 
 function DaysInMonth(month,year)
 {
   timeA = new Date(year, month,1);
   timeDifference = timeA - 86400000;
   timeB = new Date(timeDifference);
   return timeB.getDate();
 }
 
 function ValidDate(date_str)
 {
   	var valid = true;
-	
+	if (skip_date_validation) {
+		return valid;
+	}
+  	
 	if( trim(date_str) == '' ) return true; // is valid in case if not entered
   	parts = date_str.split(/\s*\D\s*/);
   	
   	year = parts[yearpos-1]; 
   	month = parts[monthpos-1];
   	day = parts[daypos-1];
   	
   	valid = (year>0);
   	valid = valid && ((month>0) && (month<13));
   	valid = valid && (day<DaysInMonth(month,year)+1);
   	return valid;
 }
 
 function trim(str) 
 { 
 	return str.replace(/(^\s*)|(\s*$)/g,''); 
 } 
 
 function ValidateNumber(aValue, aNumberType)
 {
 	var valid = true;
 	if( trim(aValue) == '' ) return true;
 	return (parseInt(aValue) == aValue);
 }
 
 function OpenEditor(extra_env,TargetForm,TargetField)
 {
   var url = '$editor_url';
 
   url = url+'&TargetForm='+TargetForm+'&TargetField='+TargetField+'&destform=popup';
   if(extra_env.length>0)
       url = url+extra_env;
   
   window.open(url,"html_edit","width=800,height=575,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no");
 }
 
 function BitStatus(Value,bit)
 {
     var val = Math.pow(2,bit);
     if((Value & val))
     {
          return 1;
     }
     else
         return 0;
 }
 
 function FlipBit(ValueName,Value,bit)
 {
     var val = Math.pow(2,bit);
     //alert('Setting bit ['+bit+'] of var ['+ValueName+'] with current value ['+Value+']');
     if(BitStatus(Value,bit))
     {        
       Value = Value - val;
     }
     else
         Value = Value + val;
     session_val(ValueName,Value);
 }
 
 function PerPageSelected(Value,PageCount)
 {
     if(Value==PageCount)
     {    
         return 2;
     }
     else 
         return 0;
 }
 
 function RadioIsSelected(Value1,Value2)
 {
     if(Value1 == Value2)
     {
         return 2;
     }
     else
         return 0;
 }
 
 function OpenItemSelector(envstr)
 {
     //alert(envstr);
     window.open('$item_select?'+envstr,"groupselect","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no");
 }
 
 function OpenUserSelector(CheckIdField,Checks,envstr)
 {    
   	if(Checks) var retval = Checks.getItemList();
   	f = document.getElementById('userpopup');
   	if(f)
   	{
       	if(CheckIdField)
       		f.elements[CheckIdField].value = retval;    
   	}
   	SessionPrepare('$user_select', envstr, 'userselect');
 }
 
 
 function SessionPrepare(url, get_str, window_name)
 {
   	var params = ExtractParams(get_str);
   	
   	if(params['destform'])
   	{
   		if(params['destform'] == 'popup')
   		{
   			CreatePopup(window_name, url + '?' + get_str);
   			return true;
   		}
   		else
   			var frm = CreateFakeForm();
   	}
 	else
   		var frm = CreateFakeForm();
   		
   	if(!frm) return false;
   	frm.destform.value = params['destform'];
   	params['destform'] = 'popup';
   	get_str = MergeParams(params);
   	CreatePopup(window_name);
   	frm.target = window_name;
   	frm.method = 'POST';
   	frm.action = url + '?' + get_str;  	
   	frm.submit();
 }
 
 function addField(form, type, name, value)
 {
 	// create field in form
 	var field = document.createElement("INPUT");
 	field.type = type;
 	field.name = name;
 	field.id = name;
 	field.value = value;
 	form.insertBefore(field, form.nextSibling);
 }
 
 function CreateFakeForm()
 {
 	if($submit_done == 0)
 	{
 		var theBody = document.getElementsByTagName("BODY");
 		if(theBody.length == 1)
 		{
 			var frm = document.createElement("FORM");
 			frm.name = "fake_form";
 			frm.id = "fake_form";
 			frm.method = "post";
 			
 			theBody[0].insertBefore(frm, theBody[0].nextSibling);
 			addField(frm, 'hidden', 'submit_done', 1);
 			addField(frm, 'hidden', 'destform', '');
 			return document.getElementById('fake_form');
 		}
 	}
 	return false;
 }
 
 function CreatePopup(window_name, url, width, height)
 {
 	// creates a popup window & returns it
 	if(url == null && typeof(url) == 'undefined' ) url = '';
 	if(width == null && typeof(width) == 'undefined' ) width = 750;
 	if(height == null && typeof(height) == 'undefined' ) height = 400;
 	
 	
 	return window.open(url,window_name,'width='+width+',height='+height+',status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no');  	
 }
 
 function ShowHelp(section)
 {
 	var frm = document.getElementById('help_form');	
 	frm.section.value = section;
 	frm.method = 'POST';
 	CreatePopup('HelpPopup','$rootURL$admin/help/blank.html'); // , null, 600
 	frm.target = 'HelpPopup';
 	frm.submit();
 }
 
 function ExtractParams(get_str)
 {
  	// extract params into associative array
  	var params = get_str.split('&');
  	var result = Array();
  	var temp_var;
 	var i = 0;
 	var params_count = params.length;
 	while(i < params_count)
 	{
 		temp_var = params[i].split('=');
 		result[temp_var[0]] = temp_var[1];
 		i++;	
 	}
 	return result;
 }
 
 function MergeParams(params)
 {
 	// join splitted params into GET string	
 	var key;
 	var result = '';
 	for(key in params)
 		result += key + '=' + params[key] + '&';
 	if(result.length) result = result.substring(0, result.length - 1);
 	return result;
 }
 
 function show_props(obj, objName)
 {
 	var result = "";
 	for (var i in obj) {
 		result += objName + "." + i + " = " + obj[i] + "\\n";
 	}
 	return result;
 }
 
 function OpenGroupSelector(envstr)
 {
     //alert(envstr);
     SessionPrepare('$group_select', envstr, 'groupselect');
     //window.open('$group_select?'+envstr,"groupselect","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no");
 }
 
 function OpenCatSelector(envstr)
 {
     //alert(envstr);
     window.open('$cat_select?'+envstr,"catselect","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no");
 }
 
 function openEmailPopup(envar,form,Checks)
 {
   var email_url='$email_url';  
   var url = email_url+envar;
   
   if(Checks.itemChecked())
   {  
     f = document.getElementById(form);
     if(f)
     {
 		window.open('',"sendmail","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no");
     	f.idlist.value = Checks.getItemList();
       	f.submit();      	
     }
   }
 }
 
 function OpenPhraseEditor(extra_env)
 {
 	//SessionPrepare('$phrase_edit', extra_env, 'phrase_edit');
 	
   	var url = '$phrase_edit'+extra_env+'&destform=popup';
   	window.open(url,"phrase_edit","width=750,height=400,status=yes,resizable=yes,menubar=no,scrollbars=yes,toolbar=no");
 }
 
 function set_window_title(\$title)
 {
 	var \$window = window;
 	if(\$window.parent) \$window = \$window.parent;
 	\$window.document.title = (main_title.length ? main_title + ' - ' : '') + \$title;
 }
 
 var env = '$env2';
 var SubmitFunc = false;
 
 </script>
 
 END;
 ?>

Property changes on: trunk/admin/include/mainscript.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.17
\ No newline at end of property
+1.18
\ No newline at end of property
Index: trunk/admin/head.php
===================================================================
--- trunk/admin/head.php	(revision 3906)
+++ trunk/admin/head.php	(revision 3907)
@@ -1,143 +1,143 @@
 <?php
 	define('DBG_SHOW_MEMORY_USAGE', 0);
 	define('DBG_SKIP_REPORTING', 1);
 	
 	define('ADMIN', 1);
 	define('REL_PATH', 'admin');
 	$relation_level = count( explode('/', REL_PATH) );
 	define('FULL_PATH', realpath(dirname(__FILE__) . str_repeat('/..', $relation_level) ) );
 	define('APPLICATION_CLASS', 'MyApplication');
 	include_once(FULL_PATH.'/kernel/kernel4/startup.php');
 
 	$application =& kApplication::Instance();
 	$application->Init();
 
 	if ($application->GetVar('check_server')) {
 		echo 'PING: '.date('d/m/Y H:i:s');
 		exit;
 	}
 	
 	
 	$user = $application->recallObject('u');
 	$loginname = ($user->GetID() != -1) ? $user->GetDBField('Login') : 'root';
 	
 	$logout = $application->HREF('', '', Array('logout' => 1, '__URLENCODE__' => 1), 'index.php');
 	$mainpage = $application->HREF('', '', Array('section' => 'in-portal:root', '__URLENCODE__' => 1), 'subitems.php');
 	$xmlhttp_url = $application->HREF('', '', Array('check_server' => 1, '__URLENCODE__' => 1));
 	
 	$language =& $application->recallObject('lang.current');
 	
 	$use_xml = $application->isDebugMode() && dbg_ConstOn('DBG_SHOW_EXPIRATION');
 ?>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
 <html>
 <head>
 	<title>HEAD</title>
 	<meta http-equiv="content-type" content="text/html;charset=<?php echo $language->GetDBField('Charset'); ?>">
 	<meta name="generator" content="Notepad">
 	<link rel="stylesheet" type="text/css" href="include/style.css">
 	<?php
 		if ($use_xml) {
 	?>
 	<script language="javascript" type="text/javascript">
         function getXMLHTTPObject()
         {
         	var http_request = false;
 	        if (window.XMLHttpRequest) { // Mozilla, Safari,...
 	            http_request = new XMLHttpRequest();
 	            if (http_request.overrideMimeType) {
 	                http_request.overrideMimeType('text/plain');
 	                // See note below about this line
 	            }
 	        } else if (window.ActiveXObject) { // IE
 	            try {
 	                http_request = new ActiveXObject("Msxml2.XMLHTTP");
 	            } catch (e) {
 	                try {
 	                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
 	                } catch (e) {}
 	            }
 	        }
 	        return http_request;
         }
         
         function processResponce(http_request) {
 	        if (http_request.readyState == 4) {
 	            if (http_request.status == 200) {
 	                document.getElementById('server_status').innerHTML = http_request.responseText;
 	            } else {
 	//				alert('There was a problem with the request.');
 	            }
 	        }
 	
 	    }
 	</script>
 	<?php
 		}
 	?>
 </head>
 <body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" bgcolor="#FFFFFF">
 <table cellpadding="0" cellspacing="0" border="0" width="100%" height="100%">
 <tr>
 	<td valign="bottom">
 		<table cellpadding="0" cellspacing="0" border="0" width="100%" height="90">
 		<tr>
 			<td rowspan="3" valign="top">
 				<a href="<?php echo $mainpage; ?>" target="main"><img title="In-portal" src="images/globe.gif" width="84" height="91" border="0"></a>
 			</td>
 			<td rowspan="3" valign="top">
 				<a href="<?php echo $mainpage; ?>" target="main"><img title="In-portal" src="images/logo.gif" width="150" height="91" border="0"></a>
 			</td>
 			<td rowspan="3" width="100000" align="center">
 			<?php
 				echo $use_xml ? '<div id="server_status"></div>' : '&nbsp;';
 			?>	
 			</td>
 			<td width="400">
 				<img title="" src="images/blocks.gif" width="400" height="73">
 			</td>
 		</tr>
 		
 		<tr>
   			<td align="right" background="images/version_bg.gif" class="head_version" valign="bottom">
   				<img title="" src="images/spacer.gif" width="1" height="10"  align="absmiddle">
 				<?php echo $application->Phrase('la_Logged_in_as').' <b>'.$loginname.' </b>'; ?>
   				<a href="<?php echo $logout; ?>" target="_parent"><img src="images/blue_bar_logout.gif" height="16" width="16" align="absmiddle" border="0"></A>
   			</td>
 		</tr>
 		
 		<tr>
 			<td><img title="" src="images/blocks2.gif" width="400" height="1"></td>
 		</tr>
 		
 		<tr>
 			<td bgcolor="black" colspan="4"><img title="" src="images/spacer.gif" width="1" height="1"></td>
 		</tr>
 	</table>
 </td>
 </tr>
 </table>
 	<?php
 		if ($use_xml) {
 	?>
 	<script language="javascript" type="text/javascript">
 		function checkServer() {
 			var http_request = getXMLHTTPObject();
 			http_request.onreadystatechange = function() { processResponce(http_request); };
 
 			http_request.open('GET', '<?php echo $xmlhttp_url; ?>', true);
         	http_request.send(null);
 
-        	setTimeout('checkServer()', 60000);
+        	setTimeout('checkServer()', 5 * 60000);	// one time in 5 minutes
         }
 
         checkServer();
 	</script>
 	<?php
 		}
 	?>
 </body>
 </html>
 <?php
 	$application->Done();
 ?>
\ No newline at end of file

Property changes on: trunk/admin/head.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.9
\ No newline at end of property
+1.10
\ No newline at end of property
Index: trunk/core/kernel/event_manager.php
===================================================================
--- trunk/core/kernel/event_manager.php	(revision 3906)
+++ trunk/core/kernel/event_manager.php	(revision 3907)
@@ -1,417 +1,455 @@
 <?php
 
 	define('hBEFORE',	1);
 	define('hAFTER',	2);
 
 	define('reBEFORE',	1);
 	define('reAFTER',	2);
 
 	class kEventManager extends kBase {
 
 		/**
 		* Connection to database
 		*
 		* @var kDBConnection
 		* @access public
 		*/
 		var $Conn;
 
 		/**
 		 * Cache of QueryString parameters
 		 * from config, that are represented
 		 * in enviroment variable
 		 *
 		 * @var Array
 		 */
 		var $queryMaps = Array();
 
 		/**
 		 * Build events registred for
 		 * pseudo classes. key - pseudo class
 		 * value - event name
 		 *
 		 * @var Array
 		 * @access private
 		 */
 		var $buildEvents=Array();
 
 
 		/**
 		 * Events, that should be run before parser initialization
 		 *
 		 * @var Array
 		 */
 		var $beforeRegularEvents = Array();
 
 		/**
 		 * Events, that should be run after parser initialization
 		 *
 		 * @var Array
 		 */
 		var $afterRegularEvents = Array();
 
 		/**
 		 * Holds before hooks
 		 * key - prefix.event (to link to)
 		 * value - hooked event info
 		 *
 		 * @var Array
 		 * @access private
 		 */
 		var $beforeHooks=Array();
 
 		/**
 		 * Holds after hooks
 		 * key - prefix.event (to link to)
 		 * value - hooked event info
 		 *
 		 * @var Array
 		 * @access private
 		 */
 		var $afterHooks = Array();
 
+		
+		var $recursionStack = Array();
+		
 		function kEventManager()
 		{
 			parent::kBase();
 			$this->Conn =& $this->Application->GetADODBConnection();
 		}
 
 		/**
 		 * Set's new enviroment parameter mappings
 		 * between their names as application vars
 		 *
 		 * @param Array $new_query_maps
 		 * @access public
 		 */
 		/*function setQueryMaps($new_query_maps)
 		{
 			$this->queryMaps = $new_query_maps;
 		}*/
 
 		/**
 		 * Adds new query map to already parsed query maps
 		 *
 		 * @param string $prefix
 		 */
 		function setQueryMap($prefix_special)
 		{
 			list($prefix) = explode('.', $prefix_special);
 			$query_map = $this->Application->getUnitOption($prefix, 'QueryString');
 			if ($query_map) {
 				$this->queryMaps[$prefix_special] = $query_map;
 			}
 			else {
 				unset($this->queryMaps[$prefix]);
 			}
 
 			$this->Application->SetVar('passed', implode(',', array_keys($this->queryMaps)) );
 			return $query_map;
 		}
 
 		/**
 		 * Registers new regular event
 		 *
 		 * @param string $short_name name to be used to store last maintenace run info
 		 * @param string $event_name
 		 * @param int $run_interval run interval in seconds
 		 * @param int $type before or after regular event
 		 */
 		function registerRegularEvent($short_name, $event_name, $run_interval, $type = reBEFORE)
 		{
 			if($type == reBEFORE)
 			{
 				$this->beforeRegularEvents[$short_name] = Array('EventName' => $event_name, 'RunInterval' => $run_interval);
 			}
 			else
 			{
 				$this->afterRegularEvents[$short_name] = Array('EventName' => $event_name, 'RunInterval' => $run_interval);
 			}
 		}
 
 		function registerBuildEvent($pseudo_class,$build_event_name)
 		{
 			$this->buildEvents[$pseudo_class]=$build_event_name;
 		}
 
 		/**
 		 * Returns build event by pseudo class
 		 * name if any defined in config
 		 *
 		 * @param string $pseudo_class
 		 * @return kEvent
 		 * @access public
 		 */
 		function &getBuildEvent($pseudo_class)
 		{
 			$false = false;
 			if( !isset($this->buildEvents[$pseudo_class]) ) return $false;
 
 			$event = new kEvent();
 			$event->Name=$this->buildEvents[$pseudo_class];
 			$event->MasterEvent=null;
 			return $event;
 		}
 
 		/**
+		 * Check if event is called twice, that causes recursion
+		 *
+		 * @param kEvent $event
+		 */
+		function isRecursion(&$event)
+		{
+			$event_key = $event->getPrefixSpecial().':'.$event->Name;
+			return in_array($event_key, $this->recursionStack) ? true : false;
+		}
+		
+		function pushEvent(&$event)
+		{
+			$event_key = $event->getPrefixSpecial().':'.$event->Name;
+			array_push($this->recursionStack, $event_key);
+		}
+		
+		function popEvent()
+		{
+			array_pop($this->recursionStack);
+		}
+		
+		/**
 		 * Allows to process any type of event
 		 *
 		 * @param kEvent $event
 		 * @access public
 		 */
 		function HandleEvent(&$event)
 		{
+			if ($this->isRecursion($event)) {
+				return true;
+			}
+			
+			$this->pushEvent($event);
+			
 			if( !$this->Application->prefixRegistred($event->Prefix) )
 			{
 				trigger_error('Prefix <b>'.$event->Prefix.'</b> not registred (requested event <b>'.$event->Name.'</b>)', E_USER_NOTICE);
 				return false;
 			}
 
 			if (!$event->SkipBeforeHooks) {
 				$this->processHooks($event, hBEFORE);
 				if ($event->status == erFATAL) return true;
 			}
 
 			$event_handler =& $this->Application->recallObject($event->Prefix.'_EventHandler');
 			$event_handler->processEvent($event);
 
 			if ($event->status == erFATAL) return true;
 			if (!$event->SkipAfterHooks) {
 				$this->processHooks($event, hAFTER);
 			}
 
+			$this->popEvent();
+			
 			return true;
 		}
 
 		function ProcessRequest()
 		{
 			$this->processOpener();
 
 			// 1. get events from $_POST
 			$events = $this->Application->GetVar('events');
 			if ($events === false) $events = Array();
 			// 2. if nothing there, then try to find them in $_GET
 			if ($this->queryMaps && !$events) {
 				// if we got $_GET type submit (links, not javascript)
 				foreach ($this->queryMaps as $prefix_special => $query_map) {
 					$query_map = array_flip($query_map);
 					if (isset($query_map['event'])) {
 						$event_name = $this->Application->GetVar($prefix_special.'_event');
 						if ($event_name) {
 							$events[$prefix_special] = $event_name;
 						}
 					}
 				}
 				$actions = $this->Application->GetVar('do');
 				if ($actions) {
 					list($prefix, $event_name) = explode('_', $actions);
 					$events[$prefix] = $event_name;
 				}
 			}
 
 			$passed = explode(',', $this->Application->GetVar('passed'));
 			foreach($events as $prefix_special => $event_name)
 			{
 				if(!$event_name) continue;
 				if( is_array($event_name) )
 				{
 					$event_name = key($event_name);
 					$events[$prefix_special] = $event_name;
 					$this->Application->SetVar($prefix_special.'_event', $event_name);
 				}
 
 				$event = new kEvent();
 				$event->Name=$event_name;
 				$event->Prefix_Special=$prefix_special;
 
 				$prefix_special=explode('.',$prefix_special);
 				$event->Prefix=$prefix_special[0];
 				array_push($passed, $prefix_special[0]);
 				$event->Special=isset($prefix_special[1])?$prefix_special[1]:'';
 
 				$event->redirect_params = Array('opener'=>'s', 'pass'=>'all');
 				$event->redirect = true;
 				$this->HandleEvent($event);
 
 				if($event->status==erSUCCESS && ($event->redirect === true || strlen($event->redirect) > 0) )
 				{
 					$this->Application->Redirect($event->redirect, $event->redirect_params, null, $event->redirect_script);
 				}
 			}
 
 			$this->Application->SetVar('events', $events);
 			$this->Application->SetVar('passed', implode(',', $passed));
 		}
 
 		function processOpener()
 		{
 			$opener_action=$this->Application->GetVar('m_opener');
 			$opener_stack=$this->Application->RecallVar('opener_stack');
 			$opener_stack=$opener_stack?unserialize($opener_stack):Array();
 			switch($opener_action)
 			{
 				case 'r':	// "reset" opener stack
 					$opener_stack=Array();
 					break;
 
 				case 'd':	// "down/push" new template to opener stack, deeplevel++
 					if ($this->Application->GetVar('front')) {
 						array_push($opener_stack, '../'.$this->Application->RecallVar('last_template') );
 					}
 					else {
 						array_push($opener_stack, $this->Application->RecallVar('last_template') );
 					}
 					break;
 
 				case 'u':	// "up/pop" last template from opener stack, deeplevel--
 					array_pop($opener_stack);
 					break;
 
 				case 'p': //pop-up - do not store last template
 					$this->Application->SetVar('skip_last_template', 1);
 					break;
 
 				default:	// "s/0," stay on same deep level
 					break;
 			}
 			if ( !$this->Application->GetVar('skip_last_template') ) {
 				$this->Application->SetVar('m_opener','s');
 			}
 			$this->Application->StoreVar('opener_stack',serialize($opener_stack));
 		}
 
 		function registerHook($hookto_prefix, $hookto_special, $hookto_event, $mode, $do_prefix, $do_special, $do_event, $conditional)
 		{
 			if( !$this->Application->getUnitOptions($hookto_prefix) )
 			{
 				if($this->Application->isDebugMode())
 				{
 					trigger_error('Prefix <b>'.$hookto_prefix.'</b> doesn\'t exist when trying to hook from <b>'.$do_prefix.':'.$do_event.'</b>', E_USER_WARNING);
 				}
 				return;
 			}
 			$hookto_prefix_special = rtrim($hookto_prefix.'.'.$hookto_special, '.');
 			if ($mode == hBEFORE) {
 				$this->beforeHooks[strtolower($hookto_prefix_special.'.'.$hookto_event)][] = Array(
 						'DoPrefix' => $do_prefix,
 						'DoSpecial' => $do_special,
 						'DoEvent' => $do_event,
 						'Conditional' => $conditional,
 					);
 			}
 			elseif ($mode == hAFTER) {
 				$this->afterHooks[strtolower($hookto_prefix_special.'.'.$hookto_event)][] = Array(
 						'DoPrefix' => $do_prefix,
 						'DoSpecial' => $do_special,
 						'DoEvent' => $do_event,
 						'Conditional' => $conditional,
 					);
 			}
 		}
 
 		/**
 		 * Enter description here...
 		 *
 		 * @param kEvent $event
 		 * @param int $mode hBEFORE or hAFTER
 		 * @return Array
 		 */
 		function &getHooks(&$event, $mode, $special = null)
 		{
 			$event_key = !isset($special) ? $event->Prefix_Special : $event->Prefix.'.'.$special;
 
 			if ($mode == hBEFORE) {
 				$mode_hooks =& $this->beforeHooks;
 			}
 			else {
 				$mode_hooks =& $this->afterHooks;
 			}
 
 			$hooks = getArrayValue($mode_hooks, strtolower($event_key.'.'.$event->Name));
 			if (!$hooks) {
 				$hooks = Array();
 			}
 			return $hooks;
 		}
 
 		/**
 		 * Enter description here...
 		 *
 		 * @param kEvent $event
 		 * @param int $mode hBEFORE or hAFTER
 		 */
 		function processHooks(&$event, $mode)
 		{
 			// * - get hooks that are valid with any special of given prefix
 			$hooks = array_merge_recursive2($this->getHooks($event, $mode, '*'), $this->getHooks($event, $mode));
 
 			if ($hooks) {
 				foreach ($hooks as $hook) {
+					if ($hook['DoSpecial'] == '*') {
+						// use same special as master event
+						$hook['DoSpecial'] = $event->Special;
+					}
+					
 					$prefix_special = rtrim($hook['DoPrefix'].'_'.$hook['DoSpecial'], '_');
 					if ( $hook['Conditional'] && !$this->Application->GetVar($prefix_special) ) {
 						continue;
 					}
 
 					$hook_event = new kEvent( Array('name'=>$hook['DoEvent'],'prefix'=>$hook['DoPrefix'],'special'=>$hook['DoSpecial']) );
 					$hook_event->MasterEvent =& $event;
 					$this->HandleEvent($hook_event);
 				}
 			}
 		}
 
 		/**
 		 * Set's new event for $prefix_special
 		 * passed
 		 *
 		 * @param string $prefix_special
 		 * @param string $event_name
 		 * @access public
 		 */
 		function setEvent($prefix_special,$event_name)
 		{
 			$actions =& $this->Application->recallObject('kActions');
 			$actions->Set('events['.$prefix_special.']',$event_name);
 		}
 
 		/**
 		 * Run registred regular events with specified event type
 		 *
 		 * @param int $event_type
 		 */
 		function RunRegularEvents($event_type = reBEFORE, $from_cron=false)
 		{
 			// if RegularEvents are set to run from cron
 			if (!$from_cron && $this->Application->ConfigValue('UseCronForRegularEvent')) return ;
 			$events_source = ($event_type == reBEFORE) ? $this->beforeRegularEvents : $this->afterRegularEvents;
 
 			/*if(rand(0, 100) < 90)
 			{
 				return;
 			}*/
 
 			$sql = 'SELECT Data FROM '.TABLE_PREFIX.'Cache WHERE VarName = %s';
 			$event_last_runs = $this->Conn->GetOne( sprintf($sql, $this->Conn->qstr('RegularEventRuns') ) );
 			$event_last_runs = $event_last_runs ? unserialize($event_last_runs) : Array();
 
 			foreach($events_source as $short_name => $event_data)
 			{
 				$event_last_run = getArrayValue($event_last_runs, $short_name);
 				if($event_last_run && $event_last_run > adodb_mktime() - $event_data['RunInterval'])
 				{
 					continue;
 				}
 				else
 				{
 					$event = new kEvent($event_data['EventName']);
 					$event->redirect = false;
 					$this->Application->HandleEvent($event);
 					$event_last_runs[$short_name] = adodb_mktime();
 				}
 			}
 
 			$sql = 'REPLACE INTO '.TABLE_PREFIX.'Cache (VarName,Data,Cached) VALUES (%s,%s,%s)';
 			$this->Conn->Query( sprintf($sql, $this->Conn->qstr('RegularEventRuns'), $this->Conn->qstr(serialize($event_last_runs)), adodb_mktime() ) );
 		}
 	}
 
 
 ?>
\ No newline at end of file

Property changes on: trunk/core/kernel/event_manager.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.20
\ No newline at end of property
+1.21
\ No newline at end of property
Index: trunk/core/units/users/users_item.php
===================================================================
--- trunk/core/units/users/users_item.php	(revision 3906)
+++ trunk/core/units/users/users_item.php	(revision 3907)
@@ -1,234 +1,251 @@
 <?php
 	class UsersItem extends kDBItem {
 		
 		var $CustomFields = Array();
 		var $persistantVars = Array();
 		
 		function Init($prefix, $special, $event_params = null)
 		{
 			parent::Init($prefix, $special, $event_params);
 			
 			$item_type = $this->Application->getUnitOption($this->Prefix, 'ItemType');
 			$sql = 'SELECT CustomFieldId, FieldName FROM '.TABLE_PREFIX.'CustomField WHERE Type = %s';
 			$this->CustomFields = $this->Conn->GetCol( sprintf($sql, $item_type), 'FieldName' );
 		}
 		
 		
 		function defineFields()
 		{
 			parent::defineFields();
 			
 			// add custom fields definitions (as virtual fields)
 			$add_fields = Array();
 			$custom_field_options = Array('default' => '', 'not_null' => 1);
 			foreach ($this->CustomFields as $custom_field => $custom_id)
 			{
 				$add_fields[$custom_field] = $custom_field_options;
 			}
 			
 			if($add_fields)
 			{
 				$add_fields = array_merge_recursive2($add_fields, $this->VirtualFields);
 				$this->setVirtualFields($add_fields);
 			}
 		}
 	
 		/**
 		 * Load custom fields values as virtual fields for dbitem
 		 *
 		 * @return bool
 		 */
 		function LoadCustomFields()
 		{
 			if (!$this->CustomFields) return false;
 			
 			$custom_ids = implode(',', $this->CustomFields);
 			$sql = 'SELECT Value, CustomFieldId
 					FROM '.TABLE_PREFIX.'CustomMetaData 
 					WHERE ResourceId = '.$this->GetDBField('ResourceId').' AND CustomFieldId IN ('.$custom_ids.')';
 			$custom_values = $this->Conn->GetCol($sql, 'CustomFieldId');
 			if (!$custom_values) return false;
 			
 			$custom_fields = array_flip($this->CustomFields);
 			foreach ($custom_values as $custom_id => $custom_value)
 			{
 				$this->SetDBField($custom_fields[$custom_id], $custom_value);
 			}
 			return true;
 		}
 		
 		function LoadPersistantVars()
 		{
 			$sql = 'SELECT VariableValue, VariableName
 					FROM '.TABLE_PREFIX.'PersistantSessionData
 					WHERE PortalUserId = '.$this->GetID();
 			$this->persistantVars = $this->Conn->GetCol($sql, 'VariableName');
 		}
 		
 		function setPersistantVar($var_name, $var_value)
 		{
 			$this->persistantVars[$var_name] = $var_value;
 			
 			$replace_hash = Array(	'PortalUserId'	=>	$this->GetID(),
 									'VariableName'	=>	$var_name,
 									'VariableValue'	=>	$var_value
 							);
 			$this->Conn->doInsert($replace_hash, TABLE_PREFIX.'PersistantSessionData', 'REPLACE');
 		}
 		
 		function getPersistantVar($var_name)
 		{
 			return getArrayValue($this->persistantVars, $var_name);
 		}
 		
 		function UpdateCustomFields()
 		{
 			$data_table = TABLE_PREFIX.'CustomMetaData';
 			
 			// get values already written, to find their ids
 			$sql = 'SELECT CustomDataId, CustomFieldId
 					FROM '.$data_table.'
 					WHERE ResourceId = '.$this->GetDBField('ResourceId');
 			$custom_value_ids = $this->Conn->GetCol($sql, 'CustomFieldId');
 			$sql = 'REPLACE INTO '.$data_table.'(CustomDataId,ResourceId,CustomFieldId,Value) VALUES (%1$s,%2$s,%3$s,%4$s)';
 			
 			foreach ($this->CustomFields as $custom_field => $custom_id)
 			{
 				$data_id =  isset($custom_value_ids[$custom_id]) ? $custom_value_ids[$custom_id] : 0;
 				$custom_value = $this->GetDBField($custom_field);
 				
 				if (!$custom_value && $data_id)
 				{
 					$temp_sql = 'DELETE FROM '.$data_table.' WHERE CustomDataId = '.$data_id;
 					$this->Conn->Query($temp_sql);	
 				}
 				elseif($custom_value)
 				{
 					$temp_sql = sprintf($sql, $data_id, $this->GetDBField('ResourceId'), $custom_id, $this->Conn->qstr( $this->GetDBField($custom_field) ) );
 					$this->Conn->Query($temp_sql);	
 				}
 			}
 		}
 		
 		function Load($id, $id_field_name = null)
 		{
 			$ret = parent::Load($id, $id_field_name);
 			if($ret)
 			{
 				$this->LoadCustomFields();
 				$this->LoadPersistantVars();
 			}
 			return $ret;
 		}
 		
 		/**
 		 * Returns IDs of groups to which user belongs and membership is not expired
 		 *
 		 * @return Array
 		 * @access public
 		 */
 		function getMembershipGroups($force_reload = false)
 		{
 			$user_groups = $this->Application->RecallVar('UserGroups');
 			if($user_groups === false || $force_reload)
 			{
 				$sql = 'SELECT GroupId FROM %s WHERE (PortalUserId = %s) AND ( (MembershipExpires IS NULL) OR ( MembershipExpires >= UNIX_TIMESTAMP() ) )';
 				$sql = sprintf($sql, TABLE_PREFIX.'UserGroup', $this->GetID() );
 				return $this->Conn->GetCol($sql);
 			}
 			else
 			{
 				return explode(',', $user_groups);
 			}
 		}
 		
 		/**
 		 * Set's Login from Email if required by configuration settings
 		 *
 		 */
 		function setLogin()
 		{
 			if( $this->Application->ConfigValue('Email_As_Login') )
 			{
 				$this->SetDBField('Login', $this->GetDBField('Email') );	
 			}
 		}
 		
 		function SendEmailEvents()
 		{
 			switch( $this->GetDBField('Status') )
 			{
 				case 1:
 					$this->Application->EmailEventAdmin('USER.ADD', $this->GetID() );
 					$this->Application->EmailEventUser('USER.ADD', $this->GetID() );
 					break;
 					
 				case 2:
 					$this->Application->EmailEventAdmin('USER.ADD.PENDING', $this->GetID() );
 					$this->Application->EmailEventUser('USER.ADD.PENDING', $this->GetID() );
 					break;
 			}
 		}
 		
 		function isSubscriberOnly()
 		{
 			$subscribers_group_id = $this->Application->ConfigValue('User_SubscriberGroup');
 			$sql = 'SELECT PortalUserId
 					FROM '.TABLE_PREFIX.'UserGroup
 					WHERE 	GroupId = '.$subscribers_group_id.' AND 
 							PortalUserId = '.$this->GetDBField('PortalUserId').' AND 
 							PrimaryGroup = 1';
 			return $this->Conn->GetOne($sql) == $this->GetDBField('PortalUserId');
 		}
 		
 		function Create($force_id=false, $system_create=false)
 		{
 			$ret = parent::Create($force_id, $system_create);
 			if ($ret)
 			{
 				$this->UpdateCustomFields();
 				
 				// find out how to syncronize user only when it's copied to live table
 				$sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 				$sync_manager->performAction('createUser', $this->FieldValues);
 			}
 			return $ret;
 		}
 		
 		
 		function Update($id=null, $system_update=false)
 		{
 			$ret = parent::Update($id, $system_update);
 			if ($ret)
 			{
 				$this->UpdateCustomFields();
 				
 				// find out how to syncronize user only when it's copied to live table
 				$sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 				$sync_manager->performAction('updateUser', $this->FieldValues);
 			}
 			return $ret;
 		}
 		
 		/**
 		* Deletes the record from databse
 		*
 		* @access public
 		* @return bool
 		*/
 		function Delete($id = null)
 		{
 			$ret = parent::Delete($id);
 			
 			if ($ret)
 			{
 				$sync_manager =& $this->Application->recallObject('UsersSyncronizeManager', null, Array(), 'InPortalSyncronize');
 				$sync_manager->performAction('deleteUser', $this->FieldValues);
 			}
 			
 			return $ret;
 		}
 		
+		function setName($full_name)
+		{
+			$full_name = explode(' ', $full_name);
+			
+			if (count($full_name) > 2) {
+				$last_name = array_pop($full_name);
+				$first_name = implode(' ', $full_name);
+			}
+			else {
+				$last_name = $full_name[1];
+				$first_name = $full_name[0];
+			}
+			
+			$this->SetDBField('FirstName', $first_name);
+			$this->SetDBField('LastName', $last_name);
+		}
+		
 	
 	}
 ?>
\ No newline at end of file

Property changes on: trunk/core/units/users/users_item.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.7
\ No newline at end of property
+1.8
\ No newline at end of property
Index: trunk/core/units/users/users_config.php
===================================================================
--- trunk/core/units/users/users_config.php	(revision 3906)
+++ trunk/core/units/users/users_config.php	(revision 3907)
@@ -1,116 +1,119 @@
 <?php
 
 $config	=	Array(
 					'Prefix'			=>	'u',
 					'ItemClass'			=>	Array('class'=>'UsersItem','file'=>'users_item.php','build_event'=>'OnItemBuild'),
 					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
 					'EventHandlerClass'	=>	Array('class'=>'UsersEventHandler','file'=>'users_event_handler.php','build_event'=>'OnBuild'),
 					'TagProcessorClass' =>	Array('class'=>'UsersTagProcessor','file'=>'users_tag_processor.php','build_event'=>'OnBuild'),
 					'RegisterClasses'	=>	Array(
 												Array('pseudo' => 'UsersSyncronizeManager', 'class' => 'UsersSyncronizeManager', 'file' => 'users_syncronize.php', 'build_event' => ''),
 											),
 
 					'AutoLoad'			=>	true,
 					'Hooks'				=>	Array(
 												Array(
 													'Mode' => hAFTER,
 													'Conditional' => false,
 													'HookToPrefix' => 'u',
 													'HookToSpecial' => '',
 													'HookToEvent' => Array('OnAfterItemLoad', 'OnBeforeItemCreate', 'OnBeforeItemUpdate', 'OnUpdateAddress'),
 													'DoPrefix' => '',
 													'DoSpecial' => '',
 													'DoEvent' => 'OnPrepareStates',
 												),
 
 												Array(
 														'Mode' => hBEFORE,
 														'Conditional' => false,
 														'HookToPrefix' => 'affil',
 														'HookToSpecial' => '',
 														'HookToEvent' => Array('OnCheckAffiliateAgreement'),
 														'DoPrefix' => '',
 														'DoSpecial' => '',
 														'DoEvent' => 'OnSubstituteSubscriber',
 													),
 
 											),
 
 					'QueryString'		=>	Array(
 												1	=>	'id',
 												2	=>	'page',
 												3	=>	'event',
 											),
 
 					'RegularEvents'		=>	Array(
 													'membership_expiration' =>	Array('EventName' => 'OnCheckExpiredMembership', 'RunInterval' => 1800, 'Type' => reAFTER),
 											),
 
 					'IDField' 			=>	'PortalUserId',
 					'ItemType'			=>	6,	// used for custom fields only (on user's case)
 					'TableName'			=>	TABLE_PREFIX.'PortalUser',
 
 					'ListSQLs'			=>	Array(	''=>'SELECT * FROM %s',
 																		), // key - special, value - list select sql
 					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
 																		),
 					'ListSortings'	=> 	Array(
 																'' => Array(
 																	'Sorting' => Array('Login' => 'asc'),
 																)
 															),
 
 					'SubItems'		=> Array('addr'),
 
 					'Fields' => Array
 							    (
 							        'PortalUserId' => Array(),
 							        'Login' => Array('type' => 'string', 'unique'=>Array('Login'), 'default' => '','required'=>1, 'error_msgs' => Array('unique'=>'!lu_user_already_exist!')),
 							        'Password' => Array('type' => 'string', 'formatter' => 'kPasswordFormatter', 'encryption_method' => 'md5', 'verify_field' => 'VerifyPassword', 'skip_empty' => 1, 'default' => md5('') ),
 							        'FirstName' => Array('type' => 'string','default' => ''),
 							        'LastName' => Array('type' => 'string','default' => ''),
+							        'Company' => Array('type' => 'string','not_null' => '1','default' => ''),
 							        'Email' => Array('type' => 'string', 'formatter'=>'kFormatter', 'regexp'=>'/^[_a-zA-Z0-9-\.]+@[a-zA-Z0-9-\.]+\.[a-z]{2,4}$/', 'unique'=>Array('Email'), 'not_null' => '1', 'required'=>1, 'default' => '', 'error_msgs' => Array('invalid_format'=>'!la_invalid_email!', 'unique'=>'!lu_email_already_exist!') ),
 							        'CreatedOn' => Array('type'=>'int', 'formatter' => 'kDateFormatter', 'default' => '#NOW#', 'not_null' => '1' ),
 							        'Phone' => Array('type' => 'string','default' => ''),
+							        'Fax' => Array('type' => 'string','not_null' => '1','default' => ''),
 							        'Street' => Array('type' => 'string','default' => ''),
+							        'Street2' => Array('type' => 'string', 'not_null' => '1', 'default' => ''),
 							        'City' => Array('type' => 'string','default' => ''),
 							        'State' => Array('formatter'=>'kOptionsFormatter',
 							            							'options' => Array(),
 												            		'option_key_field'=>'DestAbbr','option_title_field'=>'Translation',
 												            		'not_null' => '1','default' => ''),
 							        'Zip' => Array('type' => 'string','default' => ''),
 							        'Country' => Array('formatter'=>'kOptionsFormatter',
 							            				'options_sql'=>'SELECT %1$s
 																				FROM '.TABLE_PREFIX.'StdDestinations
 																				LEFT JOIN '.TABLE_PREFIX.'Phrase
 																					ON '.TABLE_PREFIX.'Phrase.Phrase = '.TABLE_PREFIX.'StdDestinations.DestName
 																				WHERE
 																					DestType=1
 																					AND
 																					LanguageId = %2$s
 																				ORDER BY Translation',
 												            		'option_key_field'=>'DestAbbr','option_title_field'=>'Translation',
 												           'not_null' => '1','default' => ''),
 							        'ResourceId' => Array('type' => 'int','not_null' => '1','default' => '0'),
 							        'Status' => Array('type' => 'int', 'formatter'=>'kOptionsFormatter', 'options'=>Array(1=>'la_Enabled', 0=>'la_Disabled', 2=>'la_Pending'), 'use_phrases'=>1, 'not_null' => '1','default' => 2),
 							        'Modified' => Array('type' => 'int', 'formatter'=>'kDateFormatter', 'not_null' => '1', 'default' => '#NOW#' ),
 							        'dob' => Array('type'=>'int', 'formatter' => 'kDateFormatter', 'not_null' => '1', 'default' => '', 'required'=>1),
 							        'tz' => Array('type' => 'int','default' => ''),
 							        'ip' => Array('type' => 'string','default' => ''),
 							        'IsBanned' => Array('type' => 'int','not_null' => '1','default' => '0'),
 							        'PassResetTime' => Array('type' => 'int','default' => ''),
 							        'PwResetConfirm' => Array('type' => 'string','default' => ''),
 							        'PwRequestTime' => Array('type' => 'int','default' => ''),
 							        'MinPwResetDelay' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array('300' => '5', '600' => '10', '900' => '15', '1800' => '30', '3600' => '60'), 'use_phrases' => 0, 'not_null' => '1',  'default' => 30),
 							    ),
 
 					'VirtualFields'	=> 	Array(
 											'ValidateLogin' => Array('type'=>'string','default'=>''),
 											'SubscribeEmail' => Array('type'=>'string','default'=>''),
 										),
 
 					'Grids'	=> Array(),
 
 	);
 
 ?>
\ No newline at end of file

Property changes on: trunk/core/units/users/users_config.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.11
\ No newline at end of property
+1.12
\ No newline at end of property