Index: trunk/kernel/include/parseditem.php =================================================================== --- trunk/kernel/include/parseditem.php (revision 341) +++ trunk/kernel/include/parseditem.php (revision 342) @@ -1,2881 +1,2927 @@ <?php global $ItemTypePrefixes; $ItemTypePrefixes = array(); $ItemTagFiles = array(); function RegisterPrefix($class,$prefix,$file) { global $ItemTypePrefixes, $ItemTagFiles; $ItemTypePrefixes[$class] = $prefix; $ItemTagFiles[$prefix] = $file; } class clsParsedItem extends clsItemDB { var $TagPrefix; var $Parser; var $AdminParser; function clsParsedItem($id=NULL) { global $TemplateRoot; $this->clsItemDB(); $this->Parser = new clsTemplateList($TemplateRoot); $this->AdminParser = new clsAdminTemplateList(); } /* function ParseObject($element) { $extra_attribs = ExtraAttributes($element->attributes); if(strtolower($element->name)==$this->TagPrefix) { $field = strtolower($element->attributes["_field"]); $tag = $this->TagPrefix."_".$field; $ret = $this->parsetag($tag); } return $ret; } */ function ParseTimeStamp($d,$attribs=array()) { if( isset($attribs["_tz"]) ) { $d = GetLocalTime($d,$objSession->Get("tz")); } $part = isset($attribs["_part"]) ? strtolower($attribs["_part"]) : ''; if(strlen($part)) { $ret = ExtractDatePart($part,$d); } else { if($d<=0) { $ret = ""; } else $ret = LangDate($d); } return $ret; } function ParseObject($element) { global $objConfig, $objCatList, $var_list_update, $var_list, $n_var_list_update, $m_var_list_update; $extra_attribs = ExtraAttributes($element->attributes); $ret = ""; if ($this->TagPrefix == "email" && strtolower($element->name) == "touser") { $this->TagPrefix = "touser"; } if(strtolower($element->name)==$this->TagPrefix) { $field = strtolower($element->attributes["_field"]); switch($field) { case "id": $ret = $this->Get($this->id_field); break; case "resourceid": if(!$this->NoResourceId) $ret = $this->Get("ResourceId"); break; case "category": $c = $objCatList->GetItem($this->Get("CategoryId")); if(is_object($c)) { $ret = $c->parsetag($element->attributes["_cattag"]); } break; case "priority": if($this->Get("Priority")!=0) { $ret = (int)$this->Get("Priority"); } else $ret = ""; break; case "link": if(method_exists($this,"ItemURL")) { $ret = $this->ItemURL($element->attributes["_template"],FALSE,""); } break; case "cat_link": if(method_exists($this,"ItemURL")) { $ret = $this->ItemURL($element->attributes["_template"],TRUE,""); } break; case "fullpath": $ret = $this->Get("CachedNavbar"); if(!strlen($ret)) { if(is_numeric($this->Get("CategoryId"))) { $c = $objCatList->GetItem($this->Get("CategoryId")); if(is_object($c)) $ret = $c->Get("CachedNavbar"); } else { if(method_exists($this,"GetPrimaryCategory")) { $cat = $this->GetPrimaryCategory(); $c = $objCatList->GetItem($cat); if(is_object($c)) $ret = $c->Get("CachedNavbar"); } } } // $ret = $this->HighlightText($ret); break; case "relevance": $style = $element->attributes["_displaymode"]; if(!strlen($style)) $style = "numerical"; switch ($style) { case "numerical": $ret = (100 * LangNumber($this->Get("Relevance"),1))."%"; break; case "bar": $OffColor = $element->attributes["_offbackgroundcolor"]; $OnColor = $element->attributes["_onbackgroundcolor"]; $percentsOff = (int)(100 - (100 * $this->Get("Relevance"))); if ($percentsOff) { $percentsOn = 100 - $percentsOff; $ret = "<td width=\"$percentsOn%\" bgcolor=\"$OnColor\"><img src=\"img/s.gif\"></td><td width=\"$percentsOff%\" bgcolor=\"$OffColor\"><img src=\"img/s.gif\"></td>"; } else $ret = "<td width=\"100%\" bgcolor=\"$OnColor\"><img src=\"img/s.gif\"></td>"; break; case "graphical": $OnImage = $element->attributes["_onimage"]; if (!strlen($OnImage)) break; // Get image extension $image_data = explode(".", $OnImage); $image_ext = $image_data[count($image_data)-1]; unset($image_data[count($image_data)-1]); $rel = (10 * LangNumber($this->Get("Relevance"),1)); $OnImage1 = join(".", $image_data); if ($rel) $img_src = $OnImage1."_".$rel.".".$image_ext; else $img_src = $OnImage; $ret = "<img src=\"$img_src\" border=\"0\" alt=\"".(10*$rel)."\">"; break; } break; case "rating": $style = $element->GetAttributeByName("_displaymode"); if(!strlen($style)) $style = "numerical"; switch($style) { case "numerical": $ret = LangNumber($this->Get("CachedRating"),1); break; case "text": $ret = RatingText($this->Get("CachedRating")); break; case "graphical": $OnImage = $element->attributes["_onimage"]; $OffImage = $element->attributes["_offimage"]; $images = RatingTickImage($this->Get("CachedRating"),$OnImage,$OffImage); for($i=1;$i<=count($images);$i++) { $url = $images[$i]; if(strlen($url)) { $ret .= "<IMG src=\"$url\" $extra_attribs >"; $ret .= $element->attributes["_separator"]; } } break; } break; case "reviews": $today = FALSE; if(method_exists($this,"ReviewCount")) { if($element->GetAttributeByName("_today")) $today = TRUE; $ret = $this->ReviewCount($today); } else $ret = ""; break; case "votes": $ret = (int)$this->Get("CachedVotesQty"); break; case "favorite": if(method_exists($this,"IsFavorite")) { if($this->IsFavorite()) { $ret = $element->attributes["_label"]; if(!strlen($ret)) $ret = "lu_favorite"; $ret = language($ret); } else $ret = ""; } break; case "new": if(method_exists($this,"IsNewItem")) { if($this->IsNewItem()) { $ret = $element->GetAttributeByName('_label'); if(!strlen($ret)) $ret = "lu_new"; $ret = language($ret); } else $ret = ""; } break; case "pop": if(method_exists($this,"IsPopItem")) { if($this->IsPopItem()) { $ret = $element->attributes["_label"]; if(!strlen($ret)) $ret = "lu_pop"; $ret = language($ret); } else $ret = ""; } break; case "hot": if(method_exists($this,"IsHotItem")) { if($this->IsHotItem()) { $ret = $element->GetAttributeByName("_label"); if(!strlen($ret)) $ret = "lu_hot"; $ret = language($ret); } else $ret = ""; } break; case "pick": if($this->Get("EditorsPick")==1) { $ret = $element->GetAttributeByName('_label'); if(!strlen($ret)) $ret = "lu_pick"; $ret = language($ret); } else $ret = ""; break; case "admin_icon": if(method_exists($this,"StatusIcon")) { if($element->GetAttributeByName("fulltag")) { $ret = "<IMG $extra_attribs SRC=\"".$this->StatusIcon()."\">"; } else $ret = $this->StatusIcon(); } break; case "custom": if(method_exists($this,"GetCustomFieldValue")) { $field = $element->attributes["_customfield"]; $default = $element->attributes["_default"]; if (strlen($field)) $ret = $this->GetCustomFieldValue($field,$default); } break; case "image": $default = $element->attributes["_primary"]; $name = $element->attributes["_name"]; if(strlen($name)) { $img = $this->GetImageByName($name); } else { if($default) $img = $this->GetDefaultImage(); } if(is_object($img)) { if(strlen($element->attributes["_imagetemplate"])) { $ret = $img->ParseTemplate($element->attributes["_imagetemplate"]); break; } else { if($element->attributes["_thumbnail"]) { $url = $img->parsetag("thumb_url"); } else { if(!$element->attributes["_nothumbnail"]) { $url = $img->parsetag("image_url"); } else { $url = $img->FullURL(TRUE,""); } } } } else { $url = $element->attributes["_defaulturl"]; } if($element->attributes["_imagetag"]) { if(strlen($url)) { $ret = "<IMG src=\"$url\" $extra_attribs >"; } else $ret = ""; } else $ret = $url; break; default: $ret = "Undefined:".$element->name; break; } } else if ($this->TagPrefix == 'email'){ $ret = "Undefined:".$element->name; } return $ret; } function ParseString($name) { $el = new clsHtmlTag(); $el->Clear(); $el->prefix = "inp"; $el->name = $name; $numargs = func_num_args(); $arg_list = func_get_args(); for ($i = 1; $i < $numargs; $i++) { $attr = $arg_list[$i]; $parts = explode("=",$attr,2); $name = $parts[0]; $val = $parts[1]; $el->attributes[$name] = $val; } return $this->ParseObject($el); } /* pass attributes as strings ie: ParseStringEcho('tagname','_field="something" _data="somethingelse"'); */ function ParseStringEcho($name) { $el = new clsHtmlTag(); $el->Clear(); $el->prefix = "inp"; $el->name = $name; $numargs = func_num_args(); $arg_list = func_get_args(); for ($i = 1; $i < $numargs; $i++) { $attr = $arg_list[$i]; $parts = explode("=",$attr,2); $name = $parts[0]; $val = $parts[1]; $el->attributes[$name] = $val; } echo $this->ParseObject($el); } function ParseElement($raw, $inner_html ="") { $tag = new clsHtmlTag($raw); $tag->inner_html = $inner_html; if($tag->parsed) { if($tag->name=="include" || $tag->name=="perm_include" || $tag->name=="lang_include") { $output = $this->Parser->IncludeTemplate($tag); } else { $output = $this->ParseObject($tag); //echo $output."<br>"; if(substr($output,0,9)=="Undefined") { $output = $tag->Execute(); // if(substr($output,0,8)="{Unknown") // $output = $raw; } return $output; } } else return ""; } function AdminParseTemplate($file) { $html = ""; $t = $this->AdminParser->GetTemplate($file); if(is_object($t)) { array_push($this->AdminParser->stack,$file); $html = $t->source; $next_tag = strpos($html,"<inp:"); while($next_tag) { $end_tag = strpos($html,"/>",$next_tag); $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+2); $pre = substr($html,0,$next_tag); $post = substr($html,$end_tag+2); $inner = $this->ParseElement($tagtext); $html = $pre.$inner.$post; $next_tag = strpos($html,"<inp:"); } array_pop($this->AdminParser->stack); } return $html; } function ParseTemplateText($text) { $html = $text; $search = "<inp:".$this->TagPrefix; $next_tag = strpos($html,"<inp:"); //$next_tag = strpos($html,$search); while($next_tag) { $closer = strpos(strtolower($html),">",$next_tag); $end_tag = strpos($html,"/>",$next_tag); if($end_tag < $closer || $closer == 0) { $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+2); $pre = substr($html,0,$next_tag); $post = substr($html,$end_tag+2); $inner = $this->ParseElement($tagtext); $html = $pre.$inner.$post; } else { $OldTagStyle = "</inp>"; ## Try to find end of TagName $TagNameEnd = strpos($html, " ", $next_tag); ## Support Old version // $closer = strpos(strtolower($html),"</inp>",$next_tag); if ($TagNameEnd) { $Tag = strtolower(substr($html, $next_tag, $TagNameEnd-$next_tag)); $TagName = explode(":", $Tag); if (strlen($TagName[1])) $CloserTag = "</inp:".$TagName[1].">"; } else { $CloserTag = $OldTagStyle; } $closer = strpos(strtolower($html), $CloserTag, $next_tag); ## Try to find old tag closer if (!$closer && ($CloserTag != $OldTagStyle)) { $CloserTag = $OldTagStyle; $closer = strpos(strtolower($html), $CloserTag, $next_tag); } $end_tag = strpos($html,">",$next_tag); $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+1); $pre = substr($html,0,$next_tag); $inner = substr($html,$end_tag+1,$closer-($end_tag+1)); $post = substr($html,$end_tag+1+strlen($inner) + strlen($CloserTag)); //echo "PRE:". htmlentities($pre,ENT_NOQUOTES); //echo "INNER:". htmlentities($inner,ENT_NOQUOTES); //echo "POST:". htmlentities($post,ENT_NOQUOTES); $parsed = $this->ParseElement($tagtext); if(strlen($parsed)) { $html = $pre.$this->ParseTemplateText($inner).$post; } else $html = $pre.$post; } $next_tag = strpos($html,$search); } return $html; } function ParseTemplate($tname) { global $objTemplate, $LogLevel,$ptime,$timestart; LogEntry("Parsing $tname\n"); $LogLevel++; $html = ""; $t = $objTemplate->GetTemplate($tname); //$t = $this->Parser->GetTemplate($tname); if(is_object($t)) { array_push($this->Parser->stack,$tname); $html = $t->source; $html = $this->ParseTemplateText($html); array_pop($this->Parser->stack); } $LogLevel--; LogEntry("Finished Parsing $tname\n"); $ptime = round(getmicrotime() - $timestart,6); $xf = 867530; //Download ID if($xf != 0) { $x2 = substr($ptime,-6); $ptime .= $xf ^ $x2; //(1/1000); } return $html; } function SendUserEventMail($EventName,$ToUserId,$LangId=NULL,$RecptName=NULL) { global $objMessageList,$FrontEnd; $Event =& $objMessageList->GetEmailEventObject($EventName,0,$LangId); if(is_object($Event)) { if($Event->Get("Enabled")=="1" || ($Event->Get("Enabled")==2 && $FrontEnd)) { $Event->Item = $this; if(is_numeric($ToUserId)) { return $Event->SendToUser($ToUserId); } else return $Event->SendToAddress($ToUserId,$RecptName); } } } function SendAdminEventMail($EventName,$LangId=NULL) { global $objMessageList,$FrontEnd; //echo "Firing Admin Event $EventName <br>\n"; $Event =& $objMessageList->GetEmailEventObject($EventName,1,$LangId); if(is_object($Event)) { if($Event->Get("Enabled")=="1" || ($Event->Get("Enabled")==2 && $FrontEnd)) { $Event->Item = $this; //echo "Admin Event $EventName Enabled <br>\n"; return $Event->SendAdmin($ToUserId); } } } function parse_template($t) { } } class clsItemCollection { var $Items; var $CurrentItem; var $adodbConnection; var $classname; var $SourceTable; var $LiveTable; var $QueryItemCount; var $AdminSearchFields = array(); var $SortField; var $debuglevel; var $id_field = null; // id field for list item var $BasePermission; var $Dummy = null; function SetTable($action, $table_name = null) // new by Alex { // $action = {'live', 'restore','edit'} switch($action) { case 'live': $this->LiveTable = $table_name; $this->SourceTable = $this->LiveTable; break; case 'restore': $this->SourceTable = $this->LiveTable; break; case 'edit': global $objSession; $this->SourceTable = $objSession->GetEditTable($this->LiveTable); break; } } function &GetDummy() // new by Alex { if( !isset($this->Dummy) ) $this->Dummy =& new $this->classname(); $this->Dummy->tablename = $this->SourceTable; return $this->Dummy; } function clsItemCollection() { $this->adodbConnection = GetADODBConnection(); $this->Clear(); $this->BasePermission=""; } function GetIDField() // new by Alex { // returns id field for list item if( !isset($this->id_field) ) { $dummy =& $this->GetDummy(); $this->id_field = $dummy->IdField(); } return $this->id_field; } function &GetNewItemClass() { return new $this->classname(); } function Clear() { unset($this->Items); $this->Items = array(); $this->CurrentItem=0; } function &SetCurrentItem($id) { $this->CurrentItem=$id; return $this->GetItem($id); } function &GetCurrentItem() { if($this->CurrentItem>0) { return $this->GetItem($this->CurrentItem); } else return FALSE; } function NumItems() { if(is_array($this->Items)) { // echo "TEST COUNT: ".count($this->Items)."<BR>"; return count($this->Items); } else return 0; } function ItemLike($index, $string) { // check if any of the item field // even partially matches $string $found = false; $string = strtolower($string); $item_data = $this->Items[$index]->GetData(); foreach($item_data as $field => $value) if( in_array($field, $this->AdminSearchFields) ) if( strpos(strtolower($value), $string) !== false) { $found = true; break; } return $found; } function DeleteItem($index) // by Alex { // deletes item with specific index from list $i = $index; $item_count = $this->NumItems(); while($i < $item_count - 1) { $this->Items[$i] = $this->Items[$i + 1]; $i++; } unset($this->Items[$i]); } function ShowItems() { $i = 0; $item_count = $this->NumItems(); while($i < $item_count) { echo "Item No <b>$i</b>:<br>"; $this->Items[$i]->PrintVars(); $i++; } } function SwapItems($Index,$Index2) { $temp = $this->Items[$Index]->GetData(); $this->Items[$Index]->SetData($this->Items[$Index2]->GetData()); $this->Items[$Index2]->SetData($temp); } function CopyResource($OldId,$NewId) { $this->Clear(); $sql = "SELECT * FROM ".$this->SourceTable." WHERE ResourceId=$OldId"; $this->Query_Item($sql); // echo $sql."<br>\n"; if($this->NumItems()>0) { foreach($this->Items as $item) { $item->UnsetIdField(); $item->Set("ResourceId",$NewId); $item->Create(); } } } function ItemsOnClipboard() { global $objSession; $clip = $objSession->GetPersistantVariable("ClipBoard"); $count = 0; $table = $this->SourceTable; $prefix = GetTablePrefix(); if(substr($table,0,strlen($prefix))==$prefix) $table = substr($table,strlen($prefix)); if(strlen($clip)) { $clipboard = ParseClipboard($clip); if($clipboard["table"] == $table) { $count = count(explode(",",$clipboard["ids"])); } else $count = 0; } else $count = 0; return $count; } function CopyToClipboard($command,$idfield, $idlist) { global $objSession,$objCatList; if(is_array($idlist)) { $list = implode(",",$idlist); } else $list = $idlist; $clip = $command."-".$objCatList->CurrentCategoryID().".".$this->SourceTable.".$idfield=".$list; $objSession->SetVariable("ClipBoard",$clip); } function SortItems($asc=TRUE) { $done = FALSE; $field = $this->SortField; $ItemCount = $this->NumItems(); while(!$done) { $done=TRUE; for($i=1;$i<$this->NumItems();$i++) { $doswap = FALSE; if($asc) { $val1 = $this->Items[$i-1]->Get($field); $val2 = $this->Items[$i]->Get($field); $doswap = ($val1 > $val2); } else { $val1 = $this->Items[$i-1]->Get($field); $val2 = $this->Items[$i]->Get($field); $doswap = ($val1 < $val2); } if($doswap) { $this->SwapItems($i-1,$i); $done = FALSE; } } } } function &GetItem($ID,$LoadFromDB=TRUE) { $found=FALSE; if(is_array($this->Items) && count($this->Items) ) { for($x=0;$x<count($this->Items);$x++) { $i =& $this->GetItemRefByIndex($x); if($i->UniqueID()==$ID) { $found=TRUE; break; } } } if(!$found) { if($LoadFromDB) { $n = NULL; $n = new $this->classname(); $n->tablename = $this->SourceTable; $n->LoadFromDatabase($ID); $index = array_push($this->Items, $n); $i =& $this->Items[count($this->Items)-1]; } else $i = FALSE; } return $i; } function GetItemByIndex($index) { return $this->Items[$index]; } function &GetItemRefByIndex($index) { return $this->Items[$index]; } function &GetItemByField($Field,$Value,$LoadFromDB=TRUE) { $found=FALSE; if(is_array($this->Items)) { foreach($this->Items as $i) { if($i->Get($Field)==$Value) { $found = TRUE; break; } } } if(!$found && $LoadFromDB==TRUE) { $sql = "SELECT * FROM ".$this->SourceTable." WHERE $Field = '$Value'"; //echo $sql; $res = $this->adodbConnection->Execute($sql); if($res && !$res->EOF) { $i = $this->AddItemFromArray($res->fields); $i->tablename = $this->SourceTable; $i->Clean(); } else $i = FALSE; } return $i; } function GetPage($Page, $ItemsPerPage) { $result = array_slice($this->Items, ($Page * $ItemsPerPage) - $ItemsPerPage, $ItemsPerPage); return $result; } function GetNumPages($ItemsPerPage) { if( isset($_GET['reset']) && $_GET['reset'] == 1) $this->Page = 1; return GetPageCount($ItemsPerPage,$this->QueryItemCount); } function &AddItemFromArray($data, $clean=FALSE) { $class = new $this->classname; $class->SetFromArray($data); $class->tablename = $this->SourceTable; if($clean==TRUE) $class->Clean(); //array_push($this->Items,$class); $this->Items[] =& $class; return $class; } function Query_Item($sql, $offset=-1,$rows=-1) { global $Errors; $dummy =& $this->GetDummy(); if( !$dummy->TableExists() ) { if($this->debuglevel) echo "ERROR: table <b>".$dummy->tablename."</b> missing.<br>"; $this->Clear(); return false; } if($rows>-1 && $offset>-1) { //echo "<b>Executing SelectLimit</b> $sql <b>Offset:</b> $offset,$rows<br>\n"; $result = $this->adodbConnection->SelectLimit($sql, $rows,$offset); } else { $result = $this->adodbConnection->Execute($sql); } if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Query_Item"); echo '<br><br>'.$sql.'<br><br>'; echo "Error: ".$this->adodbConnection->ErrorMsg()."<br>"; return false; } $this->Clear(); if($this->debuglevel > 0) { echo "This SQL: $sql<br>"; if( ($this->debuglevel > 1) && ($result->RecordCount() > 0) ) { echo '<pre>'.print_r($result->GetRows(), true).'</pre>'; $result->MoveFirst(); } } LogEntry("SQL Loop Start\n"); $count = 0; while ($result && !$result->EOF) { $count++; $data = $result->fields; $this->AddItemFromArray($data,TRUE); if( defined('ADODB_EXTENSION') && constant('ADODB_EXTENSION') > 0 ) adodb_movenext($result); else $result->MoveNext(); } LogEntry("SQL Loop End ($count iterations)\n"); return $this->Items; } function GetOrderClause($FieldVar,$OrderVar,$DefaultField,$DefaultVar,$Priority=TRUE,$UseTableName=FALSE) { global $objConfig, $objSession; if($UseTableName) { $TableName = $this->SourceTable."."; } else $TableName = ""; $PriorityClause = $TableName."EditorsPick DESC, ".$TableName."Priority DESC"; if(strlen(trim($FieldVar))>0) { if(is_object($objSession)) { if(strlen($objSession->GetPersistantVariable($FieldVar))>0) { $OrderBy = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". $objSession->GetPersistantVariable($OrderVar)); $FieldUsed = $objSession->GetPersistantVariable($FieldVar); } } $OrderBy = trim($OrderBy); if (strlen(trim($OrderBy))==0) { if(!$UseTableName) { $OrderBy = trim($DefaultField." ".$DefaultVar); } else { if(strlen(trim($DefaultField))>0) { $OrderBy = $this->SourceTable.".".$DefaultField.".".$DefaultVar; } $FieldUsed=$DefaultField; } } } if(($FieldUsed != "Priority" || strlen($OrderBy)==0) && $Priority==TRUE) { if(strlen($OrderBy)==0) { $OrderBy = $PriorityClause; } else $OrderBy = $PriorityClause.", ".$OrderBy; } return $OrderBy; } function GetResourceIDList() { $ret = array(); foreach($this->Items as $i) array_push($ret,$i->Get("ResourceId")); return $ret; } function GetFieldList($field) { $ret = array(); foreach($this->Items as $i) array_push($ret,$i->Get($field)); return $ret; } function SetCommonField($FieldName,$FieldValue) { for($i=0;$i<$this->NumItems();$i++) { $this->Items[$i]->Set($FieldName,$fieldValue); $this->Items[$i]->Update(); } } function ClearCategoryItems($CatId,$CatTable = "CategoryItems") { $CatTable = AddTablePrefix($CatTable); $sql = "SELECT * FROM ".$this->SourceTable." INNER JOIN $CatTable ". " ON (".$this->SourceTable.".ResourceId=$CatTable.ItemResourceId) WHERE CategoryId=$CatId"; $this->Clear(); $this->Query_Item($sql); if($this->NumItems()>0) { foreach($this->Items as $i) { $i->DeleteCategoryItems($CatId,$CatTable); } } } function CopyToEditTable($idfield = null, $idlist = 0) { global $objSession; if($idfield == null) $idfield = $this->GetIDField(); $edit_table = $objSession->GetEditTable($this->SourceTable); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); if(is_array($idlist)) { $list = implode(",",$idlist); } else $list = $idlist; $query = "SELECT * FROM ".$this->SourceTable." WHERE $idfield IN ($list)"; $insert = "CREATE TABLE ".$edit_table." ".$query; if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($insert,ENT_NOQUOTES)."<br>\n"; $this->adodbConnection->Execute($insert); } function CreateEmptyEditTable($idfield = null) { global $objSession; if($idfield == null) $idfield = $this->GetIDField(); $edit_table = $objSession->GetEditTable($this->SourceTable); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); $query = "SELECT * FROM ".$this->SourceTable." WHERE $idfield = -1"; $insert = "CREATE TABLE ".$edit_table." ".$query; if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($insert,ENT_NOQUOTES)."<br>\n"; $this->adodbConnection->Execute($insert); } function CopyFromEditTable($idfield = null) { global $objSession; $dropRelTableFlag = false; if($idfield == null) $idfield = $this->GetIDField(); $edit_table = $objSession->GetEditTable($this->SourceTable); $sql = "SELECT * FROM $edit_table"; $rs = $this->adodbConnection->Execute($sql); echo $sql."<BR>"; while($rs && !$rs->EOF) { $data = $rs->fields; $c = new $this->classname; $c->SetFromArray($data); $c->idfield = $idfield; $c->Dirty(); if($c->Get($idfield)<1) { $old_id = $c->Get($idfield); $c->UnsetIdField(); if(!is_numeric($c->Get("OrgId")) || $c->Get("OrgId")==0) { $c->Clean(array("OrgId")); } else { if($c->Get("Status") != -2) { $org = new $this->classname(); $org->LoadFromDatabase($c->Get("OrgId")); $org->DeleteCustomData(); $org->Delete(TRUE); $c->Set("OrgId",0); } } $c->Create(); } if(is_numeric($c->Get("ResourceId"))) { if( isset($c->Related) && is_object($c->Related) ) { $r = $c->Related; $r->CopyFromEditTable($c->Get("ResourceId")); $dropRelTableFlag = true; } unset($r); if( isset($c->Reviews) && is_object($c->Reviews) ) { $r = $c->Reviews; $r->CopyFromEditTable($c->Get("ResourceId")); } } if(!is_numeric($c->Get("OrgId")) || $c->Get("OrgId")==0) { $c->Clean(array("OrgId")); } else { if($c->Get("Status") != -2) { $org = new $this->classname(); $org->LoadFromDatabase($c->Get("OrgId")); $org->DeleteCustomData(); $org->Delete(TRUE); $c->Set("OrgId",0); } } if(method_exists($c,"CategoryMemberList")) { $cats = $c->CategoryMemberList($objSession->GetEditTable("CategoryItems")); $ci_table = $objSession->GetEditTable('CategoryItems'); $primary_cat = $c->GetPrimaryCategory($ci_table); $c->Update(); UpdateCategoryItems($c,$cats,$primary_cat); } else $c->Update(); unset($c); unset($r); $rs->MoveNext(); } if ($dropRelTableFlag) { $objRelGlobal = new clsRelationshipList(); $objRelGlobal->PurgeEditTable(); } if($edit_table) @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS ".$objSession->GetEditTable("CategoryItems")); } function GetNextTempID() { // get next temporary id (lower then zero) from temp table $db =& $this->adodbConnection; $sql = 'SELECT MIN(%s) AS MinValue FROM %s'; return $db->GetOne( sprintf($sql, $this->GetIDField(), $this->SourceTable) ) - 1; } function PurgeEditTable($idfield = null) { global $objSession; if($idfield == null) $idfield = $this->GetIDField(); $edit_table = $objSession->GetEditTable($this->SourceTable); /* $rs = $this->adodbConnection->Execute("SELECT * FROM $edit_table"); while($rs && !$rs->EOF) { $data = $rs->fields; $c = new $this->classname; $c->SetFromArray($data); $c->id_field = $idfield; $c->tablename = $edit_table; $c->Delete(); $rs->MoveNext(); }*/ @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS ".$objSession->Get("CategoryItems")); } function CopyCatListToEditTable($idfield, $idlist) { global $objSession; $edit_table = $objSession->GetEditTable("CategoryItems"); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); if(is_array($idlist)) { $list = implode(",",$idlist); } else $list = $idlist; $query = "SELECT * FROM ".GetTablePrefix()."CategoryItems WHERE $idfield IN ($list)"; $insert = "CREATE TABLE ".$edit_table." ".$query; if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($insert,ENT_NOQUOTES)."<br>\n"; $this->adodbConnection->Execute($insert); } function CreateEmptyCatListTable($idfield) { global $objSession; $edit_table = $objSession->GetEditTable("CategoryItems"); @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); $query = "SELECT * FROM ".GetTablePrefix()."CategoryItems WHERE $idfield = -1"; $insert = "CREATE TABLE ".$edit_table." ".$query; if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($insert,ENT_NOQUOTES)."<br>\n"; $this->adodbConnection->Execute($insert); } function PurgeCatListEditTable() { global $objSession; $edit_table = $objSession->GetEditTable("CategoryItems"); $this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table"); } function AdminSearchWhereClause($SearchList) { $sql = ""; if( !is_array($SearchList) ) $SearchList = explode(",",$SearchList); if( !count($SearchList) || !count($this->AdminSearchFields) ) return ''; for($f = 0; $f < count($SearchList); $f++) { $value = $SearchList[$f]; if( strlen($value) ) { $inner_sql = ""; for($i = 0; $i < count($this->AdminSearchFields); $i++) { $field = $this->AdminSearchFields[$i]; if( strlen( trim($value) ) ) { if( strlen($inner_sql) ) $inner_sql .= " OR "; $inner_sql .= $field." LIKE '%".$value."%'"; } } if( strlen($inner_sql) ) { $sql .= '('.$inner_sql.') '; if($f < count($SearchList) - 1) $sql .= " AND "; } } } return $sql; } function BackupData($OutFileName,$Start,$Limit) { $fp=fopen($Outfile,"a"); if($fp) { if($Start==1) { $sql = "DELETE FROM ".$this->SourceTable; fputs($fp,$sql); } $this->Query_Item("SELECT * FROM ".$this->SourceTable." LIMIT $Start, $Limit"); foreach($this->Items as $i) { $sql = $i->CreateSQL(); fputs($fp,$sql); } fclose($fp); $this->Clear(); } } function RestoreData($InFileName,$Start,$Limit) { $res = -1; $fp=fopen($InFileName,"r"); if($fp) { fseek($fp,$Start); $Line = 0; while($Line < $Limit) { $sql = fgets($fp,16384); $this->adodbConnection->Execute($sql); $Line++; } $res = ftell($fp); fclose($fp); } return $res; } function Delete_Item($Id) { global $objCatList; $l =& $this->GetItem($Id); $l->BasePermission=$this->BasePermission; $l->DeleteCategoryItems($objCatList->CurrentCategoryID()); } function Move_Item($Id, $OldCat, $ParentTo) { global $objCatList; $l = $this->GetItem($Id); $l->BasePermission=$this->BasePermission; $l->AddtoCategory($ParentTo); $l->RemoveFromCategory($OldCat); } function Copy_Item($Id, $ParentTo) { $l = $this->GetItem($Id); $l->BasePermission=$this->BasePermission; $l->AddtoCategory($ParentTo); } }/* clsItemCollection */ class clsItemList extends clsItemCollection { var $Page; var $PerPageVar; var $DefaultPerPage; // use this perpage value in case if no found in config var $EnablePaging; var $MaxListCount = 0; var $PageEnvar; var $PageEnvarIndex; var $ListType; function clsItemList() { $this->clsItemCollection(); $this->EnablePaging = TRUE; $this->PageEnvarIndex = "p"; } function GetPageLimitSQL() { global $objConfig; $limit = NULL; if($this->EnablePaging) { if($this->Page<1) $this->Page=1; //echo "Limited to ".$objConfig->Get($this->PerPageVar)." items per page<br>\n"; if(is_numeric($objConfig->Get($this->PerPageVar))) { $Start = ($this->Page-1)*$objConfig->Get($this->PerPageVar); $limit = "LIMIT ".$Start.",".$objConfig->Get($this->PerPageVar); } else $limit = NULL; } else { if($this->MaxListCount) { $limit = "LIMIT 0, $MaxListCount"; } } return $limit; } function GetPageOffset() { $Start = 0; if($this->EnablePaging) { if($this->Page < 1) $this->Page = 1; $PerPage = $this->GetPerPage(); $Start = ($this->Page - 1) * $PerPage; } else { if((int)$this->MaxListCount == 0) $Start = -1; } return $Start; } function GetPageRowCount() { if($this->EnablePaging) { if($this->Page < 1) $this->Page = 1; return $this->GetPerPage(); } else return (int)$this->MaxListCount; } function Query_Item($sql,$limit = null, $fix_method = 'set_first') { // query itemlist (module items) using $sql specified // apply direct limit clause ($limit) or calculate it if not specified // fix invalid page in case if needed by method specified in $fix_method if(strlen($limit)) { $sql .= " ".$limit; return parent::Query_Item($sql); } else { //echo "page fix pre (class: ".get_class($this).")<br>"; $this->QueryItemCount = QueryCount($sql); // must get total item count before fixing $this->FixInvalidPage($fix_method); return parent::Query_Item($sql,$this->GetPageOffset(),$this->GetPageRowCount()); } } function Query_List($whereClause,$orderByClause=NULL,$JoinCats=TRUE,$fix_method='set_first') { global $objSession, $Errors; if($JoinCats) { $cattable = GetTablePrefix()."CategoryItems"; $t = $this->SourceTable; $sql = "SELECT *,CategoryId FROM $t INNER JOIN $cattable ON $cattable.ItemResourceId=$t.ResourceId"; } else $sql = "SELECT * FROM ". $this->SourceTable; if(trim($whereClause)!="") { if(isset($whereClause)) $sql = sprintf('%s WHERE %s',$sql,$whereClause); } if(strlen($orderByClause)>0) { if(substr($orderByClause,0,8)=="ORDER BY") { $sql .= " ".$orderByClause; } else { $sql .= " ORDER BY $orderByClause"; } } if($objSession->HasSystemPermission("DEBUG.LIST")) echo $sql."<br>\n"; return $this->Query_Item($sql, null, $fix_method); } function GetPerPage() { // return category perpage global $objConfig; $PerPage = $objConfig->Get( $this->PerPageVar ); if( !is_numeric($PerPage) ) $PerPage = $this->DefaultPerPage ? $this->DefaultPerPage : 10; return $PerPage; } function FixInvalidPage($fix_method = 'set_first') { // in case if current page > total page count, // then set current page to last possible "set_last" // or first possible "set_first" $PerPage = $this->GetPerPage(); $NumPages = ceil( $this->GetNumPages($PerPage) ); /* echo "=====<br>"; echo "Class <b>".get_class($this)."</b>: Page ".$this->Page." of $NumPages<br>"; echo "PerPage: $PerPage<br>"; echo "Items Queries: ".$this->QueryItemCount."<br>"; echo "=====<br>"; */ if($this->Page > $NumPages) { switch($fix_method) { case 'set_first': $this->Page = 1; //echo "Move 2 First (class <b>".get_class($this)."</b>)<br>"; break; case 'set_last': $this->Page = $NumPages; //echo "Move 2 Last (class <b>".get_class($this)."</b>)<br>"; break; } $this->SaveNewPage(); } } function SaveNewPage() { // redefine in each list, should save to env array new page value } function GetPageLinkList($dest_template=NULL,$page = "",$PagesToList=10, $HideEmpty=TRUE) { global $objConfig, $var_list_update, $var_list; $v= $this->PageEnvar; global ${$v}; if(!strlen($page)) $page = GetIndexURL(); $PerPage = $objConfig->Get($this->PerPageVar); if($PerPage<1) $PerPage=20; $NumPages = ceil($this->GetNumPages($PerPage)); if($NumPages==1 && $HideEmpty) return ""; if(strlen($dest_template)) { $var_list_update["t"] = $dest_template; } else $var_list_update["t"] = $var_list["t"]; $o = ""; if($this->Page==0 || !is_numeric($this->Page)) $this->Page=1; if($this->Page>$NumPages) $this->Page=$NumPages; $StartPage = (int)$this->Page - ($PagesToList/2); if($StartPage<1) $StartPage=1; $EndPage = $StartPage+($PagesToList-1); if($EndPage>$NumPages) { $EndPage = $NumPages; $StartPage = $EndPage-($PagesToList-1); if($StartPage<1) $StartPage=1; } $o = ""; if($StartPage>1) { ${$v}[$this->PageEnvarIndex] = $this->Page-$PagesToList; $prev_url = $page."?env=".BuildEnv(); $o .= "<A HREF=\"$prev_url\"><<</A>"; } for($p=$StartPage;$p<=$EndPage;$p++) { if($p!=$this->Page) { ${$v}[$this->PageEnvarIndex]=$p; $href = $page."?env=".BuildEnv(); $o .= " <A HREF=\"$href\">$p</A> "; } else { $o .= " <SPAN class=\"current-page\">$p</SPAN>"; } } if($EndPage<$NumPages && $EndPage>0) { ${$v}[$this->PageEnvarIndex]=$this->Page+$PagesToList; $next_url = $page."?env=".BuildEnv(); $o .= "<A HREF=\"$next_url\"> >></A>"; } unset(${$v}[$this->PageEnvarIndex],$var_list_update["t"] ); return $o; } function GetAdminPageLinkList($url) { global $objConfig; $update =& $GLOBALS[$this->PageEnvar]; // env_var_update // insteresting stuff :) if(!$this->PerPageVar) $this->PerPageVar = "Perpage_Links"; $PerPage = $objConfig->Get($this->PerPageVar); if($PerPage < 1) $PerPage = 20; $NumPages = ceil($this->GetNumPages($PerPage)); //echo $this->CurrentPage." of ".$NumPages." Pages"; if($this->Page > $NumPages) $this->Page = $NumPages; $StartPage = $this->Page - 5; if($StartPage < 1) $StartPage = 1; $EndPage = $StartPage + 9; if($EndPage > $NumPages) { $EndPage = $NumPages; $StartPage = $EndPage-9; if($StartPage < 1) $StartPage = 1; } $o = ''; if($StartPage > 1) { $update[$this->PageEnvarIndex]= $this->Page - 10; $prev_url = $url.'?env='.BuildEnv(); $o .= '<a href="'.$prev_url.'"><<</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.'"> >></a>'; } unset( $update[$this->PageEnvarIndex] ); return $o; } } function ParseClipboard($clip) { $ret = array(); $parts = explode(".",$clip,3); $command = $parts[0]; $table = $parts[1]; $prefix = GetTablePrefix(); if(substr($table,0,strlen($prefix))==$prefix) $table = substr($table,strlen($prefix)); $subparts = explode("=",$parts[2],2); $idfield = $subparts[0]; $idlist = $subparts[1]; $cmd = explode("-",$command); $ret["command"] = $cmd[0]; $ret["source"] = $cmd[1]; $ret["table"] = $table; $ret["idfield"] = $idfield; $ret["ids"] = $idlist; //print_pre($ret); return $ret; } function UpdateCategoryItems($item,$NewCatList,$PrimaryCatId = false) { global $objCatList; $CurrentList = explode(",",$item->CategoryMemberList()); $del_list = array(); $ins_list = array(); if(!is_array($NewCatList)) { if(strlen(trim($NewCatList))==0) $NewCatList = $objCatList->CurrentCategoryID(); $NewCatList = explode(",",$NewCatList); } //print_r($NewCatList); for($i=0;$i<count($NewCatList);$i++) { $cat = $NewCatList[$i]; if(!in_array($cat,$CurrentList)) $ins_list[] = $cat; } for($i=0;$i<count($CurrentList);$i++) { $cat = $CurrentList[$i]; if(!in_array($cat,$NewCatList)) $del_list[] = $cat; } for($i=0;$i<count($ins_list);$i++) { $cat = $ins_list[$i]; $item->AddToCategory($cat); } for($i=0;$i<count($del_list);$i++) { $cat = $del_list[$i]; $item->RemoveFromCategory($cat); } if($PrimaryCatId !== false) $item->SetPrimaryCategory($PrimaryCatId); } class clsCatItemList extends clsItemList { var $PerPageVarLong; var $PerPageShortVar; var $Query_SortField; var $Query_SortOrder; var $ItemType; function clsCatItemList() { $this->ClsItemList(); $this->Query_SortField = array(); $this->Query_SortOrder = array(); } function QueryOrderByClause($EditorsPick=FALSE,$Priority=FALSE,$UseTableName=FALSE) { global $objSession; if($UseTableName) { $TableName = $this->SourceTable."."; } else { $TableName = ""; } $Orders = array(); if($EditorsPick) { $Orders[] = $TableName."EditorsPick DESC"; } if($Priority) { $Orders[] = $TableName."Priority DESC"; } if(count($this->Query_SortField)>0) { for($x=0; $x<count($this->Query_SortField); $x++) { $FieldVar = $this->Query_SortField[$x]; $OrderVar = $this->Query_SortOrder[$x]; if(is_object($objSession)) { $FieldVarData = $objSession->GetPersistantVariable($FieldVar); if(strlen($FieldVarData)>0) { $Orders[] = trim($TableName.$objSession->GetPersistantVariable($FieldVar) . " ". $objSession->GetPersistantVariable($OrderVar)); } } } } if(count($Orders)>0) { $OrderBy = "ORDER BY ".implode(", ",$Orders); } else $OrderBy=""; return $OrderBy; } function AddSortField($SortField, $SortOrder) { if(strlen($SortField)) { $this->Query_SortField[] = $SortField; $this->Query_SortOrder[] = $SortOrder; } } function ClearSortFields() { $this->Query_SortField = array(); $this->Query_SortOrder = array(); } /* skeletons in this closet */ function GetNewValue($CatId=NULL) { return 0; } function GetPopValue($CategoryId=NULL) { return 0; } /* end of skeletons */ function GetCountSQL($PermName,$CatId=NULL, $GroupId=NULL, $AdditonalWhere="") { global $objSession, $objPermissions, $objCatList; $ltable = $this->SourceTable; $acl = $objSession->GetACLClause(); $cattable = GetTablePrefix()."CategoryItems"; $CategoryTable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $VIEW = $objPermissions->GetPermId($PermName); $sql = "SELECT count(*) as CacheVal FROM $ltable "; $sql .="INNER JOIN $cattable ON ($cattable.ItemResourceId=$ltable.ResourceId) "; $sql .="INNER JOIN $CategoryTable ON ($CategoryTable.CategoryId=$cattable.CategoryId) "; $sql .="INNER JOIN $ptable ON ($cattable.CategoryId=$ptable.CategoryId) "; $sql .="WHERE ($acl AND PermId=$VIEW AND $cattable.PrimaryCat=1 AND $CategoryTable.Status=1) "; if(strlen($AdditonalWhere)>0) { $sql .= "AND (".$AdditonalWhere.")"; } return $sql; } function SqlCategoryList($attribs = array()) { $CatTable = GetTablePrefix()."CategoryItems"; $t = $this->SourceTable; $sql = "SELECT *,$CatTable.CategoryId FROM $t INNER JOIN $CatTable ON $CatTable.ItemResourceId=$t.ResourceId "; $sql .="WHERE ($CatTable.CategoryId=".$catid." AND $t.Status=1)"; return $sql; } function CategoryCount($attribs=array()) { global $objCatList, $objCountCache; $cat = $attribs["_catid"]; if(!is_numeric($cat)) { $cat = $objCatList->CurrentCategoryID(); } if((int)$cat>0) $c = $objCatList->GetCategory($cat); $CatTable = GetTablePrefix()."CategoryItems"; $t = $this->SourceTable; $sql = "SELECT count(*) as MyCount FROM $t INNER JOIN $CatTable ON ($CatTable.ItemResourceId=$t.ResourceId) "; if($attribs["_subcats"]) { $ctable = $objCatList->SourceTable; $sql .= "INNER JOIN $ctable ON ($CatTable.CategoryId=$ctable.CategoryId) "; $sql .= "WHERE (ParentPath LIKE '".$c->Get("ParentPath")."%' "; if(!$attribs["_countcurrent"]) { $sql .=" AND $ctable.CategoryId != $cat) "; } else $sql .=") "; } else $sql .="WHERE ($CatTable.CategoryId=".$cat." AND $t.Status=1) "; if($attribs["_today"]) { $today = mktime(0,0,0,date("m"),date("d"),date("Y")); $sql .= "AND ($t.CreatedOn>=$today) "; } //echo $sql."<br><br>\n"; $rs = $this->adodbConnection->Execute($sql); $ret = ""; if($rs && !$rs->EOF) $ret = (int)$rs->fields["MyCount"]; return $ret; } function SqlGlobalCount($attribs=array()) { global $objSession; $p = $this->BasePermission.".VIEW"; $t = $this->SourceTable; if($attribs["_today"]) { $today = mktime(0,0,0,date("m"),date("d"),date("Y")); $where = "($t.CreatedOn>=$today)"; } if($attribs["_grouponly"]) { $GroupList = $objSession->Get("GroupList"); } else $GroupList = NULL; $sql = $this->GetCountSQL($p,NULL,$GroupList,$where); return $sql; } function DoGlobalCount($attribs) { global $objCountCache; $cc = $objCountCache->GetValue($this->CacheListType("_"),$this->ItemType,$this->CacheListExtraId("_"),(int)$attribs["_today"], 3600); if(!is_numeric($cc)) { $sql = $this->SqlGlobalCount($attribs); $ret = QueryCount($sql); $objCountCache->SetValue($this->CacheListType("_"),$this->ItemType,$this->CacheListExtraId("_"),(int)$attribs["_today"],$ret); } else $ret = $cc; return $ret; } function CacheListExtraId($ListType) { global $objSession; if(!strlen($ListType)) $ListType="_"; switch($ListType) { case "_": $ExtraId = $objSession->Get("GroupList"); break; case "category": $ExtraId = $objSession->Get("GroupList"); break; case "myitems": $ExtraId = $objSession->Get("PortalUserId"); break; case "hot": $ExtraId = $objSession->Get("GroupList"); break; case "pop": $ExtraId = $objSession->Get("GroupList"); break; case "pick": $ExtraId = $objSession->Get("GroupList"); break; case "favorites": $ExtraId = $objSession->Get("PortalUserId"); break; case "new": $ExtraId = $objSession->Get("GroupList"); break; } return $ExtraId; } function CacheListType($ListType) { if(!strlen($ListType)) $ListType="_"; switch($ListType) { case "_": $ListTypeId = 0; break; case "category": $ListTypeId = 1; break; case "myitems": $ListTypeId = 2; break; case "hot": $ListTypeId = 3; break; case "pop": $ListTypeId = 4; break; case "pick": $ListTypeId = 5; break; case "favorites": $ListTypeId = 6; break; case "new": $ListTypeId = 8; break; } return $ListTypeId; } function PerformItemCount($attribs=array()) { global $objCountCache, $objSession; $ret = ""; $ListType = $attribs["_listtype"]; if(!strlen($ListType)) $ListType="_"; $ListTypeId = $this->CacheListType($ListType); //echo "ListType: $ListType ($ListTypeId)<br>\n"; $ExtraId = $this->CacheListExtraId($ListType); switch($ListType) { case "_": $ret = $this->DoGlobalCount($attribs); break; case "category": $ret = $this->CategoryCount($attribs); break; case "myitems": $sql = $this->SqlMyItems($attribs); break; case "hot": $sql = $this->SqlHotItems($attribs); break; case "pop": $sql = $this->SqlPopItems($attribs); break; case "pick": $sql = $this->SqlPickItems($attribs); break; case "favorites": $sql = $this->SqlFavorites($attribs); break; case "search": $sql = $this->SqlSearchItems($attribs); break; case "new": $sql = $this->SqlNewItems($attribs); break; } //echo "SQL: $sql<br>"; if(strlen($sql)) { if(is_numeric($ListTypeId)) { $cc = $objCountCache->GetValue($ListTypeId,$this->ItemType,$ExtraId,(int)$attribs["_today"], 3600); if(!is_numeric($cc) || $attribs['_nocache'] == 1) { $ret = QueryCount($sql); $objCountCache->SetValue($ListTypeId,$this->ItemType,$ExtraId,(int)$attribs["_today"],$ret); } else $ret = $cc; } else $ret = QueryCount($sql); } return $ret; } function GetJoinedSQL($PermName, $CatId=NULL, $AdditionalWhere="") { global $objSession, $objPermissions; $ltable = $this->SourceTable; $acl = $objSession->GetACLClause(); $cattable = GetTablePrefix()."CategoryItems"; $CategoryTable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $VIEW = $objPermissions->GetPermId($PermName); $sql ="INNER JOIN $cattable ON ($cattable.ItemResourceId=$ltable.ResourceId) "; $sql .="INNER JOIN $CategoryTable ON ($CategoryTable.CategoryId=$cattable.CategoryId) "; $sql .= "INNER JOIN $ptable ON ($cattable.CategoryId=$ptable.CategoryId) "; $sql .="WHERE ($acl AND PermId=$VIEW AND PrimaryCat=1 AND $CategoryTable.Status=1) "; if(is_numeric($CatId)) { $sql .= " AND ($CategoryTable.CategoryId=$CatId) "; } if(strlen($AdditionalWhere)>0) { $sql .= "AND (".$AdditionalWhere.")"; } return $sql; } function CountFavorites($attribs) { if($attribs["_today"]) { global $objSession, $objConfig, $objPermissions; $acl = $objSession->GetACLClause(); $favtable = GetTablePrefix()."Favorites"; $ltable = $this->SourceTable; $cattable = GetTablePrefix()."CategoryItems"; $CategoryTable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $today = mktime(0,0,0,date("m"),date("d"),date("Y")); $where = "PortalUserId=".$objSession->Get("PortalUserId")." AND $ltable.Status=1"; $where .= " AND $favtable.Modified >= $today AND ItemTypeId=".$this->ItemType; $p = $this->BasePermission.".VIEW"; $sql = "SELECT $ltable.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $favtable INNER JOIN $ltable ON ($favtable.ResourceId=$ltable.ResourceId) "; $sql .= $this->GetJoinedSQL($p,NULL,$where); $ret = QueryCount($sql); } else { if (!$this->ListType == "favorites") { $this->ListType = "favorites"; $this->LoadFavorites($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; } return $ret; } function CountPickItems($attribs) { if (!$this->ListType == "pick") { $this->ListType = "pick"; $this->LoadPickItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountMyItems($attribs) { if (!$this->ListType == "myitems") { $this->ListType = "myitems"; $this->LoadMyItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountHotItems($attribs) { if (!$this->ListType == "hotitems") { $this->ListType = "hotitems"; $this->LoadHotItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountNewItems($attribs) { if (!$this->ListType == "newitems") { $this->ListType = "newitems"; $this->LoadNewItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountPopItems($attribs) { if (!$this->ListType == "popitems") { $this->ListType = "popitems"; $this->LoadPopItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function CountSearchItems($attribs) { if (!$this->ListType == "search") { $this->ListType = "search"; $this->LoadSearchItems($attribs); $ret = $this->QueryItemCount; } else $ret = $this->QueryItemCount; return $ret; } function SqlFavorites($attribs) { global $objSession, $objConfig, $objPermissions; $acl = $objSession->GetACLClause(); $favtable = GetTablePrefix()."Favorites"; $ltable = $this->SourceTable; $cattable = GetTablePrefix()."CategoryItems"; $CategoryTable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $where = "PortalUserId=".$objSession->Get("PortalUserId")." AND $ltable.Status=1"; if($attribs["_today"]) { $today = mktime(0,0,0,date("m"),date("d"),date("Y")); $where .= " AND $favtable.Modified >= $today AND ItemTypeId=".$this->ItemType; } $p = $this->BasePermission.".VIEW"; $sql = "SELECT $ltable.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $favtable INNER JOIN $ltable ON ($favtable.ResourceId=$ltable.ResourceId) "; $sql .= $this->GetJoinedSQL($p,NULL,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; return $sql; } function LoadFavorites($attribs) { global $objSession, $objCountCache; $sql = $this->SqlFavorites($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { $this->PerPageVar = $this->PerPageShortVar; } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("favorites"),$this->ItemType,$this->CacheListExtraId("favorites"),(int)$attribs["_today"],3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount = QueryCount($sql); $objCountCache->SetValue($this->CacheListType("favorites"),$this->ItemType,$this->CacheListExtraId("favorites"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount = (int)$CachedCount; return $this->Query_Item($sql); } function SqlPickItems($attribs) { global $objSession, $objCatList; $catid = (int)$attribs["_catid"]; $scope = (int)$attribs["_scope"]; //$JoinCats = (int)$attribs["_catinfo"] || $scope; $TableName = $this->SourceTable; if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } $where = "CategoryId =".$catid." AND ".$TableName.".EditorsPick=1 AND ".$TableName.".Status=1"; } else { $where = $TableName.".EditorsPick=1 AND ".$TableName.".Status=1 "; $catid=NULL; } if($attribs["_today"]) { $today = mktime(0,0,0,date("m"),date("d"),date("Y")); $where .= " AND ($TableName.CreatedOn>=$today)"; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $sql .= $this->GetJoinedSQL($p,$CatUd,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; return $sql; } function LoadPickItems($attribs) { global $objSession, $objCountCache; $sql = $this->SqlPickItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { $this->PerPageVar = $this->PerPageShortVar; } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("pick"),$this->ItemType,$this->CacheListExtraId("pick"),(int)$attribs["_today"],3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("pick"),$this->ItemType,$this->CacheListExtraId("pick"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlMyItems($attribs= array()) { global $objSession; $TableName = $this->SourceTable; $where = " ".$TableName.".Status>-1 AND ".$TableName.".CreatedById=".$objSession->Get("PortalUserId"); if($attribs["_today"]) { $today = mktime(0,0,0,date("m"),date("d"),date("Y")); $where .= " AND ($TableName.CreatedOn>=$today)"; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $sql .= $this->GetJoinedSQL($p,$CatUd,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; return $sql; } function LoadMyItems($attribs=array()) { global $objSession,$objCountCache; $sql = $this->SqlMyItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { $this->PerPageVar = $this->PerPageShortVar; } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("myitems"),$this->ItemType,$this->CacheListExtraId("myitems"),(int)$attribs["_today"],3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("myitems"),$this->ItemType,$this->CacheListExtraId("myitems"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlNewItems($attribs = array()) { global $objSession, $objCatList; $catid = (int)$attribs["_catid"]; $scope = (int)$attribs["_scope"]; //$JoinCats = (int)$attribs["_catinfo"] || $scope; $TableName = $this->SourceTable; if($attribs["_today"]) { $cutoff = mktime(0,0,0,date("m"),date("d"),date("Y")); } else { if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } $cutoff = $this->GetNewValue($catid); } else $cutoff = $this->GetNewValue(); } if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } $where = "CategoryId =".$catid." AND ((".$TableName.".CreatedOn >=".$cutoff." AND ".$TableName.".NewItem != 0) OR ".$TableName.".NewItem=1 ) AND ".$TableName.".Status=1 "; } else { $where = "((".$TableName.".CreatedOn >=".$this->GetNewValue()." AND ".$TableName.".NewItem != 0) OR ".$TableName.".NewItem=1 ) AND ".$TableName.".Status=1 "; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $sql .= $this->GetJoinedSQL($p,$CatUd,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; return $sql; } function LoadNewItems($attribs) { global $objSession,$objCountCache; $sql = $this->SqlNewItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { $this->PerPageVar = $this->PerPageShortVar; } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("new"),$this->ItemType,$this->CacheListExtraId("new"),(int)$attribs["_today"],3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("new"),$this->ItemType,$this->CacheListExtraId("new"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlPopItems($attribs) { global $objSession, $objCatList; $catid = (int)$attribs["_catid"]; $scope = (int)$attribs["_scope"]; //$JoinCats = (int)$attribs["_catinfo"] || $scope; $TableName = $this->SourceTable; if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } $where = "CategoryId =".$catid." AND ((".$TableName.".Hits >=".$this->GetLinkPopValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1"; } else { $where = "((".$TableName.".CachedRating >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0 ) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 "; $where = "((".$TableName.".Hits >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 "; } if($attribs["_today"]) { $today = mktime(0,0,0,date("m"),date("d"),date("Y")); $where .= " AND ($TableName.CreatedOn>=$today)"; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $sql .= $this->GetJoinedSQL($p,$catid,$where); $OrderBy = $this->QueryOrderByClause(TRUE,TRUE,TRUE); $sql .= " ".$OrderBy; return $sql; } function LoadPopItems($attribs) { global $objSession,$objCountCache; $sql = $this->SqlPopItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { $this->PerPageVar = $this->PerPageShortVar; } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("pop"),$this->ItemType,$this->CacheListExtraId("pop"),(int)$attribs["_today"],3600); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("pop"),$this->ItemType,$this->CacheListExtraId("pop"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlHotItems($attribs) { global $objSession, $objCatList; $catid = (int)$attribs["_catid"]; $scope = (int)$attribs["_scope"]; // $JoinCats = (int)$attribs["_catinfo"] || $scope; $TableName = $this->SourceTable; $OrderBy = $TableName.".CachedRating DESC"; if($scope) { if (!$catid) { $catid = $objCatList->CurrentCategoryID(); } $where = "CategoryId =".$catid." AND ((".$TableName.".CachedRating >=".$this->GetHotValue()." AND ".$TableName.".PopItem !=0) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1"; } else { $where = "((".$TableName.".CachedRating >=".$this->GetPopValue()." AND ".$TableName.".PopItem !=0 ) OR ".$TableName.".PopItem=1) AND ".$TableName.".Status=1 "; } if($attribs["_today"]) { $today = mktime(0,0,0,date("m"),date("d"),date("Y")); $where .= " AND ($TableName.CreatedOn>=$today)"; } $CategoryTable = GetTablePrefix()."Category"; $sql = "SELECT $TableName.*,$CategoryTable.CategoryId,$CategoryTable.CachedNavBar FROM $TableName "; $p = $this->BasePermission.".VIEW"; $CatId = !$scope? NULL : $catid; $sql .= $this->GetJoinedSQL($p,$CatId,$where); if(strlen($OrderBy)) $sql .= " ORDER BY $OrderBy "; return $sql; } function LoadHotItems($attribs) { global $objSession,$objCountCache; $sql = $this->SqlHotItems($attribs); if($objSession->HasSystemPermission("DEBUG.LIST")) echo htmlentities($sql,ENT_NOQUOTES)."<br>\n"; if($attribs["_shortlist"]) { $this->PerPageVar = $this->PerPageShortVar; } else $this->PerPageVar = $this->PerPageVarLong; $CachedCount = $objCountCache->GetValue($this->CacheListType("hot"),$this->ItemType,$this->CacheListExtraId("hot"),(int)$attribs["_today"], 0); if(!is_numeric($CachedCount)) { $this->QueryItemCount= QueryCount($sql); $objCountCache->SetValue($this->CacheListType("hot"),$this->ItemType,$this->CacheListExtraId("hot"),(int)$attribs["_today"],$this->QueryItemCount); } else $this->QueryItemCount=$CachedCount; return $this->Query_Item($sql); } function SqlSearchItems($attribs = array()) { global $objConfig, $objItemTypes, $objSession, $objPermissions, $CountVal; $acl = $objSession->GetACLClause(); $this->Clear(); //$stable = "ses_".$objSession->GetSessionKey()."_Search"; $stable = $objSession->GetSearchTable(); $ltable = $this->SourceTable; $catitems = GetTablePrefix()."CategoryItems"; $cattable = GetTablePrefix()."Category"; $ptable = GetTablePrefix()."PermCache"; $p = $this->BasePermission.".VIEW"; $i = new $this->classname(); $sql = "SELECT $cattable.CategoryId,$cattable.CachedNavbar,$ltable.*, Relevance FROM $stable "; $sql .= "INNER JOIN $ltable ON ($stable.ItemId=$ltable.".$i->id_field.") "; $where = "ItemType=".$this->ItemType." AND $ltable.Status=1"; $sql .= $this->GetJoinedSQL($p,NULL,$where); $sql .= " ORDER BY EdPick DESC,Relevance DESC "; $tmp = $this->QueryOrderByClause(FALSE,TRUE,TRUE); $tmp = substr($tmp,9); if(strlen($tmp)) { $sql .= ", ".$tmp." "; } return $sql; } function LoadSearchItems($attribs = array()) { global $CountVal, $objSession; //echo "Loading <b>".get_class($this)."</b> Search Items<br>"; $sql = $this->SqlSearchItems($attribs); //echo "$sql<br>"; $this->Query_Item($sql); $Keywords = GetKeywords($objSession->GetVariable("Search_Keywords")); //echo "SQL Loaded ItemCount (<b>".get_class($this).'</b>): '.$this->NumItems().'<br>'; for($i = 0; $i < $this->NumItems(); $i++) { $this->Items[$i]->Keywords = $Keywords; } if(is_numeric($CountVal[$this->ItemType])) { $this->QueryItemCount = $CountVal[$this->ItemType]; //echo "CACHE: <pre>"; print_r($CountVal); echo "</pre><BR>"; } else { $this->QueryItemCount = QueryCount($sql); //echo "<b>SQL</b>: ".$sql."<br><br>"; $CountVal[$this->ItemType] = $this->QueryItemCount; } } function PasteFromClipboard($TargetCat,$NameField="") { global $objSession,$objCatList; $clip = $objSession->GetVariable("ClipBoard"); if(strlen($clip)) { $ClipBoard = ParseClipboard($clip); $IsCopy = (substr($ClipBoard["command"],0,4)=="COPY") || ($ClipBoard["source"] == $TargetCat); $item_ids = explode(",",$ClipBoard["ids"]); for($i=0;$i<count($item_ids);$i++) { $item = $this->GetItem($item_ids[$i]); if(!$IsCopy) // paste to other category then current { $item->MoveToCategory($ClipBoard["source"],$TargetCat); $clip = str_replace("CUT","COPY",$clip); $objSession->SetVariable("ClipBoard",$clip); } else { $item->CopyToNewResource($TargetCat,$NameField); // create item copy, but with new ResourceId $item->AddToCategory($TargetCat); UpdateCategoryCount($item->type,$TargetCat); } } } - } + } + + function AdminPrintItems($template) + { + // prints item listing for admin (browse/advanced view) tabs + $o = '<table border="0" cellspacing="2" width="100%"><tbody><tr>'; + + $i = 1; + + $topleft = 0; + $topright = 0; + $rightcount = 0; + $total_items = $this->NumItems(); + $topleft = ceil($total_items / 2); + $topright = $total_items - $topleft; + + for($x = 0; $x < $topleft; $x++) + { + //printingleft + $item = $this->Items[$x]; + if ($i > 2) + { + $o .= "</tr>\n<tr>"; + $i = 1; + } + $o .= $item->AdminParseTemplate($template); + $i++; + + //printingright + if ($rightcount < $topright && ( ($x + $topleft) < $total_items) ) + { + $item = $this->Items[ $x + $topleft ]; + if ($i > 2) + { + $o.="</tr>\n<tr>"; + $i = 1; + } + $o .= $item->AdminParseTemplate($template); + $i++; + $rightcount++; + } + } + $o .= "\n</tr></tbody></table>\n"; + + return $o; + } + } // -------------- NEW CLASSES ----------------------- class DBList { // table related attributes var $db = null; var $table_name = ''; var $LiveTable = ''; var $EditTable = ''; // record related attributes var $records = Array(); var $record_count = 0; var $cur_rec = -1; // "-1" means no records, or record index otherwise // query related attributes var $SelectSQL = "SELECT * FROM %s"; function DBList() { // use $this->SetTable('live', 'table name'); // in inherited constructors to set table for list $this->db =& GetADODBConnection(); } function SetTable($action, $table_name = null) { // $action = {'live', 'restore','edit'} switch($action) { case 'live': $this->LiveTable = $table_name; $this->table_name = $this->LiveTable; break; case 'restore': $this->table_name = $this->LiveTable; break; case 'edit': global $objSession; $this->table_name = $objSession->GetEditTable($this->LiveTable); break; } } function Clear() { // no use of this method at a time :) $this->records = Array(); $this->record_count = 0; $this->cur_rec = -1; } function Query() { // query list $sql = sprintf($this->SelectSQL, $this->table_name); echo "SQL: $sql<br>"; $rs =& $this->db->Execute($sql); if( $this->db->ErrorNo() == 0 ) { $this->records = $rs->GetRows(); $this->record_count = count($this->records); //$this->cur_rec = $this->record_count ? 0 : -1; } else return false; } function ProcessList($callback_method) { // process list using user-defined method called // with one parameter - current record fields // (associative array) if($this->record_count > 0) { $this->cur_rec = 0; while($this->cur_rec < $this->record_count) { if( method_exists($this, $callback_method) ) $this->$callback_method( $this->GetCurrent() ); $this->cur_rec++; } } } function &GetCurrent() { // return currently processed record (with change ability) return ($this->cur_rec != -1) ? $this->records[$this->cur_rec] : false; } function GetDBField($field_name) { $rec =& $this->GetCurrent(); return is_array($rec) && isset($rec[$field_name]) ? $rec[$field_name] : false; } } ?> Property changes on: trunk/kernel/include/parseditem.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.18 \ No newline at end of property +1.19 \ No newline at end of property Index: trunk/kernel/include/itemdb.php =================================================================== --- trunk/kernel/include/itemdb.php (revision 341) +++ trunk/kernel/include/itemdb.php (revision 342) @@ -1,548 +1,555 @@ <?php define('FT_OPTION', 1); // option formatter class clsItemDB { var $Formatters = Array(); // by Alex var $m_dirtyFieldsMap = array(); var $Data = array(); var $adodbConnection; var $tablename; var $BasePermission; var $id_field; var $NoResourceId; var $debuglevel; function clsItemDB() { $this->adodbConnection = GetADODBConnection(); $this->tablename=""; $this->NoResourceId=0; $this->debuglevel=0; } // ============================================================================================ function GetFormatter($field) { return $this->HasFormatter($field) ? $this->Formatters[$field] : false; } function SetFormatter($field, $type, $params) { // by Alex // all params after 2nd are formmater type specific $this->Formatters[$field]['type'] = $type; switch($type) { case FT_OPTION: $this->Formatters[$field]['options'] = $params; break; } } /* function FormatFields() { // format item in list data before printing foreach($this->Formatters as $field => $formatter) $this->Data[$field] = $this->FormatField($field); } */ function FormatField($field) { // formats single field if it has formatter if( $this->HasFormatter($field) ) { $fmt = $this->Formatters[$field]; switch($fmt['type']) { case FT_OPTION: return $fmt['options'][ $this->Data[$field] ]; break; } } else return $this->Get($field); } function HasFormatter($field) { // checks if formatter is set for field return isset($this->Formatters[$field]) ? 1 : 0; } // ============================================================================================ function UnsetIdField() { $f = $this->IdField(); unset($this->Data[$f]); unset($this->m_dirtyFieldsMap[$f]); } function UnsetField($field) { unset($this->Data[$field]); unset($this->m_dirtyFieldsMap[$field]); } function IdField() { if(!strlen($this->id_field)) { return $this->tablename."Id"; } else return $this->id_field; } function UniqueId() { return $this->Get($this->IdField()); } function SetUniqueId($value) { $var = $this->IdField(); $this->Set($var, $value); } function SetModified($UserId=NULL) { global $objSession; $keys = array_keys($this->Data); if(in_array("Modified",$keys)) { $this->Set("Modified",adodb_date("U")); } if(in_array("ModifiedById",$keys)) { if(!$UserId) $UserId = $objSession->Get("PortalUserId"); $this->Set("ModifiedById",$UserId); } } function PrintVars() { echo '<pre>'.print_r($this->Data, true).'</pre>'; } // ================================================================= function GetFormatted($name) { // get formatted field value return $this->FormatField($name); } function Get($name) { // get un-formatted field value //if( !isset($this->Data[$name]) ) print_pre( debug_backtrace() ); return $this->HasField($name) ? $this->Data[$name] : ''; } // ================================================================= function HasField($name) { // checks if field exists in item return isset($this->Data[$name]) ? 1 : 0; } function Set($name, $value) { //echo "Setting Field <b>$name</b>: = [$value]<br>"; if( is_array($name) ) { for ($i=0; $i < sizeof($name); $i++) { $var = "m_" . $name[$i]; if( !$this->HasField($name[$i]) || ($this->Data[$name[$i]] != $value[$i])) { $this->Data[$name[$i]] = $value[$i]; $this->m_dirtyFieldsMap[$name[$i]] = $value[$i]; } } } else { $var = "m_" . $name; if( !$this->HasField($name) || $this->Data[$name] != $value ) { $this->Data[$name] = $value; $this->m_dirtyFieldsMap[$name] = $value; } } } function Dirty($list=NULL) { if($list==NULL) { foreach($this->Data as $field => $value) { $this->m_dirtyFieldsMap[$field] = $value; } } else { foreach($list as $field) { $this->m_dirtyFieldsMap[$field] = $this->Data[$field]; } } } function Clean($list=NULL) { if($list == NULL) { unset($this->m_dirtyFieldsMap); $this->m_dirtyFieldsMap=array(); } else { foreach($list as $value) { $varname = "m_" . $value; unset($this->m_dirtyFieldsMap[$value]); } } } function SetDebugLevel($value) { $this->debuglevel = $value; } function SetFromArray($data, $dirty = false) { if(is_array($data)) { $this->Data = $data; if($dirty) $this->m_dirtyFieldsMap = $data; } } function GetData() { return $this->Data; } function SetData($data, $dirty = false) { $this->SetFromArray($data, $dirty); } function Delete() { global $Errors; if($this->Get($this->IdField())==0) { $Errors->AddError("error.AppError",NULL,'Internal error: Delete requires set id',"",get_class($this),"Delete"); return false; } $sql = sprintf('DELETE FROM %s WHERE %s = %s', $this->tablename, $this->IdField(), $this->UniqueId()); if($this->debuglevel>0) echo $sql."<br>"; if ($this->adodbConnection->Execute($sql) === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Delete"); return false; } return true; } function Update($UpdatedBy=NULL) { global $Errors, $objSession; if(count($this->m_dirtyFieldsMap) == 0) return true; $this->SetModified($UpdatedBy); $sql = "UPDATE ".$this->tablename ." SET "; $first = 1; foreach ($this->m_dirtyFieldsMap as $key => $value) { if(!is_numeric($key) && $key != $this->IdField()) { if($first) { $sql = sprintf("%s %s=%s",$sql,$key,$this->adodbConnection->qstr(stripslashes($value))); $first = 0; } else { $sql = sprintf("%s, %s=%s",$sql,$key,$this->adodbConnection->qstr(stripslashes($value))); } } if (!(($value == '' || $value == 0) && ($this->Data[$key] == 'NULL' || $this->Data[$key] == '0' || $this->Data[$key] == ''))) { if (!strstr($key, 'Modif') && $key != 'CreatedOn') { $objSession->SetVariable("HasChanges", 1); } } } $sql = sprintf("%s WHERE %s = '%s'",$sql, $this->IdField(), $this->UniqueId()); if($this->debuglevel>0) echo $sql."<br>"; if ($this->adodbConnection->Execute($sql) === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Update"); return false; } /* if ($this->adodbConnection->Affected_Rows() > 0) { $objSession->SetVariable("HasChanges", 1); }*/ return true; } function ReplaceID($new_id) { // replace item's id, because Update method // is too dummy to do this autommatically // USED in temporary table editing stuff $db =& $this->adodbConnection; $sql = "UPDATE %1\$s SET `%2\$s` = %3\$s WHERE `%2\$s` = %4\$s"; $sql = sprintf($sql, $this->tablename, $this->IdField(), $new_id, (int)$this->UniqueId() ); if($this->debuglevel > 0) echo $sql.'<br>'; $db->Execute($sql); } function CreateSQL() { global $Errors; $sql = "INSERT INTO ".$this->tablename." ("; $first = 1; foreach ($this->Data as $key => $value) { if($first) { $sql = sprintf("%s %s",$sql,$key); $first = 0; } else { $sql = sprintf("%s, %s",$sql,$key); } } $sql = sprintf('%s ) VALUES (',$sql); $first = 1; foreach ($this->Data as $key => $value) { if($first) { + if( is_array($value) ) + { + echo "Invalid Value: "; + print_pre($value); + echo "Tracing:<br>"; + trace(); + } $sql = sprintf("%s %s",$sql,$this->adodbConnection->qstr(stripslashes($value))); $first = 0; } else { $sql = sprintf("%s, %s",$sql,$this->adodbConnection->qstr(stripslashes($value))); } } $sql = sprintf('%s)',$sql); return $sql; } function Create() { global $Errors, $objSession; if($this->debuglevel) echo "Creating Item: ".get_class($this)."<br>"; if($this->NoResourceId!=1 && (int)$this->Get("ResourceId")==0) { $this->Set("ResourceId", GetNextResourceId()); } $sql = $this->CreateSql(); if($this->debuglevel>0) echo $sql."<br>\n"; if ($this->adodbConnection->Execute($sql) === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Create"); return false; } $this->SetUniqueId($this->adodbConnection->Insert_ID()); if ($this->adodbConnection->Affected_Rows() > 0) { $objSession->SetVariable("HasChanges", 1); } return true; } function Increment($field) { global $Errors; $sql = "Update ".$this->tablename." set $field=$field+1 where ".$this->IdField()."=" . $this->UniqueId(); if($this->debuglevel>0) echo $sql."<br>"; $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Increment"); return false; } $this->Set($field,$this->Get($field)+1); } function Decrement($field) { global $Errors; $sql = "Update ".$this->tablename." set $field=$field-1 where ".$this->IdField()."=" . $this->UniqueId(); if($this->debuglevel>0) echo $sql; $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"Decrement"); return false; } $this->Set($field,$this->Get($field)-1); } function GetFieldList($UseLoadedData=FALSE) { if(count($this->Data) && $UseLoadedData==TRUE) { $res = array_keys($this->Data); } else { $res = $this->adodbConnection->MetaColumnNames($this->tablename); } return $res; } function UsingTempTable() { global $objSession; $temp = $objSession->GetEditTable($this->tablename); $p = GetTablePrefix()."ses"; $t = substr($temp,0,strlen($p)); $ThisTable = substr($this->tablename,0,strlen($p)); if($t==$ThisTable) { return TRUE; } else return FALSE; } function LoadFromDatabase($Id, $IdField = null) // custom IdField by Alex { global $objSession,$Errors; if(!isset($Id)) { $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase"); return false; } // --------- multiple ids allowed: begin ----------------- $id_field = isset($IdField) ? $IdField : $this->IdField(); if( !is_array($id_field) ) $id_field = Array($id_field); if( !is_array($Id) ) $Id = Array($Id); $i = 0; $id_count = count($id_field); $conditions = Array(); while($i < $id_count) { $conditions[] = "(`".$id_field[$i]."` = '".$Id[$i]."')"; $i++; } $sql = sprintf('SELECT * FROM %s WHERE %s', $this->tablename, implode(' AND ', $conditions) ); // --------- multiple ids allowed: end -------------------- if($this->debuglevel) echo "Load SQL: $sql<br>"; $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase"); return false; } $data = $result->fields; if($this->debuglevel) print_pre($data); if(is_array($data)) $this->SetFromArray($data); $this->Clean(); return TRUE; } function FieldExists($field) { $res = array_key_exists($field,$this->Data); return $res; } function ValueExists($Field,$Value) { $sql = "SELECT $Field FROM ".$this->tablename." WHERE $Field='$Value'"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { return TRUE; } else return FALSE; } function FieldMax($Field) { $sql = "SELECT Max($Field) as m FROM ".$this->tablename; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $ret = $rs->fields["m"]; } else $ret = 0; } function FieldMin($Field) { $sql = "SELECT Min($Field) as m FROM ".$this->tablename; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $ret = $rs->fields["m"]; } else $ret = 0; } function TableExists($table = null) { // checks if table specified in item exists in db $db =& $this->adodbConnection; $sql = "SHOW TABLES LIKE '%s'"; if($table == null) $table = $this->tablename; $rs = $db->Execute( sprintf($sql, $table) ); if( $rs->RecordCount() == 1 ) // table exists in normal case return 1; else // check if table exists in lowercase $rs = $db->Execute( sprintf($sql, strtolower($table) ) ); return ($rs->RecordCount() == 1) ? 1 : 0; } } ?> Property changes on: trunk/kernel/include/itemdb.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.2 \ No newline at end of property +1.3 \ No newline at end of property Index: trunk/kernel/include/permissions.php =================================================================== --- trunk/kernel/include/permissions.php (revision 341) +++ trunk/kernel/include/permissions.php (revision 342) @@ -1,416 +1,428 @@ <?php class clsPermission extends clsItemDB { var $Inherited; function clsPermission($PermissionId=NULL) { $this->clsItemDB(); $this->tablename = GetTablePrefix()."Permissions"; $this->BasePermission="GRANT"; $this->id_field = "PermissionId"; $this->NoResourceId = 1; $this->Inherited=FALSE; if($PermissionId) $this->LoadFromDatabase($PermissionId); } function LoadFromDatabase($Id) { global $Errors; if(!isset($Id)) { $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase"); return false; } $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$Id); $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase"); return false; } $data = $result->fields; $this->SetFromArray($data); $this->Clean(); return true; } } class clsPermList extends clsItemCollection { var $CatId; var $GroupId; var $CatBranch; function clsPermList($CatId=NULL,$GroupId=NULL) { $this->clsItemCollection(); $this->classname = "clsPermission"; $this->SourceTable = GetTablePrefix()."Permissions"; $this->Clear(); $this->GroupId = $GroupId; $this->CatId = $CatId; } function GetPermId($PermName) { $val = 0; $sql = "SELECT PermissionConfigId,PermissionName FROM ".GetTablePrefix()."PermissionConfig WHERE PermissionName='$PermName'"; //echo $sql."<br>\n"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) $val = $rs->fields["PermissionConfigId"]; return $val; } function GetPermByName($Perm) { foreach($this->Items as $p) { if($p->Get("Permission")==$Perm && $p->Get("GroupId")==$this->GroupId) { return $p; } } return false; } function AddItemFromArray($data) { global $objCatList; $p = new clsPermission(); foreach($data as $field => $value) $p->Set($field,$value); if($data["Type"]==0) { if($p->Get("CatId") != $this->CatId) { $p->Inherited = TRUE; } else $p->Inherited = FALSE; } array_push($this->Items,$p); } function LoadCategory($Id) { if($this->GroupId == NULL) { $sql = "SELECT * FROM ".$this->SourceTable." WHERE CatId=$Id AND Type=0 AND GroupId IS NULL"; } else $sql = "SELECT * FROM ".$this->SourceTable." WHERE CatId=$Id AND Type=0 AND GroupId=".$this->GroupId; $rs = $this->adodbConnection->Execute($sql); while ($rs && !$rs->EOF) { $data = $rs->fields; $current = $this->GetPermByName($data["Permission"]); if(!is_object($current)) { $this->AddItemFromArray($data); } unset($current); $rs->MoveNext(); } } function LoadPermTree($c) { /* load all permissions for group on this category */ global $objCatList; $this->CatId=$c->Get("CategoryId"); $cats = explode("|",substr($c->Get("ParentPath"),1,-1)); if(is_array($cats)) { $cats = array_reverse($cats); $cats[] = 0; $this->CatBranch = $cats; foreach($cats as $catid) { $this->LoadCategory($catid); } } } function GetDefinedCategory($Perm,$GroupId) { $ret = ""; if(is_array($this->CatBranch)) { for($index=0;$index<count($this->CatBranch);$index++) { foreach($this->Items as $p) { if($p->Get("Permission")==$Perm) { if($p->Get("Permission")==$Perm && $p->Get("GroupId")==$GroupId && $p->Get("CatId")==$this->CatBranch[$index]) { $ret = $this->CatBranch[$index]; break; } } } if(is_numeric($ret)) break; } } return $ret; } function GetPermissionValue($PermName) { $p = $this->GetPermByName($PermName); if(!is_object($p)) { $ret = NULL; } else $ret = $p->Get("PermissionValue"); return $ret; } function LoadSystemPermissions() { $sql = "SELECT * FROM Permissions WHERE Type=1 AND GroupId=".$this->GroupId; $rs = $this->adodbConnection->Execute($sql); $this->clear(); $this->CatId=NULL; while($rs && !$rs->EOF) { $data = $rs->fields; $this->AddItemFromArray($data); } } + function Set_Permission($CategoryId,$GroupId,$PermName,$Value,$Type) + { + $Perm = $this->GetPermByName($PermName); + if($Perm) + { + $Id = $Perm->Get("PermissionId"); + $this->Edit_Permission($Id,$CategoryId,$GroupId,$PermName,$Value,$Type); + } + else + $this->Add_Permission($CategoryId,$GroupId,$PermName,$Value,$Type); + } + function Add_Permission($CategoryId,$GroupId,$PermName,$Value,$Type) { $p = new clsPermission(); $p->Set(array("CatId","GroupId","Permission","PermissionValue","Type"), array($CategoryId,$GroupId,$PermName,$Value,$Type)); $p->Create(); array_push($this->Items,$p); return $p; } function Edit_Permission($PermissionId,$CategoryId,$GroupId,$PermName,$Value,$Type) { $p = $this->GetItem($PermissionId); if(is_object($p)) { $p->Set(array("CatId","GroupId","Permission","PermissionValue","Type"), array($CategoryId,$GroupId,$PermName,$Value,$Type)); $p->Update(); } return $p; } function Delete_Permission($PermissionId) { $p = $this->GetItem($PermissionId); if(is_object($p)) { $p->Delete(); } } function Copy_Permissions($SrcCat,$DestCat) { $sql = "DELETE FROM ".$this->SourceTable." WHERE CatId=$DestCat"; $this->adodbConnection->Execute($sql); $sql = "SELECT * FROM ".$this->SourceTable." WHERE CatId=".$SrcCat; $rs = $this->adodbConnection->Execute($sql); while($rs && !$rs->EOF) { $data = $rs->fields; $this->Add_Permission($DestCat,$data["GroupId"],$data["Permission"],$data["PermissionValue"],$data["Type"]); $rs->MoveNext(); } } function Delete_CatPerms($CatId) { $sql = "DELETE FROM ".$this->SourceTable." WHERE CatId=$CatId"; $this->adodbConnection->Execute($sql); } /* return an array of group ids which have access to permission $perm for a category*/ function GetGroupPermList($c, $Perm, $AllGroups) { $ret = array(); $this->Clear(); if(strlen($Perm) && count($AllGroups)) { for($i=0;$i<count($AllGroups);$i++) { $this->CatId=$c->Get("CategoryId"); $this->GroupId = $AllGroups[$i]; $this->LoadPermTree($c); if($this->GetPermissionValue($Perm)==1) { $ret[] = $AllGroups[$i]; } } } return $ret; } function GetAllViewPermGroups($c, $AllGroups) { $perms = array(); $sql = "SELECT PermissionConfigId, PermissionName FROM ".GetTablePrefix()."PermissionConfig WHERE PermissionName LIKE '%.VIEW'"; //echo $sql."<br>\n"; $rs = $this->adodbConnection->Execute($sql); while($rs && !$rs->EOF) { $perms[$rs->fields["PermissionName"]] = $this->GetGroupPermList($c,$rs->fields["PermissionName"],$AllGroups); $rs->MoveNext(); } return $perms; } } class clsPermCache extends clsItemDB { function clsPermCache($id=NULL) { $this->clsItemDB(); $this->tablename = GetTablePrefix()."PermCache"; $this->BasePermission="GRANT"; $this->id_field = "PermCacheId"; $this->NoResourceId = 1; if($id) $this->LoadFromDatabase($id); } function LoadFromDatabase($Id) { global $Errors; if(!isset($Id)) { $Errors->AddError("error.AppError",NULL,'Internal error: LoadFromDatabase id',"",get_class($this),"LoadFromDatabase"); return false; } $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$Id); $result = $this->adodbConnection->Execute($sql); if ($result === false) { $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase"); return false; } $data = $result->fields; $this->SetFromArray($data); $this->Clean(); return true; } } class clsPermCacheList extends clsItemCollection { function clsPermCacheList() { $this->clsItemCollection(); $this->classname = "clsPermCache"; $this->SourceTable = GetTablePrefix()."PermCache"; $this->Clear(); } function &GetPerm($CategoryId,$PermId) { $found = FALSE; foreach($this->Items as $p) { if($p->Get("CategoryId")==$CategoryId && $p->Get("PermId")==$PermId) { $found = TRUE; break; } } if(!$found) { $sql = "SELECT * FROM ".$this->SourceTable." WHERE CategoryId=$CategoryId AND PermId=$PermId"; $rs = $this->adodbConnection->Execute($sql); if($rs && !$rs->EOF) { $data = $rs->fields; $p = $this->AddItemFromArray($data); } else $p = FALSE; } return $p; } function &AddPermCache($CatId,$PermId,$Acl,$Dacl) { if(strlen($Acl)>0 || strlen($Dacl)>0) { $p = new $this->classname; $p->Set(array("CategoryId","PermId","ACL","DACL"),array($CatId,$PermId,$Acl,$Dacl)); $p->Create(); return $p; } else return FALSE; } function EditPermCache($PermCacheId,$CatId,$PermId,$Acl,$Dacl) { if($PermCacheId) { $p = $this->GetItem($PermCacheId); if(is_object($p)) { $p->Set(array("CategoryId","PermId","ACL","DACL"),array($CatId,$PermId,$Acl,$Dacl)); $p->Update(); } } } function DeletePermCache($PermCacheId) { if($PermCacheId) { $p = $this->GetItem($PermCacheId); if(is_object($p)) { $p->Delete(); } } } function DeleteCategory($CategoryId) { $this->adodbConnection->Execute("DELETE FROM ".$this->SourceTable." WHERE CategoryId=$CategoryId"); } function CopyCategory($SourceCat,$DestCat) { $this->Clear(); $this->Query_Item("SELECT * FROM ".$this->SourceTable." WHERE CategoryId=$SourceCat"); if($this->NumItems()>0) { foreach($this->Items as $p) { $p->UnsetIdField(); $p->Set("CategoryId",$DestCat); $p->Create(); } } } } ?> Property changes on: trunk/kernel/include/permissions.php ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.1 \ No newline at end of property +1.2 \ No newline at end of property Index: trunk/admin/browse/checkboxes_new.js =================================================================== --- trunk/admin/browse/checkboxes_new.js (revision 341) +++ trunk/admin/browse/checkboxes_new.js (revision 342) @@ -1,669 +1,666 @@ var animationTimeout = 500;//ms var focusType = ""; var tabIDs = new Array(); var tabSelection = new Array(); var LastCheckedItem = null; var enableContextMenus= true; var doubleClickAction = "edit"; var CurrentTab = new String(""); var PasteButton = false; var start_tab = null; var selcount = 0; var _single_select = false; function initCheckBoxes(selChangedHandler, use_cats) { if(use_cats == null && typeof(use_cats) == 'undefined') use_cats = true; //set single_select to true to turn on radio-buttons select mode if (typeof(single_select) != 'undefined') _single_select = single_select; var checkBoxContainers = document.body.getElementsByTagName("DIV"); for (var i = 0; i < checkBoxContainers.length; i++) if( checkBoxContainers[i].getAttribute("isTab") ) { if(tabIDs.length == 0) start_tab = checkBoxContainers[i].id; tabIDs[tabIDs.length] = checkBoxContainers[i].id tabSelection[checkBoxContainers[i].id] = 0; } tabSelection['categories'] = 0; if(use_cats == true) { categoriesTab = document.getElementById('categories'); var catInputs = categoriesTab.getElementsByTagName("INPUT"); for (var i = 0; i < catInputs.length; i++) catInputs.checked = false; if (categoriesTab) categoriesTab.active = true; } var unique_id = 1; for (var i = 0; i < checkBoxContainers.length; i++) { if (checkBoxContainers[i].getAttribute("inportalType")) { var inputs = checkBoxContainers[i].getElementsByTagName("INPUT"); var checkBox; for (var j = 0; j < inputs.length; j++) if (inputs[j].type == "checkbox") { checkBox = inputs[j]; if (_single_select) { if (document.all) { unique_id++; checkBox.outerHTML = '<INPUT ID="swapped_to_radio_'+unique_id+'" TYPE="radio" NAME="'+checkBox.name+'" VALUE="'+checkBox.value+'" ItemType="'+checkBox.ItemType+'" inportalType="'+checkBoxContainers[i].getAttribute("inportalType")+'">'; checkBox = document.getElementById('swapped_to_radio_'+unique_id); } else { radio = document.createElement('input'); radio.type = 'radio'; radio.name = checkBox.name; radio.value = checkBox.value; radio.checked = true; radio.ItemType = checkBox.getAttribute('ItemType'); checkBox.parentNode.replaceChild(radio, checkBox); checkBox = radio; } } break; } checkBox.inportalType = checkBoxContainers[i].getAttribute("inportalType"); checkBox.onclick = checkBoxClick; checkBox.container = checkBoxContainers[i]; - var selNode = (checkBox.container.getAttribute("inportalType") == "categories" || checkBox.container.getAttribute("inportalType") == "category") ? checkBox.container.parentNode : checkBox.container.parentNode.parentNode; - + var selNode = (checkBox.container.getAttribute("inportalType") != "topics") ? checkBox.container.parentNode : checkBox.container.parentNode.parentNode; selNode.chB = checkBox; document.body.onclick = function(e) { //alert('body click'); var srcElement = (document.all) ? event.srcElement : e.target; if (!srcElement) return; if (srcElement.onclick || srcElement.onmousedown || srcElement.onmouseup) return; if (selcount == 0) { unselectAll('categories') if (activeTab) unselectAll(activeTab.id) } else { selcount = 0; } } if(enableContextMenus==true) { selNode.oncontextmenu = function(e) { // alert('menu'); // unselectAll('categories') // if (activeTab) unselectAll(activeTab.id) if (!this.chB.checked) { unselectAll('categories') if (activeTab) unselectAll(activeTab.id) this.chB.checked = true; this.chB.onclick(); } var evt = (!document.all) ? e : event; if (evt) { evt.cancelBubble = true; evt.returnValue = false; } showContextMenu(evt); return false; } } selNode.style.cursor = 'default'; // document.onselectstart = function(){return false;} selNode.ondblclick = function(e) { unselectAll('categories') if (activeTab) unselectAll(activeTab.id) this.chB.checked = (!this.chB.checked); this.chB.onclick(); this.action = doubleClickAction; actionHandler(this); var evt = (!document.all) ? e : event; if (evt) { evt.cancelBubble = true; evt.returnValue = false; return false; } } selNode.onclick = function(e) { //alert('onclick of selNode'); var evt = (!document.all) ? e : event; if (!evt) return; if (evt) { evt.cancelBubble = true; // evt.returnValue = false; } // alert('d') if (_single_select || (!evt.ctrlKey && !evt.shiftKey)) { //alert('unselectAll'); unselectAll('categories') if (activeTab) unselectAll(activeTab.id) if (this.chB.checked == true) return //alert('setting '+this.chB.name+' '+this.chB.value+' checked = true'); this.chB.checked = true; //alert('calling onclick'); this.chB.onclick(); return; } if (document.all) document.selection.empty() else { var selection = window.getSelection(); } if (evt.shiftKey) { var container = (this.chB.inportalType == "categories") ? document.getElementById("categories") : activeTab; var inputs = container.getElementsByTagName("INPUT"); var checkboxes = new Array(); for (var i = 0; i < inputs.length; i++) if ((inputs[i].type == "checkbox" || inputs[i].type == "radio") && inputs[i].container) checkboxes[checkboxes.length] = inputs[i]; var cIndex; var maxIndex = 0; maxLcp = 0; for (var i = 0; i < checkboxes.length; i++) { if (checkboxes[i] == this.chB) cIndex = i; if (checkboxes[i].lcp > maxLcp) { maxIndex = i; maxLcp = checkboxes[i].lcp; } // checkboxes[i].onclick(); } checkboxes[maxIndex].onclick(); for (var i = 0; i < checkboxes.length; i++) selectContainer(checkboxes[i], (i <= cIndex && i >= maxIndex && maxIndex <= cIndex || i >= cIndex && i <= maxIndex && maxIndex > cIndex) ) //selectContainer(checkBox, value, doNotFireSelectionEvent) return; } // alert(evt.srcElement) this.chB.checked = (!this.chB.checked); this.chB.onclick(); return false; } checkBox.checked = false; // checkBoxContainers[i].className = (checkBox.checked) ? "selectedContainer" : "unselectedContainer"; selectContainer(checkBox, checkBox.checked, true) if (checkBox.checked) tabSelection[checkBox.inportalType]++; } } tabChanged(); selectionChanged(); initTabsForAnimation(); } function clear_checkboxes(){ //alert('clear checkboxes'); var inputs = document.body.getElementsByTagName("INPUT"); for (var j = 0; j < inputs.length; j++) if ((inputs[j].type == "checkbox") && (inputs[j].inportalType)) { inputs[j].checked = false; } } var lcp = 1; function checkBoxClick(e) { //alert('click '+this.checked + ' inptype: ' + this.inportalType); this.lcp = lcp++; if (_single_select) { ch = this.checked; this.checked = false; unselectAll('categories') if (activeTab) unselectAll(activeTab.id) this.checked = ch; } if (this.inportalType == "categories") { if (activeTab) unselectAll(activeTab.id) } else unselectAll("categories"); selectContainer(this, this.checked); if (this.checked) { tabSelection[this.inportalType]++ LastCheckedItem = this; } else { tabSelection[this.inportalType]--; LastCheckedItem = null; } updateStatus(); var evt = (typeof(document.all) == 'undefined') ? e : event; if (!evt) return; evt.cancelBubble = true; // evt.returnValue = false; return; } function toggleTab(tabId, atm) { var tab = document.getElementById(tabId); if (!tab) return; for (var i = 0; i < tabIDs.length; i++) { if (tabIDs[i] != tabId) { inactiveTab = document.getElementById(tabIDs[i]); if(inactiveTab.getAttribute("isTab")) { unselectAll(tabIDs[i]); if (inactiveTab.style.display != "none") { inactiveTab.style.top = inactiveTab.pTop - inactiveTab.oHeight; inactiveTab.pY = -inactiveTab.oHeight; } inactiveTab.style.display = "none"; inactiveTab.active = false; } } } tab.style.display = ""; tab.active = true; if(toolbar) toolbar.setTab(tabId); activeTab = tab; tabChanged(); showTab(atm); CurrentTab = activeTab.tabTitle; } var collapseTab; function showTab(atm) { var container = (activeTab) ? activeTab : collapseTab; if (!container) return; var scrollJumpA = scrollJump; if (!container.startTime) { container.startTime = new Date(); } else { var cDate = new Date(); if (cDate - container.startTime >= animationTimeout) scrollJumpA = container.oHeight; } var sj = (atm) ? container.oHeight :scrollJumpA; container.pY += (container.active) ? sj : -sj; if (container.pY > container.pTop) container.pY = container.pTop; if (container.pY < -container.oHeight) container.pY = -container.oHeight; container.style.top = container.pY; if ((container.pY != container.pTop && container.active) || (container.pY != -container.oHeight && !container.active)) setTimeout("showTab()", 0) else { unselectAll(container.id); if (container.active) { var devider = document.getElementById("tabsDevider"); devider.style.display = "none"; theMainScript.SetCookie('active_tab', container.id); theMainScript.SetCookie('tabs_on',1); } else { container.style.top = container.pTop - container.oHeight; container.style.display = "none"; theMainScript.SetCookie('tabs_on',0); } container.startTime = null; } } function toggleCategories(instant) { var tab = document.getElementById("categories"); tab.active = (!tab.active); if(tab.active) CurrentTab = 'Categories'; var devider = document.getElementById("categoriesDevider"); if (!tab.active) devider.style.display = ""; toolbar.showButton('new_cat', tab.active) unselectAll("categories"); tabChanged(); var container = document.getElementById("firstContainer"); if (!container.pY) container.pY = 0; if (!container.pTop && container.pTop != 0) container.pTop = -1; showCategories(instant); } var scrollJump = 8; function showCategories(instant) { var container = document.getElementById("firstContainer"); var categories = document.getElementById("categories"); var scrollJumpA = scrollJump; scrollJumpA = (instant) ? container.offsetHeight : scrollJumpA; if (!categories.startTime) { categories.startTime = new Date(); } else { var cDate = new Date(); if (cDate - categories.startTime >= animationTimeout) scrollJumpA = categories.offsetHeight; //ert(animationTimeout); } (categories.active) ? container.pY += scrollJumpA : container.pY -= scrollJumpA; if (container.pY < container.pTop - categories.offsetHeight) container.pY = container.pTop - categories.offsetHeight; if (container.pY > container.pTop) container.pY = container.pTop; container.style.top = container.pY; if (((Math.abs(container.pY) <= categories.offsetHeight + container.pTop) && (!categories.active)) || ((container.pY < container.pTop) && (categories.active))) setTimeout("showCategories()", 0) else { unselectAll("categories"); if (categories.active) //shown categories { var devider = document.getElementById("categoriesDevider"); //devider.style.display = "none"; theMainScript.SetCookie('cats_tab_on', 1); } else { //hidden categories theMainScript.SetCookie('cats_tab_on', 0); } categories.startTime = null; } } /* function toggleCategories() { var tab = document.getElementById("categories"); var devider = document.getElementById("categoriesDevider"); devider.style.display = (tab.style.display == "none") ? "" : "none"; // tab.style.display = (tab.style.display == "none") ? "" : "none"; tab.active = (tab.style.display != "none"); toolbar.showButton('new_cat', tab.active) unselectAll("categories"); tabChanged(); var container = document.getElementById("firstContainer"); if (!container.pY) container.pY = 0; showCategories(); } function showCategories() { var container = document.getElementById("firstContainer"); var categories = document.getElementById("categories"); container.style.top = (categories.active) ? container.pY++ : container.pY--; if (((Math.abs(container.pY) < categories.offsetHeight) && (!categories.active)) || ((container.pY < 0) && (categories.active))) setTimeout("showCategories()", 10) else unselectAll("categories"); } */ function selectAllC(tabId) { if (tabId != 'categories') { unselectAll('categories'); } else { unselectAll('links'); unselectAll('news'); unselectAll('topics'); } selcount = 0; changeSelection(tabId, 0); } function unselectAll(tabId) { selcount = 0; changeSelection(tabId, 1); LastCheckedItem = null; } function invert(tabId) { if (tabId != 'categories') { unselectAll('categories'); } else { unselectAll('links'); unselectAll('news'); unselectAll('topics'); } selcount = 0; changeSelection(tabId, 2); } function changeSelection(tabId, action) { if (selcount == 0) { selcount++; //alert('change Selection'); if(toolbar) { var tab = document.getElementById(tabId); if (!tab) return; var inputs = tab.getElementsByTagName("INPUT"); //alert(inputs.length); for (var j = 0; j < inputs.length; j++) { //alert(inputs[j].type + ' ' + inputs[j].name + ' ' + inputs[j].inportalType); if ((inputs[j].type == "checkbox" || inputs[j].type == "radio") && (inputs[j].inportalType)) { //alert('will do'); switch (action) { case (0) : selectContainer(inputs[j], true, true) break; case (1) : selectContainer(inputs[j], false, true) break; default: selectContainer(inputs[j], (!inputs[j].checked), true) break; } } } selectionChanged(); } } else { selcount = 0; } } function selectContainer(checkBox, value, doNotFireSelectionEvent) { //alert('select cont'); - if (!checkBox) return; - if (checkBox.checked != value) - { - //alert('setting '+value); - checkBox.checked = value; - if (value) - tabSelection[checkBox.inportalType]++ - else - tabSelection[checkBox.inportalType]--; - } - var selNode = (checkBox.container.getAttribute("inportalType") == "categories" || checkBox.container.getAttribute("inportalType") == "category") ? checkBox.container.parentNode : checkBox.container.parentNode.parentNode; - - if (!selNode.oriCN && checkBox.checked || selNode.className != "selectedContainer" && selNode.className != "unselectedContainer") - selNode.oriCN = (selNode.className) ? selNode.className : ""; + if (!checkBox) return; + if (checkBox.checked != value) + { + //alert('setting '+value); + checkBox.checked = value; + if(value) + tabSelection[checkBox.inportalType]++ + else + tabSelection[checkBox.inportalType]--; + } + var selNode = (checkBox.container.getAttribute("inportalType") != "topics") ? checkBox.container.parentNode : checkBox.container.parentNode.parentNode; + if (!selNode.oriCN && checkBox.checked || selNode.className != "selectedContainer" && selNode.className != "unselectedContainer") + selNode.oriCN = (selNode.className) ? selNode.className : ""; - selNode.className = (checkBox.checked) ? "selectedContainer" : ((selNode.oriCN != "") ? selNode.oriCN : "unselectedContainer"); -// checkBox.container.className = (checkBox.checked) ? "selectedContainer" : "unselectedContainer"; - if (!doNotFireSelectionEvent) - selectionChanged(); + selNode.className = (checkBox.checked) ? "selectedContainer" : ((selNode.oriCN != "") ? selNode.oriCN : "unselectedContainer"); + //checkBox.container.className = (checkBox.checked) ? "selectedContainer" : "unselectedContainer"; + if (!doNotFireSelectionEvent) selectionChanged(); } function updateStatus() { var StatusString=""; for (var i = 0; i < tabIDs.length; i++) StatusString+= tabIDs[i] + ": " + tabSelection[tabIDs[i]] + "; "; StatusString+= "categories: " + tabSelection['categories'] + "; "; window.status = StatusString; } function selectionChanged() { setTimeout('selectionChangedA()', 0) } var activeTab; function TabPasteEnabled(TabTitle) { //alert('Checking '+TabTitle); var Enable_Paste = false; try { Enable_Paste = eval(TabTitle+'_Paste'); return Enable_Paste; } catch (e) { return; } } function selectionChangedA() { var categories = document.getElementById('categories'); for (var i = 0; i < tabIDs.length; i++) { var thisTab = document.getElementById(tabIDs[i]) if (!thisTab) continue; if (thisTab.active) { activeTab = thisTab; activeTab.title = getTabTitle(tabIDs[i]); break; } } var numCategoriesSelected = tabSelection['categories']; var numActiveTabSelected = (activeTab) ? tabSelection[activeTab.id] : 0; if(toolbar) { //toolbar.enableButton("edit", (numCategoriesSelected + numActiveTabSelected == 1)); var enableMiscButtons = (numCategoriesSelected + numActiveTabSelected > 0 && numCategoriesSelected * numActiveTabSelected == 0); var enableCurrentButton = !enableMiscButtons; toolbar.enableButton("editcat",enableCurrentButton); toolbar.enableButton("edit", enableMiscButtons); toolbar.enableButton("delete", enableMiscButtons); toolbar.enableButton("approve", enableMiscButtons); toolbar.enableButton("decline", enableMiscButtons); toolbar.enableButton("cut", enableMiscButtons); toolbar.enableButton("copy", enableMiscButtons); toolbar.enableButton("paste", PasteButton); toolbar.enableButton("move_up", enableMiscButtons); toolbar.enableButton("move_down", enableMiscButtons); } } function tabChanged() { if (activeTab) { //alert('now active: '+activeTab.id) } // toggleMenu(); } function getTabTitle(tabId) { var tab = document.getElementById(tabId); if (!tab) return; return tab.getAttribute("tabTitle"); } function isAnyChecked(tabId) { //return theMainScript.Grids[tabId].CountSelected() > 0; return tabSelection[tabId] > 0; } function initTabsForAnimation() { var iniTop = 0; for (var i = 0; i < tabIDs.length; i++) { var tab = document.getElementById(tabIDs[i]); if (!tab) continue; tab.oHeight = tab.offsetHeight; tab.style.top = -iniTop; iniTop += tab.offsetHeight; tab.pTop = -1; } for (var i = 0; i < tabIDs.length; i++) { var tab = document.getElementById(tabIDs[i]); if (!tab) continue; tab.style.top = tab.pTop - tab.offsetHeight; tab.pY = -tab.offsetHeight; tab.style.visibility = "inherit"; tab.style.display = "none"; } } \ No newline at end of file Property changes on: trunk/admin/browse/checkboxes_new.js ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.2 \ No newline at end of property +1.3 \ No newline at end of property