Login   Register  
PHP Classes
elePHPant
Icontem

File: README

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of giuseppe lucarelli  >  reconfig  >  README  >  Download  
File: README
Role: Documentation
Content type: text/plain
Description: documentation file
Class: reconfig
Get configuration from files, pages and databases
Author: By
Last change: added some xml configuration examples
Date: 1 month ago
Size: 59,912 bytes
 

Contents

Class file image Download
This program can read/write input/output data from/to database or text files, like static web pages,
and extract data with regular expression. Mysql/mysqli, postgresql and mssql server databases are
supported.
I'm sorry but this is a very little program explanation. You better understand with examples.

example/bibris/index.html    (running at http://digiteca.bsmc.it)
    controller.php
    detail.php
    search.php
    advsearch.php

example/percor/index.html    (for managing web page
    controller.php            http://www.bsmc.it/modules.php?name=Content&pa=showpage&pid=40)
                             (install or view at http://digiteca.bsmc.it/reconfig/example/percor)

example/bsmc/log.html        (for managing varius log files)
    controller.php           (install or view at http://digiteca.bsmc.it/reconfig/bsmc/log.html)

example/storia/index.html    (for managing right block named "incontri di storia" at http://bsmc.it)
    controller.php           (install or view at http://digiteca.bsmc.it/reconfig/example/storia)

example/pop3ml/index.html    (for managing "pop3ml" mailing list manager installation)
    controller.php           (install or view at http://digiteca.bsmc.it/reconfig/example/pop3ml)
example/pop3ml/viewmsg.html  (for viewing "pop3ml" mailing list manager installation email messages)
    vmcontroller.php         (only view at
                              http://digiteca.bsmc.it/reconfig/example/pop3ml/viewmsg.html)
example/pop3ml/test_pop3ml.html (for testing "pop3ml" mailing list class)
    vmcontroller.php         (install or view with limited functionality at
                              http://digiteca.bsmc.it/reconfig/example/pop3ml/test_pop3ml.html)


this class works with jquery.reconfig-1.0.js, a jquery plugin. for example:

<html>
<head>
<SCRIPT LANGUAGE="JavaScript" SRC="js/jquery-1.6.2.min.js"></SCRIPT>
<SCRIPT LANGUAGE="JavaScript" SRC="js/jquery.reconfig-1.0.js"></SCRIPT>
<SCRIPT TYPE="text/javascript">
var $reconfig={
    init: function () {
        $.reconfig.defaults = $.extend($.reconfig.defaults,this.settings);
    },
    settings: {
        auth_host: 'localhost',
        auth_user: 'demo',
        auth_pass: 'demo',
        lang: 'en',
        items: null,
        controller: 'controller.php',
        language: null
    }
};
// if there is no 'target' option use '$reconfig' var for input/output object
$(document).ready(function() {
    $('#building').reconfig({action: ['login','build']});
</SCRIPT>
<BODY>
<div id="building">
</BODY>
</HTML>



EXAMPLES:

extracting data from a xml file:
-------------------------------

<?xml version="1.0" encoding="iso-8859-1"?>
<glz:Config>
        <glz:Import src="MWCMS_info.xml" />
        <glz:Param name="DATASOURCE_MODE" value="db" />
        <glz:Param name="DB_HOST" value="localhost" />
        <glz:Param name="DB_NAME" value="cms_test" />
        <glz:Param name="DB_USER" value="user" />
        <glz:Param name="DB_PSW" value="" />
        <glz:Param name="DB_PREFIX" value="cms_" />
        <glz:Param name="SMTP_HOST" value="hostme" />
        <glz:Param name="SMTP_USER" value="admin" />
        <glz:Param name="SMTP_PSW" value="1234" />
        <glz:Param name="SMTP_SENDER" value="MIBAC" />
        <glz:Param name="SMTP_EMAIL" value="me@me.com" />
        <glz:Param name="START_PAGE" value="1" />
        <glz:Param name="SEF_URL" value="true" />
        <glz:Param name="CACHE_CODE" value="-1" />
        <glz:Param name="PSW_METHOD" value="" />
        <glz:Param name="DEBUG" value="false" />
        <glz:Param name="USER_DEFAULT_ACTIVE_STATE" value="1" />
</glz:Config>

example of php code (controller.php):

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->auth='none';     // 'httpHeader';  'sql';
    $HTML = array(
        'building'=>array(
            array('type'=>'input','name'=>'db_name','label'=>'db name',
                'in'=>array('type'=>'file','path'=>'config.xml',
                    'regexp'=>array(array('pattern'=>"/(?:[[:space:]]+|)<glz:Param name=['\"]DB_NAME['\"] value=[\"'](.*)[\"'](?:\s+|)\/>/imU"))),
                'out'=>array('type'=>'file','path'=>'config.xml',
                    'regexp'=>array(array('pattern'=>"/(.*(?:[[:space:]]+|)<glz:Param name=['\"]DB_NAME['\"] value=[\"'])(.*)([\"'].*Config>$)/imsU")))),
            array('type'=>'input','name'=>'db_user','label'=>'db user',
                'in'=>array('regexp'=>array(array('pattern'=>"/(?:[[:space:]]+|)<glz:Param name=['\"]DB_USER['\"] value=[\"'](.*)[\"'](?:\s+|)\/>/imU"))),
                'out'=>array('regexp'=>array(array('pattern'=>"/(.*(?:[[:space:]]+|)<glz:Param name=['\"]DB_USER['\"] value=[\"'])(.*)([\"'].*Config>$)/imsU")))),
            array('type'=>'input','name'=>'db_psw','label'=>'db psw',
                'in'=>array('regexp'=>array(array('pattern'=>"/(?:[[:space:]]+|)<glz:Param name=['\"]DB_PSW['\"] value=[\"'](.*)[\"'](?:\s+|)\/>/imU"))),
                'out'=>array('regexp'=>array(array('pattern'=>"/(.*(?:[[:space:]]+|)<glz:Param name=['\"]DB_PSW['\"] value=[\"'])(.*)([\"'].*Config>$)/imsU")))),
           ....
        )
    );
    $REC->Init($HTML['building'],'building');
    echo json_encode($HTML);
?>

Running with javascript code for building:

        var $reconfig = { settings: { lang:'en',language:{...},... }};
        $('#building').reconfig({target:$reconfig,action: ['exec','build'],
            controller:'controller.php',do_after_build:function.....});

'$reconfig.settings.json_data' will be filled with an object like this:
        building=[{name:'db_name',...,values:['cms_test']..},{name:'db_user',...,values:['user'],..}]


Running with javascript code for saving:

        $('#building').reconfig({action:'save','controller':'controller.php',
            json_data: $reconfig.settings.json_data,
            do_after_save: function(data) ....});


simplified example from 'storia', extracting data from a web page of my library web site:
-----------------------------------------------------------------------------------------

<html>
...
<center>
<div class="dtree">
<script>
var eventi = {
'evento1':['31/12/2012 24:00','Agor&agrave; scuola aperta','http://www.agorascuolalaterza.it/programma/','ottobre-novembre 2011<br>Altamura, Bari, Bologna, Corato, Milano, Roma'],
'evento2':['19/12/2011 24:00','Sebben che siamo donne<br>150 anni di lotte e conquiste in Italia','http://www.unitn.it/files/download/18578/sebbenchesiamodonne.pdf','10 ottobre 2011-<br>19 dicembre 2011<br>Trento'],
'evento3':['11/04/2012 24:00','L&rsquo;arte pubblica nel &rsquo;900<br>Il mito dell&rsquo;uomo nuovo','/pdf/FAIappuntamenticonlarte.pdf','12 ottobre 2011-<br>11 aprile 2012<br>Roma'],
'evento4':['11/05/2012 24:00','La fabrication des images de guerres &agrave; l&rsquo;&eacute;poque contemporaine','http://www.oehirom.it/files/Programma%20est..pdf','13 ottobre 2011-<br>11 maggio 2012<br>Bruxelles']
};
...
</script>
...
</html>

controller.php:

<?php
    require_once('class.reconfig.php');
    $HTML = array(
        'building'=>array(
            array('type'=>'select','name'=>'storia','label'=>'incontri di storia','encode'=>false,
                // display: 0=key, 1,2,3,..=first item of values, second,third...
                'label'=>'','display'=>'0',
                'attrs'=>array('size'=>4,'style'=>'width: 100%; height: 100%; overflow: scroll'),
                'in'=>array('type'=>'sql','group'=>'storia',
                    'query'=>'select content from fake_table where bid = 22','column'=>'content',
                    'dbhost'=>'localhost','dbname'=>'fake_db',
                    'dbuser'=>'root','dbpass'=>'',
                    'regexp'=>array(
                        array('pattern'=>"/var eventi = \{(.*)\};[$\r\n]/imsU"),
                        array('key'=>true,'pattern'=>"/.*['\"](.*)['\"]:\[(.*)\](?:,|$)/imsU"),
                        array('pattern'=>"/'(.*)'(?:,|$)/imsU"))),
                'out'=>array('type'=>'sql','group'=>'storia','column'=>'content','target'=>'values',
                    'query'=>'update fake_table set __SET__ where bid = 22',
                    'dbhost'=>'localhost','dbname'=>'fake_db',
                    'dbuser'=>'root','dbpass'=>'',
                    'regexp'=>array(
                        array('pattern'=>"/(.*var eventi = \{)(.*)(\}.*center>)/imsU"),
                        array('key'=>true,'sep'=>',',
                              'pattern'=>"/(.*['\"])(.*)(['\"]:\[)(.*)(\])(?:,|$)/imsU"),
                        array('sep'=>',','pattern'=>"/(')(.*)(')$/ims"))),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\''))
        ),
    ...
    );
    ...
    $REC = new REConfig();
    $REC->Init($HTML['building'],'building');
    echo json_encode($HTML);
?>

$HTML will be set with this values:

Array (
    [building] => Array (
        [0] => Array ( 
            [type] => select
            [name] => storia
            [label] => 
            [encode] => 
            [display] => 0
            [attrs] => Array ( [size] => 4 [style] => width: 100%; height: 100%; overflow: scroll) 
            [event] => Array ( [onchange] => '$reconfig.set_event(event);')
            [values] => Array ( 
                [evento1] => Array ( 
                    [0] => 31/12/2012%2024%3A00
                    [1] => Agor%26agrave%3B%20scuola%20aperta
                    [2] => http%3A//www.agorascuolalaterza.it/programma/
                    [3] => ottobre-novembre%202011%3Cbr%3EAltamura%2C%20Bari%2C%20Bologna%2C%20Corato%2C%20Milano%2C%20Roma
                )       
            [evento2] => Array ( 
                    [0] => 19/12/2011%2024%3A00
                    [1] => Sebben%20che%20siamo%20donne%3Cbr%3E150%20anni%20di%20lotte%20e%20conquiste%20in%20Italia
                    [2] => http%3A//www.unitn.it/files/download/18578/sebbenchesiamodonne.pdf
                    [3] => 10%20ottobre%202011-%3Cbr%3E19%20dicembre%202011%3Cbr%3ETrento
                )       
            ...     
            [eventog] => Array ( 
                    [0] => 25/02/2012%2024%3A00
                    [1] => La%20societ%26agrave%3B%20dello%20sguardo%3Cbr%3ERicerche%20sulla%20storia%20della%20visione%20in%20et%26agrave%3B%20contemporanea%3Cbr%3E%28secc.%20XIX-XX%29
                    [2] => http%3A//sguardo.storia.unipd.it/SguardoITA/Societa_dello_sguardo/Home.html
                    [3] => 23-25%20febbraio%202012%3Cbr%3EPadova
            )))))

USING XML INSTEAD PHP ARRAY FOR $HTML:
--------------------------------------

<?php
define('__DRIVER__','mysql');
define('__HOST__','localhost');
define('__DBNAME__','name');
define('__USER__','root');
define('__PASS__','1234');
$cname='constant';
$XML = <<<EOF
<root>
 <authentication>
 </authentication>
 <building>
  <item>
   <type>select</type><name>storia</name><display>1</display>
   <attrs><size>4</size><style>width: 100%; height: 100%; overflow: scroll</style></attrs>
   <in>
    <type>sql</type><group>storia</group>
    <query>select content from fake_blocks where bid = 22</query><column>content</column>
    <driver>{$cname('__DRIVER__')}</driver><dbhost>{$cname('__HOST__')}</dbhost><dbname>{$cname('__DBNAME__')}</dbname><dbuser>{$cname('__USER__')}</dbuser><dbpass>{$cname('__PASS__')}</dbpass>
    <regexp><pattern><![CDATA[/var eventi = Array\((.*)\);[\$[:cntrl:]\+]/imsU]]></pattern></regexp>
    <regexp><pattern><![CDATA[/Array\((.*)\)(?:,|$)/imsU]]></pattern></regexp>
    <regexp><pattern><![CDATA[/'(.*)'(?:,|\$)/imsU]]></pattern></regexp>
   </in>
   <out>
    <type>sql</type><group>storia</group><column>content</column><target>values</target>
    <query>update fake_blocks set __SET__ where bid = 22</query>
    <driver>{$cname('__DRIVER__')}</driver><dbhost>{$cname('__HOST__')}</dbhost><dbname>{$cname('__DBNAME__')}</dbname><dbuser>{$cname('__USER__')}</dbuser><dbpass>{$cname('__PASS__')}</dbpass>
    <regexp><pattern><![CDATA[/(.*var eventi = Array\()(.*)(\);.*center>)/imsU]]></pattern></regexp>
    <regexp><sep>,</sep><pattern><![CDATA[/(.*Array\()(.*)(\))(?:,|\$)/imsU]]></pattern></regexp>
    <regexp><sep>,</sep><pattern><![CDATA[/(')(.*)(')\$/ims]]></pattern></regexp>
   </out>
   <event><onchange>'\$reconfig.set_event(event);'</onchange></event>
  </item>
 </building>
 <eventscounter>
  <item>
   <type>input</type><name>eventscnt</name><label>eventi</label>
   <in>
    <type>file</type><path>/tmp/storia.log</path>
    <func>if(strlen(\$data) == 0) \$data="starting storia log\n";</func>
   </in>
   <out>
    <type>file</type><path>/tmp/storia.log</path>
    <func>\$value = \$data.\$this->LogCommand(\$value);</func>
   </out>
  </item>
 </eventscounter>
</root>
EOF;
$HTML=$REC->XmlConvert($XML);
....

different way to write the previous code:
----------------------------------------

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->sources = array('building'=>array(
        'in'=>array('type'=>'sql',
            'query'=>'select content from fake_table where bid = 22','column'=>'content',
            'dbhost'=>'localhost','dbname'=>'fake_db',
            'dbuser'=>'root','dbpass'=>'',
            'regexp'=>array(
                array('pattern'=>"/var eventi = \{(.*)\};[$\r\n]/imsU"))),
        'out'=>array('type'=>'sql','column'=>'content','target'=>'values',
            'query'=>'update fake_table set __SET__ where bid = 22',
            'dbhost'=>'localhost','dbname'=>'fake_db',
            'dbuser'=>'root','dbpass'=>'',
            'regexp'=>array(
                array('pattern'=>"/(.*var eventi = \{)(.*)(\}.*center>)/imsU"))))
    );

    $HTML = array(
        'building'=>array(
            array('type'=>'select','name'=>'storia','label'=>'incontri di storia','encode'=>false,
                'label'=>'','display'=>'0',
                'attrs'=>array('size'=>4,'style'=>'width: 100%; height: 100%; overflow: scroll'),
                'in'=>array('depth'=>2,
                    'regexp'=>array(
                        array('key'=>true,'pattern'=>"/.*['\"](.*)['\"]:\[(.*)\](?:,|$)/imsU"),
                        array('pattern'=>"/'(.*)'(?:,|$)/imsU"))),
                'out'=>array('target'=>'values',
                    'regexp'=>array(
                        array('key'=>true,'sep'=>',',
                              'pattern'=>"/(.*['\"])(.*)(['\"]:\[)(.*)(\])(?:,|$)/imsU"),
                        array('sep'=>',','pattern'=>"/(')(.*)(')$/ims"))),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\''))
        )
    );

    $REC->Init($HTML['building'],'building');
    echo json_encode($HTML);


a third way to write the previous code:

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->sources = array('building'=>array(
        'in'=>array('type'=>'sql','depth'=>2,
            'query'=>'select content from fake_table where bid = 22','column'=>'content',
            'dbhost'=>'localhost','dbname'=>'fake_db',
            'dbuser'=>'root','dbpass'=>'',
            'regexp'=>array(
                array('pattern'=>"/var eventi = \{(.*)\};[$\r\n]/imsU"),
                array('key'=>true,'pattern'=>"/.*['\"](.*)['\"]:\[(.*)\](?:,|$)/imsU"),
                array('pattern'=>"/'(.*)'(?:,|$)/imsU"))),
        'out'=>array('type'=>'sql','column'=>'content','target'=>'values',
            'query'=>'update fake_table set __SET__ where bid = 22',
            'dbhost'=>'localhost','dbname'=>'fake_db',
            'dbuser'=>'root','dbpass'=>'',
            'regexp'=>array(
                array('pattern'=>"/(.*var eventi = \{)(.*)(\}.*center>)/imsU"),
                array('key'=>true,'sep'=>',',
                      'pattern'=>"/(.*['\"])(.*)(['\"]:\[)(.*)(\])(?:,|$)/imsU"),
                array('sep'=>',','pattern'=>"/(')(.*)(')$/ims")))
        )
    );

    $HTML = array(
        'building'=>array(
            array('type'=>'select','name'=>'storia','label'=>'incontri di storia','encode'=>false,
                'label'=>'','display'=>'0',
                'attrs'=>array('size'=>4,'style'=>'width: 100%; height: 100%; overflow: scroll'),
                'in'=>array('depth'=>2,'column'=>'content'),
                'out'=>array('target'=>'values','column'=>'content'),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\''))
        )
    );

    $REC->Init($HTML['building'],'building');
    echo json_encode($HTML);


example from 'storia' demo version, extracting data from a text file (storia_demo.html)
-----------------------------------------------------------------------------------------

<?php
    require_once('class.reconfig.php');
    $HTML = array(
        'building'=>array(
            array('type'=>'select','name'=>'storia','label'=>'incontri di storia',
                'encode'=>false,'label'=>'','display'=>'0',
                'attrs'=>array('size'=>4,'style'=>'width: 100%; height: 100%; overflow: scroll'),
                'in'=>array('type'=>'file','path'=>'storia_demo.html',
                    'regexp'=>array(
                        array('pattern'=>"/var eventi = \{(.*)\};[$\r\n]/imsU"),
                        array('key'=>true,'pattern'=>"/.*['\"](.*)['\"]:\[(.*)\](?:,|$)/imsU"),
                        array('pattern'=>"/'(.*)'(?:,|$)/imsU"))),
                'out'=>array('type'=>'file','path'=>'storia_demo.html','target'=>'values',
                    'regexp'=>array(
                        array('pattern'=>"/(.*var eventi = \{)(.*)(\}.*center>)/imsU"),
                        array('key'=>true,'sep'=>',',
                              'pattern'=>"/(.*['\"])(.*)(['\"]:\[)(.*)(\])(?:,|$)/imsU"),
                        array('sep'=>',','pattern'=>"/(')(.*)(')$/ims"))),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\''))
        )
    );
    $REC->Init($HTML['building'],'building');
    echo json_encode($HTML);


different way to write the previous code:

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->sources = array('building'=>array(
        'in'=>array('type'=>'file','path'=>'storia_demo.html',
            'regexp'=>array(
                array('pattern'=>"/var eventi = \{(.*)\};[$\r\n]/imsU"))),
        'out'=>array('type'=>'file','path'=>'storia_demo.html','target'=>'values',
            'regexp'=>array(
                array('pattern'=>"/(.*var eventi = \{)(.*)(\}.*center>)/imsU"))))
    );
    $HTML = array(
        'building'=>array(
            array('type'=>'select','name'=>'storia','label'=>'incontri di storia',
                'encode'=>false,'label'=>'','display'=>'0',
                'attrs'=>array('size'=>4,'style'=>'width: 100%; height: 100%; overflow: scroll'),
                'in'=>array('depth'=>2,
                    'regexp'=>array(
                        array('key'=>true,'pattern'=>"/.*['\"](.*)['\"]:\[(.*)\](?:,|$)/imsU"),
                        array('pattern'=>"/'(.*)'(?:,|$)/imsU"))),
                'out'=>array('target'=>'values',
                    'regexp'=>array(
                        array('key'=>true,'sep'=>',',
                              'pattern'=>"/(.*['\"])(.*)(['\"]:\[)(.*)(\])(?:,|$)/imsU"),
                        array('sep'=>',','pattern'=>"/(')(.*)(')$/ims"))),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\''))
        )
    );
    $REC->Init($HTML['building'],'building');
    echo json_encode($HTML);


a third way to write the previous code:

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->sources = array('building'=>array(
        'in'=>array('type'=>'file','path'=>'storia_demo.html','depth'=>2,
            'regexp'=>array(
                array('pattern'=>"/var eventi = \{(.*)\};[$\r\n]/imsU"),
                array('key'=>true,'pattern'=>"/.*['\"](.*)['\"]:\[(.*)\](?:,|$)/imsU"),
                array('pattern'=>"/'(.*)'(?:,|$)/imsU"))),
        'out'=>array('type'=>'file','path'=>'storia_demo.html','target'=>'values',
            'regexp'=>array(
                array('pattern'=>"/(.*var eventi = \{)(.*)(\}.*center>)/imsU"),
                array('key'=>true,'sep'=>',',
                      'pattern'=>"/(.*['\"])(.*)(['\"]:\[)(.*)(\])(?:,|$)/imsU"),
                array('sep'=>',','pattern'=>"/(')(.*)(')$/ims"))),
        )
    );

    $HTML = array(
        'building'=>array(
            array('type'=>'select','name'=>'storia','label'=>'incontri di storia',
                'encode'=>false,'label'=>'','display'=>'0',
                'attrs'=>array('size'=>4,'style'=>'width: 100%; height: 100%; overflow: scroll'),
                'in'=>array('depth'=>2),
                'out'=>array('target'=>'values'),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\''))
        )
    );
    $REC->Init($HTML['building'],'building');
    echo json_encode($HTML);



simplified example from 'percor':
--------------------------------

<?php
    require_once('class.reconfig.php');
    $HTML = array(
        'building'=>array(
            array('type'=>'html','code'=>'<fieldset><legend align="left"><span class="row reconfig">periodici correnti</span></legend><ul><li>'),
            array('type'=>'select','name'=>'percor','encode'=>true,
                'label'=>'','display'=>'0',
                'in'=>array('type'=>'sql','group'=>'percor',
                    'query'=>'select text from fake_table where pid = 40','column'=>'text',
                    'dbconn'=>null,'dbhost'=>'localhost','dbname'=>'fake_db',
                    'dbuser'=>'root','dbpass'=>'',
                    'regexp'=>array(
                        array('pattern'=>
                            "/<ul id=[\"']percorUlList[\"']>(.*)<\/ul>(?:[[:space:]]|$)/ims"),
                        array('key'=>true,'pattern'=>
                            "/<!-- <a name=[\"'](.)[\"']> -->(.*)<!-- end -->/imsU"))),
                'out'=>array('type'=>'sql','group'=>'percor','target'=>'values','column'=>'text',
                    'query'=>'update fake_table set __SET__ where pid = 40',
                    'dbconn'=>null,'dbhost'=>'localhost','dbname'=>'fake_db',
                    'dbuser'=>'root','dbpass'=>'',
                    'regexp'=>array(
                        array('pattern'=>"/(.*<ul id=[\"']percorUlList[\"']>)(.*)(<\/ul>.*)/ims"),
                        array('key'=>true,'sep'=>'',
                            'pattern'=>
                                "/(<!-- <a name=[\"'])(.)([\"']> -->)(.*)(<!-- end -->)/imsU"))),
                'attrs'=>array('multiple'=>'multiple','size'=>4),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\'')),
            array('type'=>'html','code'=>'</li><li>'),
            ...
    ));
    ...
    $REC = new REConfig();
    $REC->auth_type='httpHeader'; //'none'; //'sql';
    $REC->auth_passwd=array('demo'=>'demo');
    $REC->auth_host = @$_POST['auth_host'];
    $REC->auth_user = @$_POST['auth_user'];
    $REC->auth_pass = @$_POST['auth_pass'];
    $REC->action = $_POST['action'];
    $REC->Init($HTML['building'],'building',true);
    echo json_encode($HTML);
?>

different way to write the previous code:

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->sources=array(
        'building'=>array(
            'in'=>array('type'=>'sql',
                'query'=>'select text from fake_table where pid = 40','column'=>'text',
                'dbconn'=>null,'dbhost'=>'localhost','dbname'=>'fake_db',
                'dbuser'=>'root','dbpass'=>'',
                'regexp'=>array(
                    array('pattern'=>
                        "/<ul id=[\"']percorUlList[\"']>(.*)<\/ul>(?:[[:space:]]|$)/ims"))),
            'out'=>array('type'=>'sql','target'=>'values','column'=>'text',
                'query'=>'update fake_table set __SET__ where pid = 40',
                'dbconn'=>null,'dbhost'=>'localhost','dbname'=>'fake_db',
                'dbuser'=>'root','dbpass'=>'',
                'regexp'=>array(
                    array('pattern'=>"/(.*<ul id=[\"']percorUlList[\"']>)(.*)(<\/ul>.*)/ims")))
        )
    );

    $HTML = array(
        'building'=>array(
            array('type'=>'html','code'=>'<fieldset><legend align="left"><span class="row reconfig">periodici correnti</span></legend><ul><li>'),
            array('type'=>'select','name'=>'percor','encode'=>true,
                'label'=>'','display'=>'0',
                'in'=>array('depth'=>1,
                    'regexp'=>array(
                        array('key'=>'1','pattern'=>
                            "/<!-- <a name=[\"'](.)[\"']> -->(.*)<!-- end -->/imsU"))),
                'out'=>array('target'=>'values',
                    'regexp'=>array(
                        array('key'=>true,'sep'=>'',
                            'pattern'=>
                                "/(<!-- <a name=[\"'])(.)([\"']> -->)(.*)(<!-- end -->)/imsU"))),
                'attrs'=>array('multiple'=>'multiple','size'=>4),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\'')),
            array('type'=>'html','code'=>'</li><li>'),
    ...
    );
    ...
    $REC->Init($HTML['building'],'building',true);
    echo json_encode($HTML);
?>


a third way to write the previous code:

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->sources=array(
        'building'=>array(
            'in'=>array('type'=>'sql','column'=>'text','rstype'=>'assoc','depth'=>1,
                'query'=>'select text from fake_table where pid = 40','column'=>'text',
                'dbconn'=>null,'dbhost'=>'localhost','dbname'=>'fake_db',
                'dbuser'=>'root','dbpass'=>'',
                'regexp'=>array(
                    array('pattern'=>
                        "/<ul id=[\"']percorUlList[\"']>(.*)<\/ul>(?:[[:space:]]|$)/ims"),
                        array('key'=>'1','pattern'=>
                            "/<!-- <a name=[\"'](.)[\"']> -->(.*)<!-- end -->/imsU"))),
            'out'=>array('type'=>'sql','target'=>'values','column'=>'text','rstype'=>'assoc',
                'query'=>'update fake_table set __SET__ where pid = 40',
                'dbconn'=>null,'dbhost'=>'localhost','dbname'=>'fake_db',
                'dbuser'=>'root','dbpass'=>'',
                'regexp'=>array(
                    array('pattern'=>"/(.*<ul id=[\"']percorUlList[\"']>)(.*)(<\/ul>.*)/ims"),
                        array('key'=>true,'sep'=>'',
                            'pattern'=>
                                "/(<!-- <a name=[\"'])(.)([\"']> -->)(.*)(<!-- end -->)/imsU")))
        )
    );

    $HTML = array(
        'building'=>array(
            array('type'=>'html','code'=>'<fieldset><legend align="left"><span class="row reconfig">periodici correnti</span></legend><ul><li>'),
            array('type'=>'select','name'=>'percor','encode'=>true,
                'label'=>'','display'=>'0',
                'in'=>array('column'=>'text','depth'=>1),
                'out'=>array('target'=>'values','column'=>'text'),
                'attrs'=>array('multiple'=>'multiple','size'=>4),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\'')),
            array('type'=>'html','code'=>'</li><li>'),
    ...
    );
    ...
    $REC->Init($HTML['building'],'building',true);
    echo json_encode($HTML);
?>

example from 'percor' demo version, extracting data from a text file (percor_demo.html)
-----------------------------------------------------------------------------------------

<?php
    require_once('class.reconfig.php');
    $HTML = array(
        'building'=>array(
            array('type'=>'html','code'=>'<fieldset><legend align="left"><span class="row reconfig">periodici correnti</span></legend><ul><li>'),
            array('type'=>'select','name'=>'percor','encode'=>true,
                'label'=>'','display'=>'0',
                'in'=>array('type'=>'file','path'=>'percor_demo.html',
                    'regexp'=>array(
                        array('pattern'=>
                            "/<ul id=[\"']percorUlList[\"']>(.*)<\/ul>(?:[[:space:]]|$)/ims"),
                        array('key'=>true,'pattern'=>
                            "/<!-- <a name=[\"'](.)[\"']> -->(.*)<!-- end -->/imsU"))),
                'out'=>array('type'=>'file','target'=>'values','path'=>'percor_demo.html',
                    'regexp'=>array(
                        array('pattern'=>"/(.*<ul id=[\"']percorUlList[\"']>)(.*)(<\/ul>.*)/ims"),
                        array('key'=>true,'sep'=>'',
                            'pattern'=>
                                "/(<!-- <a name=[\"'])(.)([\"']> -->)(.*)(<!-- end -->)/imsU"))),
                'attrs'=>array('multiple'=>'multiple','size'=>4),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\'')),
            array('type'=>'html','code'=>'</li><li>'),
    ...
    );
    ...
    $REC->Init($HTML['building'],'building',true);
    echo json_encode($HTML);
?>

different way to write the previous code:

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->sources=array(
        'building'=>array(
            'in'=>array('type'=>'file','path'=>'percor_demo.html',
                'regexp'=>array(
                    array('pattern'=>
                        "/<ul id=[\"']percorUlList[\"']>(.*)<\/ul>(?:[[:space:]]|$)/ims"))),
            'out'=>array('type'=>'file','target'=>'values','path'=>'percor_demo.html',
                'regexp'=>array(
                    array('pattern'=>"/(.*<ul id=[\"']percorUlList[\"']>)(.*)(<\/ul>.*)/ims")))
        )
    );

    $HTML = array(
        'building'=>array(
            array('type'=>'html','code'=>'<fieldset><legend align="left"><span class="row reconfig">periodici correnti</span></legend><ul><li>'),
            array('type'=>'select','name'=>'percor','encode'=>true,
                'label'=>'','display'=>'0',
                'in'=>array('depth'=>1,
                    'regexp'=>array(
                        array('key'=>true,'pattern'=>
                            "/<!-- <a name=[\"'](.)[\"']> -->(.*)<!-- end -->/imsU"))),
                'out'=>array('target'=>'values',
                    'regexp'=>array(
                        array('key'=>true,'sep'=>'','pattern'=>
                                "/(<!-- <a name=[\"'])(.)([\"']> -->)(.*)(<!-- end -->)/imsU"))),
                'attrs'=>array('multiple'=>'multiple','size'=>4),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\'')),
            array('type'=>'html','code'=>'</li><li>'),
    ...
    );
    ...
    $REC->Init($HTML['building'],'building',true);
    echo json_encode($HTML);
?>


a third way to write the previous code:

<?php
    require_once('class.reconfig.php');
    $REC = new REConfig();
    $REC->sources=array(
        'building'=>array(
            'in'=>array('type'=>'file','path'=>'percor_demo.html','depth'=>1,
                'regexp'=>array(
                    array('pattern'=>
                        "/<ul id=[\"']percorUlList[\"']>(.*)<\/ul>(?:[[:space:]]|$)/ims"),
                    array('key'=>true,'pattern'=>
                        "/<!-- <a name=[\"'](.)[\"']> -->(.*)<!-- end -->/imsU"))),
            'out'=>array('type'=>'file','target'=>'values','path'=>'percor_demo.html',
                'regexp'=>array(
                    array('pattern'=>"/(.*<ul id=[\"']percorUlList[\"']>)(.*)(<\/ul>.*)/ims"),
                    array('key'=>true,'sep'=>'',
                        'pattern'=>"/(<!-- <a name=[\"'])(.)([\"']> -->)(.*)(<!-- end -->)/imsU")))
        )
    );

    $HTML = array(
        'building'=>array(
            array('type'=>'html','code'=>'<fieldset><legend align="left"><span class="row reconfig">periodici correnti</span></legend><ul><li>'),
            array('type'=>'select','name'=>'percor','encode'=>true,
                'label'=>'','display'=>'0',
                'in'=>array('depth'=>1),
                'out'=>array('target'=>'values'),
                'attrs'=>array('multiple'=>'multiple','size'=>4),
                'event'=>array('onchange'=>'\'$reconfig.set_event(event);\'')),
            array('type'=>'html','code'=>'</li><li>'),
    ...
    );
    ...
    $REC->Init($HTML['building'],'building',true);
    echo json_encode($HTML);

XML example:
-----------

<?php
....
$XML = <<<EOF
<root>
 <building>
  <!--<source>
    <dbhost>localhost</dbhost><dbname>fakedb</dbname><dbuser>root</dbuser><column>text</column>
  </source>-->
  <item><type>html</type><code><![CDATA[<fieldset><legend align="left"><span class="row reconfig">periodici correnti</span></legend><ul><li>]]></code></item>
  <item>
   <type>select</type><name>percor</name><encode>true</encode><display>0</display>
   <attrs><multiple>multiple</multiple><size>4</size></attrs>
   <event><onchange><![CDATA['\$reconfig.set_event(event);']]></onchange></event>
   <in>
    <group>percor</group><type>sql</type>
    <query>select text from faketable where id = 40</query>
    <dbhost>localhost</dbhost><dbname>fakedb</dbname><dbuser>root</dbuser><column>text</column>
    <regexp><pattern><![CDATA[/<ul id=["']percorUlList["']>(.*)<\/ul>(?:[[:space:]]|\$)/ims]]></pattern></regexp>
    <regexp><key>1</key><pattern><![CDATA[/<!-- <a name=["'](.)["']> -->(.*)<!-- end -->/imsU]]></pattern></regexp>
   </in>
   <out>
    <group>percor</group><type>sql</type><target>values</target>
    <query>update faketable set __SET__ where pid = 40</query>
    <dbhost>localhost</dbhost><dbname>fakedb</dbname><dbuser>root</dbuser><column>text</column>
    <regexp><pattern><![CDATA[/(.*<ul id=["']percorUlList["']>)(.*)(<\/ul>.*)/ims]]></pattern></regexp>
    <regexp><key>1</key><pattern><![CDATA[/(<!-- <a name=["'])(.)(["']> -->)(.*)(<!-- end -->)/imsU]]></pattern></regexp>
   </out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>select</type><name>percorbyletter</name>
   <attrs><multiple>multiple</multiple><size>4</size></attrs>
   <event><onchange><![CDATA[\$reconfig.set_link(null)]]></onchange></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[<br></li><li>]]></code></item>
  <item><type>html</type><code><![CDATA[<label class="is_ml" id="lresult" for="result">result</label><div id="result"></div>]]></code></item>
  <item><type>html</type><code><![CDATA[<br></li><li>]]></code></item>
  <item>
   <type>textarea</type><name>link</name><label>link</label>
   <in>false</in></item>
  <item><type>html</type><code><![CDATA[<br></li><li>]]></code></item>
  <item>
   <type>input</type><name>titolodes</name><label>titolo/link</label>
   <attrs><class>ftinput</class></attrs>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>input</type><name>titololink</name>
   <attrs><class>ftinput</class></attrs>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[<br></li><li>]]></code></item>
  <item>
   <type>input</type><name>ft1</name><label>ft/link</label>
   <attrs><class>ftinput</class></attrs>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>input</type><name>ft1link</name>
   <attrs><class>ftinput</class></attrs>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[<br></li><li>]]></code></item>
  <item>
   <type>input</type><name>ft2</name><label>ft/link</label>
   <attrs><class>ftinput</class></attrs>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>input</type><name>ft2link</name>
   <attrs><class>ftinput</class></attrs>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[<br></li><li>]]></code></item>
  <item>
   <type>input</type><name>ft3</name><label>ft/link</label>
   <attrs><class>ftinput</class></attrs>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>input</type><name>ft3link</name>
   <attrs><class>ftinput</class></attrs>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[<br></li><li>]]></code></item>
  <item>
   <type>button</type><name>update</name><value>update</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA['\$reconfig.update_event();']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>button</type><name>insert</name><value>insert</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA['\$reconfig.add_event("insert");']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>button</type><name>append</name><value>append</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA['\$reconfig.add_event("append");']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>button</type><name>remove</name><value>remove</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA['\$reconfig.remove_event();']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>button</type><name>copy</name><value>copy</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA['\$reconfig.copy_event();']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>button</type><name>past</name><value>past</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA['\$reconfig.past_event();']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li><span id="lpercorcounter">contatore</span>]]></code></item>
  <item>
   <type>input</type><name>percorcounter</name>
   <attrs><class>is_ml</class></attrs>
   <in>
    <type>file</type><group>percorcounter</group><path>/tmp/percor.log</path>
     <func><![CDATA[if(strlen(\$data) == 0) \$data="starting percor log\\n";]]></func>
   </in>
   <out>
    <group>percorcounter</group>
    <func><![CDATA[\$value = \$data.\$this->LogCommand(\$data);]]></func>
   </out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>button</type><name>save</name><value>save</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA[\$reconfig.save();]]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>button</type><name>backup</name><value>backup</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA[\$reconfig.manage("controller.php","backup");]]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li><li>]]></code></item>
  <item>
   <type>button</type><name>restore</name><value>restore</value>
   <attrs><class>is_ml</class></attrs>
   <event><onclick><![CDATA[\$reconfig.manage("controller.php","restore");]]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item><type>html</type><code><![CDATA[</li></ul></fieldset>]]></code></item>
 </building>
</root>
EOF;
$HTML=$REC->XmlConvert($XML);

example from 'bsmc', managing varius log file
---------------------------------------------

<?php
    require_once('class.reconfig.php');
    $HTML = array(
        'building'=>array(
            array('type'=>'textarea','name'=>'logstoria',
                'in'=>array('type'=>'file','path'=>'/tmp/storia.log','group'=>'storia'),
                'out'=>array('type'=>'file','path'=>'/tmp/storia.log','group'=>'storia')),
            array('type'=>'textarea','name'=>'logpercor',
                'in'=>array('type'=>'file','path'=>'/tmp/percor.log','group'=>'percor'),
                'out'=>array('type'=>'file','path'=>'/tmp/percor.log','group'=>'percor')),
            array('type'=>'textarea','name'=>'logavvisi',
                'in'=>array('type'=>'file','path'=>'/tmp/avvisi.log','group'=>'avvisi'),
                'out'=>array('type'=>'file','path'=>'/tmp/avvisi.log','group'=>'avvisi')),
            array('type'=>'textarea','name'=>'log900',
                'in'=>array('type'=>'file','path'=>'/tmp/900.log','group'=>'900'),
                'out'=>array('type'=>'file','path'=>'/tmp/900.log','group'=>'900')),
            array('type'=>'textarea','name'=>'logml',
                'in'=>array('type'=>'file','path'=>'/tmp/pop3ml.log','group'=>'ml'),
                'out'=>array('type'=>'file','path'=>'/tmp/pop3ml.log','group'=>'ml')),
            array('type'=>'textarea','name'=>'logusers',
                'in'=>array('type'=>'file','path'=>'/tmp/users.log','group'=>'users'),
                'out'=>array('type'=>'file','path'=>'/tmp/users.log','group'=>'users')),
        )
    );
    $REC->Init($HTML['building'],'building',true);
    echo json_encode($HTML);



simplified example from 'bibris' (controller.php):
-------------------------------------------------

    $REC = new REConfig();
    ...
    $REC->sources = array('building'=>array(
            'in'=>array('type'=>'sql','column'=>true,
                'query'=>'SELECT * FROM table WHERE key = 1',
                'driver'=>'mysqli','dbconn'=>null,'dbhost'=>'localhost',
                'dbname'=>'testdb','dbuser'=>'dbuser','dbpass'=>'letmein'
                )));
    ...

    $HTML = array(
        'building'=>array(
            array('type'=>'input','name'=>'sqlsearch','encode'=>true,
                'in'=>false,
                'event'=>array('onfocus'=>'\'$reconfig.search_got_focus(this);\''),
                'value'=>'search in: manoscritti',
                'html'=>array('prepend'=>
                    '<form action=\'javascript:$reconfig.run_search(null,"search.php");\'>',
                              'append'=>
                    '<a href..........
                )
            ),
            ....
        )
    );
    ...



example from 'bibris' of multiple output (detail.php):
---------------------------------------------------------

$REC = new REConfig();
...
$REC->sources = array(
    'dvPopupTxt'=>array(
        'in'=>array('type'=>'sql',
            'query'=>$REC->BuildQuery('_immagini'),
            'driver'=>__DRIVER__,'dbconn'=>null,'dbhost'=>__HOST__,
            'dbname'=>__DBNAME__,'dbuser'=>__USER__,'dbpass'=>__PASS__),
        'out'=>array('type'=>'sql',
            'query'=>'UPDATE _immagini SET __SET__ WHERE id='))
    'collocazione'=array('name'=>'collocazione',
        'out'=>array('type'=>'sql',
            'driver'=>__DRIVER__,'dbconn'=>null,'dbhost'=>__HOST__,
            'dbname'=>__DBNAME__,'dbuser'=>__USER__,'dbpass'=>__PASS__,
            'query'=>"UPDATE _immagini SET __SET__ WHERE tipologia='".
                @$sqlkeys[$_selected_menu][$_selected_item]."' and titolo="),
        'data'=>array('collocazione'=>'')
    )
);

$HTML = array(
    'dvPopupTxt'=>array(
        array('type'=>'input','name'=>'bid','label'=>'codice SBN',
            'in'=>array('column'=>'bid'),'out'=>true
        ),
        ...
        // item with 2 output group 'dvPopupTxt' and 'extend'
        array('type'=>'input','name'=>'sottotitolo','label'=>'sottotitolo','encode'=>true,
            'in'=>array('column'=>'soggetto'),
            'out'=>array(
                array('group'=>'extend','type'=>'file','path'=>$xmlpath,'depth'=>1,'regexp'=>array(
                    array('pattern'=>'/(.*<Param name="sottotitolo" value=")(.*)(".*item>)$/imsU'))),
                array('group'=>'dvPopupTxt','column'=>'soggetto')
            )
        ),
        ...
        // item with 3 output group 'dvPopupTxt', 'extend' and 'collocazione'
        array('type'=>'input','name'=>'collocazione','label'=>'collocazione','encode'=>true,
            'in'=>array('group'=>'extend',
                'regexp'=>array(
                    array('pattern'=>'/<Param name="collocazione" value="(.*)"/imsU'))),
            'out'=>array(
                array('group'=>'extend','regexp'=>array(
                    array('pattern'=>'/(.*<Param name="collocazione" value=")(.*)(".*item>)$/imsU'))),
                array('group'=>'dvPopupTxt','column'=>'collocazione'),
                array('group'=>'collocazione','column'=>'collocazione')
            )
        ),
        ...


XML example from 'article':
-------------------------
define('__DRIVER__','mysql');
define('__HOST__','localhost');
define('__DBNAME__','dbname');
define('__USER__','root');
define('__PASS__','1234');
$cname='constant';
$XML = <<<EOF
<root>
 <building>
  <source>
   <in>
    <type>sql</type><utf8_decode>true</utf8_decode>
    <driver>{$cname('__DRIVER__')}</driver><dbhost>{$cname('__HOST__')}</dbhost><dbname>{$cname('__DBNAME__')}</dbname><dbuser>{$cname('__USER__')}</dbuser><dbpass>{$cname('__PASS__')}</dbpass><query>SELECT * FROM fake_stories WHERE sid=</query>
    <func><![CDATA[if(\$data != null) { if(strlen(\$data["time"]) <= 0) \$data["time"]=date("Y/m/d H:i:s"); } else { \$data=array("sid"=>"","title"=>"","topic"=>"","catid"=>"","hometext"=>"","bodytext"=>"","notes"=>"","ihome"=>"0","time"=>date("Y/m/d H:i:s"),"aid"=>"admin","informant"=>"admin","counter"=>"0","alanguage"=>"italian","expire"=>date("Y/m/d H:i:s")); } \$data["acomm"]="1"; \$this->sources["building"]["columns"]=array("aid"=>true,"informant"=>true,"acomm"=>true,"counter"=>true,"alanguage"=>true);]]></func>
   </in>
   <out>
    <type>sql</type><utf8_decode>true</utf8_decode>
    <driver>{$cname('__DRIVER__')}</driver><dbhost>{$cname('__HOST__')}</dbhost><dbname>{$cname('__DBNAME__')}</dbname><dbuser>{$cname('__USER__')}</dbuser><dbpass>{$cname('__PASS__')}</dbpass><query>SELECT * FROM fake_stories WHERE sid=</query>
   </out>
  </source>
  <item>
   <type>select</type><name>artlist</name><label>articoli</label><encode>true</encode><display>1</display><selbycode>true</selbycode>
   <attrs><class>selbox</class><size>9</size></attrs>
   <html><prepend><![CDATA[<div id="dleft">]]></prepend><append><![CDATA[</div>]]></append></html>
   <event><onchange><![CDATA['\$reconfig.selectart("article.php",this);']]></onchange></event>
   <in><group>artlist</group><column><sid>title</sid></column></in>
   <out>false</out>
  </item>
  <item>
   <type>input</type><name>id</name><label>id</label>
   <html><prepend><![CDATA[<div id="dright"><ul><li>]]></prepend></html>
   <in><column>sid</column></in><out>true</out>
  </item>
  <item>
   <type>textarea</type><name>title</name><label>titolo</label><encode>true</encode>
   <html><prepend><![CDATA[</li><li>]]></prepend></html>
   <in><column>title</column></in><out>true</out>
  </item>
  <item>
   <type>select</type><name>topic</name><label>argomento</label><display>1</display><selbycode>true</selbycode><lowercase>true</lowercase>
   <html><prepend><![CDATA[</li><li>]]></prepend></html>
   <in><group>argomento</group><column><topicid>topicname</topicid></column></in>
   <out><group>argomento</group><column>topic</column></out>
  </item>
  <item>
   <type>select</type><name>catid</name><label>categoria</label><display>1</display><selbycode>true</selbycode><lowercase>true</lowercase>
   <html><prepend><![CDATA[</li><li>]]></prepend><append><![CDATA[</div>]]></append></html>
   <in><group>categoria</group><column><catid>title</catid></column></in>
   <out><group>categoria</group><column>catid</column></out>
  </item>
  <item>
   <type>html</type>
   <code><![CDATA[</li><li><div width: 600px"><label id="limmagine" for "immagine">immagine</label><div style="float: left; width: 97%" id="dimmagine"><img id="immagine" src="IMGPATH"></div><div style="width: 3%; float: right"><img onclick="\$reconfig.upload()" src="img/upload.png"></div>]]></code>
   <in><group>categoria</group><column><catid>title</catid></column></in>
   <out><group>categoria</group><column>catid</column></out>
  </item>
  <item>
   <type>textarea</type><name>hometext</name><label>testo</label><encode>true</encode>
   <html><prepend><![CDATA[</li><li>]]></prepend><append><![CDATA[<img onclick="\$reconfig.test()" src="img/test.png"><img onclick="\$reconfig.wiz()" src="img/wizard.png">]]></append></html>
   <in><column>hometext</column></in><out>true</out>
  </item>
  <item>
   <type>textarea</type><name>bodytext</name><label>testo esteso</label><encode>true</encode>
   <html><prepend><![CDATA[</li><li>]]></prepend></html>
   <in><column>bodytext</column></in><out>true</out>
  </item>
  <item>
   <type>textarea</type><name>notes</name><label>note</label><encode>true</encode>
   <html><prepend><![CDATA[</li><li>]]></prepend></html>
   <in><column>notes</column></in><out>true</out>
  </item>
  <item>
   <type>radio</type><name>ihome</name><label>pubblica</label><selbycode>true</selbycode>
   <attrs><class>chkbox</class></attrs>
   <html><prepend><![CDATA[</li><li>]]></prepend></html>
   <in><column>ihome</column><target>value</target></in>
   <out>true</out>
  </item>
  <item>
   <type>input</type><name>time</name><label>time</label>
   <html><prepend><![CDATA[</li><li>]]></prepend><append><![CDATA[<br /><br />]]></append></html>
   <in><column>time</column></in><out>true</out>
  </item>
  <item>
   <type>input</type><name>expire</name><label>scadenza</label>
   <html><prepend><![CDATA[</li><li>]]></prepend><append><![CDATA[<br /><br />]]></append></html>
   <in><column>expire</column></in><out>true</out>
  </item>
  <item>
   <type>button</type><name>update</name><value>update</value>
   <html><prepend><![CDATA[<br /><br /></li><li class="btns">]]></prepend></html>
   <attrs><class>btn</class></attrs>
   <event><onclick><![CDATA['\$reconfig.save("article.php","save");']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item>
   <type>button</type><name>insert</name><value>insert</value>
   <attrs><class>btn</class></attrs>
   <event><onclick><![CDATA['\$reconfig.save("article.php","insert");']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
  <item>
   <type>button</type><name>remove</name><value>remove</value>
   <html><append><![CDATA[</li></ul>]]></append></html>
   <attrs><class>btn</class></attrs>
   <event><onclick><![CDATA['\$reconfig.save("article.php","delete");']]></onclick></event>
   <in>false</in><out>false</out>
  </item>
 </building>
 <artlist>
  <source>
   <in>
    <type>sql</type>
    <driver>{$cname('__DRIVER__')}</driver><dbhost>{$cname('__HOST__')}</dbhost><dbname>{$cname('__DBNAME__')}</dbname><dbuser>{$cname('__USER__')}</dbuser><dbpass>{$cname('__PASS__')}</dbpass><query>SELECT * FROM fake_stories ORDER BY 1 DESC</query>
   </in>
  </source>
 </artlist>
 <argomento>
  <source>
   <in>
    <type>sql</type>
    <driver>{$cname('__DRIVER__')}</driver><dbhost>{$cname('__HOST__')}</dbhost><dbname>{$cname('__DBNAME__')}</dbname><dbuser>{$cname('__USER__')}</dbuser><dbpass>{$cname('__PASS__')}</dbpass><query>SELECT topicid,topicname FROM fake_topics</query>
   </in>
  </source>
 </argomento>
 <categoria>
  <source>
   <in>
    <type>sql</type>
    <driver>{$cname('__DRIVER__')}</driver><dbhost>{$cname('__HOST__')}</dbhost><dbname>{$cname('__DBNAME__')}</dbname><dbuser>{$cname('__USER__')}</dbuser><dbpass>{$cname('__PASS__')}</dbpass><query>SELECT catid,title FROM fake_stories_cat</query>
   </in>
  </source>
 </categoria>
</root>
EOF;


OPTIONS LIST:

[encode]
    values will be encoded/decoded with rawurlencode (php) / unescape (javascript) for input and
    escape (javascript) / rawurlencode (php) for output
[name]
    the name of the html element
[label]
    the label of the html element
[type]
    the html element type: 
        predefined: function, eval, radio, checkbox, select, img, button, textarea, input, none
        others (div, a,..) for example: 
            array('type'=>'a','name'=>'fascicolo','encode'=>true,
                'html'=>array('prepend'=>'<li>','append'=>'</li>'),
                .....
        with 'none' the element is not displayed automatically, use javascript code.

[depth] define the depth of regexp result values for input and output. it can be overridden by
    [in][depth] and [out][depth].
    0 => 'string',  1 => monodimensional array, 2 => bidimensional array
[in] array / false (no input data)
    [type] sql/file
    [rstype] num / assoc / both
             (SQL only) retrieve sql data from _fetch_array as numeric array, associative array or
             both, so you can set 'column' with a numeric index or field name. Pay attention with
             this option you have output need, 'out''column' must be a string (field name)
    [group] with this field you can associate the item with another group
    [driver] [dbhost] [dbname] [dbuser] [dbpass] db connection data
        [query] the input query
        [column] 
            'not set' -> the corresponding group result data (REConfig::sources[group]['data'] for
                         example REConfig::sources['building']['data']) will be set as sql_fetch_array
                         for one record
                         'field1'=>'value'
                         'field2'=>'value'
                         for more than one record will be set like 'true'
            'true'    -> (SQL only) 
                         sources[group]['data'] will be an array (even for just one record):
                         'field1'=>array('value1','value2',....)
                         'field2'=>array('value1','value2',....)
                         ....
            'somefield' -> sources[group]['data'] will be an array:
                         'somefield'=>'value'
                         the (target) value will be the set with the corresponding item
            "array('field1'=>'field2')"  or  "array('field1'=>array('field2','field2'))"
                         retrieve 2 or more fields value as associative array (for SQL use 
                         'rstype' with 'assoc' or 'both' value)
            number    -> retrieve the 'number' element of array result (for SQL use 'rstype' with
                         'num' or 'both' value)
    [func] you can put php code that will be `eval`d after file/sql input and before 'regexp'd.
    [path] if type = 'file' this is the input file pathname (ie. '/some/dir/file.txt' or
           'http://site.com/file')
    [regexp] single or multiple array
        [key] if set to 'true' the first field captured will be the index of array result
        [func] default function for regexp id 'preg_match_all', setting this option with 'split'
               will be used 'preg_split' for this regexp
        [pattern] the regexp/split pattern
                  with 'key' unset insert 1 capturing parenthesis, with 'key' set to 'number' insert 
                  2 capturing parenthesis, where first captured value sets array key, second
                  its value
    [depth] the result input array depth. if there is regexp option normally is unnecessary, or
            set it to regexp array sizeof
    [target] by default the input data result is [values].
             with this option you can set another field
    [encode] input values will be encoded
    [utf8_decode] apply php 'utf8_decode' function to input values
    [lowercase] set to 'true' input values will be set to lowercase
    [uppercase] set to 'true' input values will be set to uppercase

[out] -> could be single or multiple arrays for multiple sql/file output / false (no output setup)
    [type] sql/file
    [group] with this field you can associate the item with another group
    [driver] [dbhost] [dbname] [dbuser] [dbpass] db connection data
        [query] the setup query
        [column] like [in][column] exept for 'number' value for SQL output, it must be alfanum value
    [func] you can put php code that will be `eval`d before file/sql output and before 'regexp'd
    [path] if type = 'file' this is the output file pathname (ie. '/some/dir/file.txt')
           'http://site.com/file')
    [regexp] single or multiple array. the array will be applied to output data in reverse mode
        [key] if set to 'true' the first field captured will be the index of array result
        [sep] the data separator rebuilding output value (ie. ',')
        [pattern] the regexp pattern.
                  with 'key' unset insert 3 capturing parenthesis, first from data begin to first
                  field captured, third from field captured to data end.
                  with 'key' set to number insert 5 capturing parenthesis, first from data begin
                  to first field captured, third from from first field captured to second field
                  captured, fifth from this to data end.
                  (be very very careful with 'U' (unaggressive) flag with out regexp)
    [depth] normally calculated automatically. Used for set saving array the same depth of output
            regexp sizeof
    [target] by default the output data for writing is [value] with data.
             with this option you can set another field (ie. [values])
[values]    normally used for input. for example could be an array of values to fill a 'select'
            element.
[value]     normally used for output. it can be string or array (for example 'select' multiple)
[display]   used with 'select' html elements. set to '0' display result value index as option,
            set to '1' display result values elements as options.
[selbycode] used with 'radio','checkbox' and 'select' html elements.
            if 'true' set 'selected' option with index,
            if 'null'/'false' set 'selected' option with value
[lowercase] not set do nothing
            set to 'false' check value in lowercase mode (index and description), leaving result
            values untouched.
            set to 'true' check value in lowercase mode (index and description), changing result
            values to lowercase.
[uppercase] not set do nothing
            set to 'false' check value in uppercase mode (index and description), leaving result
            values untouched.
            set to 'true' check value in uppercase mode (index and description), changing result
            values to uppercase.
[code]      html/javascript code used with 'html' type, javascript only for 'function'/'eval' type
[parms]     parameters passed to 'function' code

RUNNING OPTIONS

[action]    'login' build authentication form for user/password request and run 'exec' if success.
                    authentication can be 
            'exec'  POST 'controller' php script
            'build' build html elements
            'fill'  set html element values 
            'get_data' retrieve all html elements value, normally before 'save'
            'save'  POST 'controller' php script running setup code for output data
[items]     choose which configuration group process. if unset will be set by jquery plugin query
[controller] php script to be excecuted
[auth_driver] [auth_host] [auth_user] [auth_pass]
            for authentication
[json_data] object containing data for 'save' action
[do_before_login] [do_before_exec] [do_after_exec] [do_before_build] [do_after_build]
[do_before_save]  [do_after-save]
            javascript code excecuted at that specific point
[lang]      language code: 'en' 'it' ...
[language]  language object, for example:
                language={'it':{'display':'visualizza','update':'aggiorna',..}};
[all_data]  used for saving data. if not set will be sent to 'setup' only changed values, if 'true'
            there is not change control