<?php
/*
    ===============================================================
    @author     : Surdeanu Mihai ;
    @date       : 1 iulie 2011 ;
    @version    : 3.0 ;
    @mybb       : compatibilitate cu MyBB 1.6.x ;
    @description: Aceasta modificare genereaza o lista cu grupurile de pe forumul tau, afisand-o in zona statisticilor, din subsol.
    @homepage   : http://mybb.ro ! Viziteaza-ne acum!
    @copyright  : Licenta MyBB Romania. Toate drepturile rezervate.
    ===============================================================
    @change log :
    [v3.0][1 iulie 2011] - posibilitatea rularii pe baza cache-ului, in acest fel saitul se incarca mai repede, fixarea unui posibil atac de tip SQL Injection din Admin CP;
    [v2.0][18 august 2010] - modul automat a temei, fixarea unui bug la interogarea bazei de date;
    [v1.0][5 august 2010] - prima versiune ;
    ===============================================================
*/
// Test impotriva accesarii directe, din browser a fisierului modificarii
if(!defined("IN_MYBB"))
{
    die("Acest fisier nu poate fi accesat direct.");
}
// Carligul de legatura cu forumul tau
$plugins->add_hook("index_start", "grouplegend_show");
$plugins->add_hook("grupy", "grouplegend_show"); 
// Functie pentru intoarcerea informatiilor despre modificare
function grouplegend_info()
{
    return array(
        "name"				=> "Usergroup Legend",
        "description"		=> "Show a legend of your selected usergroups. (on footer)",
        "website"			=> "http://mybb.ro",
        "author"			=> "Surdeanu Mihai",
        "authorsite"		=> "http://mihu.me",
        "version"			=> "3.0",
		"guid"				=> "8a96dd36a70537d9ce3c47b1479fd7c1",
		'compatibility'     => "16*",
                );
}
// Functie pentru activarea modificarii
function grouplegend_activate()
{
	global $db;
	$grup_de_setari = array(
		"gid"               => NULL,
		"name"              => "ugl_mybbro",
		"title"             => "Usergroup Legend",
		"description"       => "This will add a nice little legend at the end of your forum, above the Board Statistics.",
		"disporder"         => "35",
		"isdefault"         => "no"
                           );
	$db->insert_query("settinggroups", $grup_de_setari);
	$gid = $db->insert_id();
    $setare_1 = array(
        "sid"               => NULL,
        "name"              => "ugl_enabled",
        "title"             => "Is enabled ?",
        "description"       => "Can this plugin do his job?",
        "optionscode"       => "yesno",
        "value"             => "no",
        "disporder"         => "1",
        "gid"               => intval($gid)
                     );
    $setare_2 = array(
        "sid"               => NULL,
        "name"              => "ugl_cache_enabled",
        "title"             => "Cache data ?",
        "description"       => "Now we have the ability to work with cache data, and as a result we increase your server performances.",
        "optionscode"       => "yesno",
        "value"             => "yes",
        "disporder"         => "2",
        "gid"               => intval($gid)
                     );
    $setare_3 = array(
        "sid"               => NULL,
        "name"              => "ugl_mode",
        "title"             => "Theme type :",
        "description"       => "If you choose the \'Theme without images\' the plugin image will not be displayed, else if you choose \'Theme with images\' the group legend image will be displayed! (Default : Automatic)",
        "optionscode"       => "select\n0=Automatic\n1=Theme without images\n2=Theme with images",
        "value"             => "0",
        "disporder"         => "3",
        "gid"               => intval($gid)
                     );
    $setare_4 = array(
        "sid"               => NULL,
        "name"              => "ugl_orderbyelement",
        "title"             => "Element show/order :",
        "description"       => "Please specify the field from the database that will be ordering / show groups! (Default : title)",
        "optionscode"       => "select\ngid=gid\nusertitle=usertitle\ntitle=title",
        "value"             => "title",
        "disporder"         => "4",
        "gid"               => intval($gid)
                     );
	$setare_5 = array(
		"sid"			    => NULL,
		"name"			    => "ugl_ordergrouplegend",
		"title"			    => "Show on this order :",
		"description"	    => "Please specify the display order of groups! Pay attention to the field specified at the above setting! You can find how to use it by reading ReadMe.pdf.",
		"optionscode"	    => "text",
		"value"			    => "ALL[ASC]",
		"disporder"		    => "5",
		"gid"			    => intval($gid)
                     );
	$db->insert_query("settings", $setare_1);
    $db->insert_query("settings", $setare_2);  
    $db->insert_query("settings", $setare_3); 
    $db->insert_query("settings", $setare_4);    
    $db->insert_query("settings", $setare_5); 
    // se reconstruiesc toate setarile
    rebuild_settings();   
    $sablon = array(
		"tid"		=> NULL,
		"title"		=> "ugl_template",
		"template"	=> "<!-- Powered by MyBB Romania : http://mybb.ro -->\n{\$ugl_final}",
		"sid"		=> "-1"
	                 );
    // se insereaza sablonul in sistem
	$db->insert_query("templates", $sablon);
	require MYBB_ROOT."/inc/adminfunctions_templates.php";
    // se face legatura sablonului cu tema de pe forum
	find_replace_templatesets("index_boardstats", '#{\$whosonline}#', "{\$whosonline}\n{\$ugl_userlegend}");
}
//Deactivate plugin
function grouplegend_deactivate()
{
	global $db;
    // se sterg din baza de date toate setarile adaugate de modificare
    $db->delete_query('settings', 'name IN("ugl_enabled", "ugl_cache_enabled", "ugl_mode", "ugl_orderbyelement", "ugl_ordergrouplegend")');
    $db->delete_query('settinggroups', 'name = "ugl_mybbro"');
    // se reconstruiesc toate setarile
    rebuild_settings();
    // se sterge din baza de date sablonul adaugat
    $db->delete_query('templates', 'title = "ugl_template"');       
	require MYBB_ROOT."/inc/adminfunctions_templates.php";
    // se desface legatura sablonului cu tema de pe forum
	find_replace_templatesets("index_boardstats", '#(\n?){\$ugl_userlegend}#', '', 0);
}
// Functia de cautare, complexitate O(n)
function grouplegend_search($array, $key, $value)
{
    foreach ($array as $subarray)
        if ($subarray[$key] == $value)
            return array(
                'title' => $subarray['title'],
                'namestyle' => $subarray['namestyle']
                        );
    return array();
}
// Functia de comparare, necesara sortarii
function grouplegend_compare($array1, $array2) 
{
    global $mybb;
    // se compara ca stringuri si nu ca numere
    return strcmp($array1[$mybb->settings['ugl_orderbyelement']], $array2[$mybb->settings['ugl_orderbyelement']]);
}
// Functia de generare a template-ului
function grouplegend_template($final, $type) 
{
    if ($type == "complex") {
        return "<tr><td class=\"trow1 smalltext\" align=\"center\" width=\"1\"><img src=\"images/group_legend.png\" alt=\"Usergroup Legend\" /></td><td colspan=\"6\" class=\"trow1\"><span class=\"smalltext\">".$final."</span></td></tr>";
    }
    else {
        return "<tr><td class=\"trow1\"><span class=\"smalltext\">".$final."</span></td></tr>";   
    }
}
// Functia care face toata treaba
function grouplegend_show()
{
    // Variabile globale
    global $db, $mybb, $ugl_userlegend, $templates, $cache;
    // Variabile de lucru
	$final = "";
    // Se verifica daca acest plugin are permisiunea de a rula
    if ($mybb->settings['ugl_enabled'] == 1) 
    {
        // Se creeaza un vector cu ordinea elementelor alese
	    $ordergrouplegend = explode(',', $mybb->settings['ugl_ordergrouplegend']);
        // Versiunea 3.0 a acestui plugin utilizeaza cache-uri. Performanta este astfel sporita!
        if ($mybb->settings['ugl_cache_enabled'] == 1) 
        {
            // se merge pe varianta de caching
            $groupscache = $cache->read("usergroups");
            // daca cache-ul de grupuri de utilizatori nu exista atunci se face update
            if(!is_array($groupscache)) {
                $cache->updateusergroups();
                $groupscache = $cache->read("usergroups");
            }
            // acum totul ar trebui sa fie in regula cu cache-ul grupurilor de useri
            // verificam mai intai daca exista cuvantul cheie "all" in lista
            if (in_array("ALL[ASC]", $ordergrouplegend) || in_array("ALL[DESC]", $ordergrouplegend))
            {
                // se ordoneaza alfabetic mai intai
                usort($groupscache, "grouplegend_compare");
                if (in_array("ALL[DESC]", $ordergrouplegend)) {
                    // daca apare descrescator atunci se inverseaza array-ul
                    $groupscache = array_reverse($groupscache);
                }
                // fiecare grup din cache este afisat
                foreach ($groupscache as $grup)
                {
                    // incepe sa se creeze formatul cu tot cu titlu si culori
			        $format = $grup['namestyle'];
			        $userin = substr_count($format, "{username}");
			        if($userin == 0)
			        {
				        $format = "{username}";
			        }
			        $format = stripslashes($format);
			        $usergroup = str_replace("{username}", $grup['title'], $format);
                    // se adauga stringul la structura finala
			        $final .= " [".$usergroup."] ";
                } 
            }
            else
            {
                // pentru fiecare element din lista propusa de user
       	        foreach($ordergrouplegend as $orderelement)
                {
                    // se verifica daca exista grupul in cache
                    $rezultat = grouplegend_search($groupscache, $mybb->settings['ugl_orderbyelement'], $orderelement);
                    // daca este array nevid atunci s-a gasit rezultatul
                    if (count($rezultat) > 0)
                    {
                        // incepe sa se creeze formatul cu tot cu titlu si culori
                        $format = $rezultat['namestyle'];
                        $userin = substr_count($format, "{username}");
                        if($userin == 0) {
                            $format = "{username}";
                        }
                        $format = stripslashes($format);
                        $usergroup = str_replace("{username}", $rezultat['title'], $format);
                        // se adauga stringul la structura finala
                        $final .= " [".$usergroup."] ";
                    }
                    // pe cealalta ramura nu ne intereseaza
                    // se repeta structura repetitiva    
                }
            }
        }
        else
        {
            // verificam mai intai daca exista cuvantul cheie "all" in lista
            if (in_array("ALL[ASC]", $ordergrouplegend) || in_array("ALL[DESC]", $ordergrouplegend))
            {
                // se realizeaza interogarea
                // Versiunea 3.0 securizeaza interogarea MySQL impotriva unor injectii de tip SQL Injection din Admin CP
                if (in_array("ALL[DESC]", $ordergrouplegend)) {
                    // daca apare descrescator atunci se inverseaza interogarea
                    $interogare = $db->simple_select("usergroups", "title, namestyle", "", array("order_by" => "title", "order_dir" => "DESC"));
                }
                else {
                    $interogare = $db->simple_select("usergroups", "title, namestyle", "", array("order_by" => "title"));
                }
                // procesari de date
                while ($group = $db->fetch_array($interogare))
                {
                    // incepe sa se creeze formatul cu tot cu titlu si culori
			        $format = $group['namestyle'];
			        $userin = substr_count($format, "{username}");
			        if($userin == 0) {
				        $format = "{username}";
			        }
			        $format = stripslashes($format);
			        $usergroup = str_replace("{username}", $group['title'], $format);
                    // se aduga la stringul final
			        $final .= " [".$usergroup."] ";
                }
            }
            else 
            {
            // userul nu a ales cache-ul ca solutie pentru forumul sau
            foreach($ordergrouplegend as $orderelement)
	        {
                // se realizeaza interogarea
                // Versiunea 3.0 securizeaza interogarea MySQL impotriva unor injectii de tip SQL Injection din Admin CP
                $interogare = $db->simple_select("usergroups", "title, namestyle", $mybb->settings['ugl_orderbyelement']." = '".$db->escape_string($orderelement)."'", array("limit" => 1));
                // se creeaza vectorul cu datele
                $group = $db->fetch_array($interogare);
                // se verifica daca s-a intors ceva din baza de date
                if (!empty($group))
                {
                    // incepe sa se creeze formatul cu tot cu titlu si culori
			        $format = $group['namestyle'];
			        $userin = substr_count($format, "{username}");
			        if($userin == 0) {
				        $format = "{username}";
			        }
			        $format = stripslashes($format);
			        $usergroup = str_replace("{username}", $group['title'], $format);
                    // se aduga la stringul final
			        $final .= " [".$usergroup."] ";
                }
                // daca nu s-a intors nimic din baza de date, se trece la urmatorul element de ordine
            }
            }
         }
         // se produce afisarea datelor
         switch($mybb->settings['ugl_mode'])  
         {  
            case 2 :
                // tema avansata, cu imagini la statistici
                $ugl_final = grouplegend_template($final, "complex");
                // in sfarsit se creeaza template-ul cu datele prelucrate
                eval("\$ugl_userlegend = \"".$templates->get("ugl_template")."\";"); 
                break;
            case 1 :
                // tema simpla, fara imagini la statistici   
                $ugl_final = grouplegend_template($final, "simple");
                // in sfarsit se creeaza template-ul cu datele prelucrate
                eval("\$ugl_userlegend = \"".$templates->get("ugl_template")."\";"); 
                break;
            default :
                // cazul in care este setat pe Automatic
                // va trebui sa procesam template-ul mama si sa vedem daca are sau nu mai multe coloane
                if (strpos($templates->get("index_whosonline"), "colspan") === false) {
                    // atunci e tema simpla
                    $ugl_final = grouplegend_template($final, "simple");
                }
                else {
                    // e tema avansata, complexa
                    $ugl_final = grouplegend_template($final, "complex");
                }
                eval("\$ugl_userlegend = \"".$templates->get("ugl_template")."\";"); 
         }
     }
    // daca pluginul nu e activ nu se intampla nimic !
}
?>