WordPress.org

Plugin Directory

Changeset 609729


Ignore:
Timestamp:
10/08/12 19:16:17 (18 months ago)
Author:
eskapism
Message:

version 1

Location:
simple-fields/trunk
Files:
9 added
7 edited

Legend:

Unmodified
Added
Removed
  • simple-fields/trunk/datepicker/datePicker.css

    r403651 r609729  
    44    border: 1px solid #000; 
    55    background: #aaa; 
    6     border-collapse: separate; 
    7     border-spacing: 2px; 
     6    border-collapse: separate; 
     7    border-spacing: 2px; 
     8    width: 100%; 
    89} 
    910table.jCalendar th { 
     
    5960 
    6061/* NOTE - you will probably want to style a.dp-choose-date - see how I did it in demo.css */ 
    61  
     62a.dp-choose-date{ 
     63    margin-left: 5px; 
     64} 
    6265div.dp-popup { 
    6366    position: relative; 
  • simple-fields/trunk/datepicker/jquery.datePicker.js

    r403651 r609729  
    44 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. 
    55 * . 
    6  * $Id: jquery.datePicker.js 103 2010-09-22 08:54:28Z kelvin.luck $ 
     6 * $Id: jquery.datePicker.js 108 2011-11-17 21:19:57Z kelvin.luck@gmail.com $ 
    77 **/ 
    88 
     
    220220                     
    221221                    if (!this._dpId) { 
    222                         this._dpId = $.event.guid++; 
     222                        this._dpId = $.guid++; 
    223223                        $.event._dpCache[this._dpId] = new DatePicker(this); 
    224224                        alreadyExists = false; 
     
    800800                    }; 
    801801                    cssRules = { 
    802                         'top'   :   eleOffset.top + c.verticalOffset, 
     802                        'top'   :   eleOffset.top + c.verticalOffset - 20, 
    803803                        'left'  :   eleOffset.left + c.horizontalOffset 
    804804                    }; 
     
    950950                            c.setSelected(d, !$this.is('.selected') || !c.selectMultiple, false, true); 
    951951                            if (c.closeOnSelect) { 
    952                                 // Focus the next input in the form 
     952                                // Focus the next input in the form… 
    953953                                if (c.settings.autoFocusNextInput) { 
    954954                                    var ele = c.ele; 
     
    11721172    }; 
    11731173    // version 
    1174     $.dpVersion = '$Id: jquery.datePicker.js 103 2010-09-22 08:54:28Z kelvin.luck $'; 
     1174    $.dpVersion = '$Id: jquery.datePicker.js 108 2011-11-17 21:19:57Z kelvin.luck@gmail.com $'; 
    11751175 
    11761176    $.fn.datePicker.defaults = { 
  • simple-fields/trunk/jscolor/jscolor.js

    r403651 r609729  
    22 * jscolor, JavaScript Color Picker 
    33 * 
    4  * @version 1.3.5 
     4 * @version 1.4.0 
    55 * @license GNU Lesser General Public License, http://www.gnu.org/copyleft/lesser.html 
    66 * @author  Jan Odvarko, http://odvarko.cz 
    77 * @created 2008-06-15 
    8  * @updated 2011-06-21 
     8 * @updated 2012-07-06 
    99 * @link    http://jscolor.com 
    1010 */ 
     
    7676                if(m[3]) { 
    7777                    try { 
    78                         eval('prop='+m[3]); 
     78                        prop = (new Function ('return (' + m[3] + ')'))(); 
    7979                    } catch(eInvalidProp) {} 
    8080                } 
     
    137137            return; 
    138138        } 
    139         if(document.createEventObject) { 
    140             var ev = document.createEventObject(); 
    141             el.fireEvent('on'+evnt, ev); 
    142         } else if(document.createEvent) { 
     139        if(document.createEvent) { 
    143140            var ev = document.createEvent('HTMLEvents'); 
    144141            ev.initEvent(evnt, true, true); 
    145142            el.dispatchEvent(ev); 
     143        } else if(document.createEventObject) { 
     144            var ev = document.createEventObject(); 
     145            el.fireEvent('on'+evnt, ev); 
    146146        } else if(el['on'+evnt]) { // alternatively use the traditional event model (IE5) 
    147147            el['on'+evnt](); 
     
    175175        var x = 0, y = 0; 
    176176        if (!e) { e = window.event; } 
    177         if (typeof e.layerX === "number") { 
     177        if (typeof e.offsetX === 'number') { 
     178            x = e.offsetX; 
     179            y = e.offsetY; 
     180        } else if (typeof e.layerX === 'number') { 
    178181            x = e.layerX; 
    179182            y = e.layerY; 
    180         } else if (typeof e.offsetX === "number") { 
    181             x = e.offsetX; 
    182             y = e.offsetY; 
    183183        } 
    184184        return { x: x, y: y }; 
     
    262262                    t.query = r.query; 
    263263                } else { 
    264                     if(r.path === '') { // TODO: == or === ? 
     264                    if(r.path === '') { 
    265265                        t.path = base.path; 
    266266                        if(r.query !== null) { 
     
    273273                            t.path = removeDotSegments(r.path); 
    274274                        } else { 
    275                             if(base.authority !== null && base.path === '') { // TODO: == or === ? 
     275                            if(base.authority !== null && base.path === '') { 
    276276                                t.path = '/'+r.path; 
    277277                            } else { 
     
    334334        this.valueElement = target; // value holder 
    335335        this.styleElement = target; // where to reflect current color 
     336        this.onImmediateChange = null; // onchange callback (can be either string or function) 
    336337        this.hsv = [0, 0, 1]; // read-only  0-6, 0-1, 0-1 
    337338        this.rgb = [1, 1, 1]; // read-only  0-1, 0-1, 0-1 
     339        this.minH = 0; // read-only  0-6 
     340        this.maxH = 6; // read-only  0-6 
     341        this.minS = 0; // read-only  0-1 
     342        this.maxS = 1; // read-only  0-1 
     343        this.minV = 0; // read-only  0-1 
     344        this.maxV = 1; // read-only  0-1 
    338345 
    339346        this.pickerOnfocus = true; // display picker on focus? 
    340347        this.pickerMode = 'HSV'; // HSV | HVS 
    341348        this.pickerPosition = 'bottom'; // left | right | top | bottom 
     349        this.pickerSmartPosition = true; // automatically adjust picker position when necessary 
     350        this.pickerButtonHeight = 20; // px 
     351        this.pickerClosable = false; 
     352        this.pickerCloseText = 'Close'; 
     353        this.pickerButtonColor = 'ButtonText'; // px 
    342354        this.pickerFace = 10; // px 
    343355        this.pickerFaceColor = 'ThreeDFace'; // CSS color 
     
    369381                var vp = jscolor.getViewPos(); // view pos 
    370382                var vs = jscolor.getViewSize(); // view size 
    371                 var ps = [ // picker size 
    372                     2*this.pickerBorder + 2*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[0] + (this.slider ? 2*this.pickerInset + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] : 0), 
    373                     2*this.pickerBorder + 2*this.pickerInset + 2*this.pickerFace + jscolor.images.pad[1] 
    374                 ]; 
     383                var ps = getPickerDims(this); // picker size 
    375384                var a, b, c; 
    376385                switch(this.pickerPosition.toLowerCase()) { 
     
    381390                } 
    382391                var l = (ts[b]+ps[b])/2; 
    383                 var pp = [ // picker pos 
    384                     -vp[a]+tp[a]+ps[a] > vs[a] ? 
    385                         (-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) : 
     392 
     393                // picker pos 
     394                if (!this.pickerSmartPosition) { 
     395                    var pp = [ 
    386396                        tp[a], 
    387                     -vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ? 
    388                         (-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) : 
    389                         (tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c) 
    390                 ]; 
     397                        tp[b]+ts[b]-l+l*c 
     398                    ]; 
     399                } else { 
     400                    var pp = [ 
     401                        -vp[a]+tp[a]+ps[a] > vs[a] ? 
     402                            (-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) : 
     403                            tp[a], 
     404                        -vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ? 
     405                            (-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) : 
     406                            (tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c) 
     407                    ]; 
     408                } 
    391409                drawPicker(pp[a], pp[b]); 
    392410            } 
     
    400418                if(!this.adjust) { 
    401419                    if(!this.fromString(valueElement.value, leaveValue)) { 
     420                        styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage; 
    402421                        styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; 
    403422                        styleElement.style.color = styleElement.jscStyle.color; 
     
    406425                } else if(!this.required && /^\s*$/.test(valueElement.value)) { 
    407426                    valueElement.value = ''; 
     427                    styleElement.style.backgroundImage = styleElement.jscStyle.backgroundImage; 
    408428                    styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor; 
    409429                    styleElement.style.color = styleElement.jscStyle.color; 
     
    427447            } 
    428448            if(!(flags & leaveStyle) && styleElement) { 
     449                styleElement.style.backgroundImage = "none"; 
    429450                styleElement.style.backgroundColor = 
    430451                    '#'+this.toString(); 
     
    445466 
    446467        this.fromHSV = function(h, s, v, flags) { // null = don't change 
    447             h<0 && (h=0) || h>6 && (h=6); 
    448             s<0 && (s=0) || s>1 && (s=1); 
    449             v<0 && (v=0) || v>1 && (v=1); 
     468            if(h !== null) { h = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, h)); } 
     469            if(s !== null) { s = Math.max(0.0, this.minS, Math.min(1.0, this.maxS, s)); } 
     470            if(v !== null) { v = Math.max(0.0, this.minV, Math.min(1.0, this.maxV, v)); } 
     471 
    450472            this.rgb = HSV_RGB( 
    451473                h===null ? this.hsv[0] : (this.hsv[0]=h), 
     
    453475                v===null ? this.hsv[2] : (this.hsv[2]=v) 
    454476            ); 
     477 
    455478            this.exportColor(flags); 
    456479        }; 
     
    458481 
    459482        this.fromRGB = function(r, g, b, flags) { // null = don't change 
    460             r<0 && (r=0) || r>1 && (r=1); 
    461             g<0 && (g=0) || g>1 && (g=1); 
    462             b<0 && (b=0) || b>1 && (b=1); 
     483            if(r !== null) { r = Math.max(0.0, Math.min(1.0, r)); } 
     484            if(g !== null) { g = Math.max(0.0, Math.min(1.0, g)); } 
     485            if(b !== null) { b = Math.max(0.0, Math.min(1.0, b)); } 
     486 
    463487            var hsv = RGB_HSV( 
    464                 r===null ? this.rgb[0] : (this.rgb[0]=r), 
    465                 g===null ? this.rgb[1] : (this.rgb[1]=g), 
    466                 b===null ? this.rgb[2] : (this.rgb[2]=b) 
     488                r===null ? this.rgb[0] : r, 
     489                g===null ? this.rgb[1] : g, 
     490                b===null ? this.rgb[2] : b 
    467491            ); 
    468492            if(hsv[0] !== null) { 
    469                 this.hsv[0] = hsv[0]; 
     493                this.hsv[0] = Math.max(0.0, this.minH, Math.min(6.0, this.maxH, hsv[0])); 
    470494            } 
    471495            if(hsv[2] !== 0) { 
    472                 this.hsv[1] = hsv[1]; 
    473             } 
    474             this.hsv[2] = hsv[2]; 
     496                this.hsv[1] = hsv[1]===null ? null : Math.max(0.0, this.minS, Math.min(1.0, this.maxS, hsv[1])); 
     497            } 
     498            this.hsv[2] = hsv[2]===null ? null : Math.max(0.0, this.minV, Math.min(1.0, this.maxV, hsv[2])); 
     499 
     500            // update RGB according to final HSV, as some values might be trimmed 
     501            var rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]); 
     502            this.rgb[0] = rgb[0]; 
     503            this.rgb[1] = rgb[1]; 
     504            this.rgb[2] = rgb[2]; 
     505 
    475506            this.exportColor(flags); 
    476507        }; 
     
    555586                    sld : document.createElement('div'), 
    556587                    sldB : document.createElement('div'), 
    557                     sldM : document.createElement('div') 
     588                    sldM : document.createElement('div'), 
     589                    btn : document.createElement('div'), 
     590                    btnS : document.createElement('span'), 
     591                    btnT : document.createTextNode(THIS.pickerCloseText) 
    558592                }; 
    559593                for(var i=0,segSize=4; i<jscolor.images.sld[1]; i+=segSize) { 
     
    570604                jscolor.picker.box.appendChild(jscolor.picker.padB); 
    571605                jscolor.picker.box.appendChild(jscolor.picker.padM); 
     606                jscolor.picker.btnS.appendChild(jscolor.picker.btnT); 
     607                jscolor.picker.btn.appendChild(jscolor.picker.btnS); 
     608                jscolor.picker.box.appendChild(jscolor.picker.btn); 
    572609                jscolor.picker.boxB.appendChild(jscolor.picker.box); 
    573610            } 
     
    588625                        window.getSelection().removeAllRanges(); 
    589626                    } 
     627                    dispatchImmediateChange(); 
    590628                } 
    591629            }; 
    592630            p.padM.onmouseup = 
    593631            p.padM.onmouseout = function() { if(holdPad) { holdPad=false; jscolor.fireEvent(valueElement,'change'); } }; 
    594             p.padM.onmousedown = function(e) { holdPad=true; setPad(e); }; 
     632            p.padM.onmousedown = function(e) { 
     633                // if the slider is at the bottom, move it up 
     634                switch(modeID) { 
     635                    case 0: if (THIS.hsv[2] === 0) { THIS.fromHSV(null, null, 1.0); }; break; 
     636                    case 1: if (THIS.hsv[1] === 0) { THIS.fromHSV(null, 1.0, null); }; break; 
     637                } 
     638                holdPad=true; 
     639                setPad(e); 
     640                dispatchImmediateChange(); 
     641            }; 
    595642            p.sldM.onmouseup = 
    596643            p.sldM.onmouseout = function() { if(holdSld) { holdSld=false; jscolor.fireEvent(valueElement,'change'); } }; 
    597             p.sldM.onmousedown = function(e) { holdSld=true; setSld(e); }; 
     644            p.sldM.onmousedown = function(e) { 
     645                holdSld=true; 
     646                setSld(e); 
     647                dispatchImmediateChange(); 
     648            }; 
    598649 
    599650            // picker 
    600             p.box.style.width = (2*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[0] + (THIS.slider ? 2*THIS.pickerInset + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] : 0)) + 'px'; 
    601             p.box.style.height = (2*THIS.pickerInset + 2*THIS.pickerFace + jscolor.images.pad[1]) + 'px'; 
     651            var dims = getPickerDims(THIS); 
     652            p.box.style.width = dims[0] + 'px'; 
     653            p.box.style.height = dims[1] + 'px'; 
    602654 
    603655            // picker border 
     
    636688 
    637689            // slider border 
    638             p.sldB.style.display = THIS.slider ? "block" : "none"; 
     690            p.sldB.style.display = THIS.slider ? 'block' : 'none'; 
    639691            p.sldB.style.position = 'absolute'; 
    640692            p.sldB.style.right = THIS.pickerFace+'px'; 
     
    644696 
    645697            // slider mouse area 
    646             p.sldM.style.display = THIS.slider ? "block" : "none"; 
     698            p.sldM.style.display = THIS.slider ? 'block' : 'none'; 
    647699            p.sldM.style.position = 'absolute'; 
    648700            p.sldM.style.right = '0'; 
     
    656708            } 
    657709 
     710            // "close" button 
     711            function setBtnBorder() { 
     712                var insetColors = THIS.pickerInsetColor.split(/\s+/); 
     713                var pickerOutsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1]; 
     714                p.btn.style.borderColor = pickerOutsetColor; 
     715            } 
     716            p.btn.style.display = THIS.pickerClosable ? 'block' : 'none'; 
     717            p.btn.style.position = 'absolute'; 
     718            p.btn.style.left = THIS.pickerFace + 'px'; 
     719            p.btn.style.bottom = THIS.pickerFace + 'px'; 
     720            p.btn.style.padding = '0 15px'; 
     721            p.btn.style.height = '18px'; 
     722            p.btn.style.border = THIS.pickerInset + 'px solid'; 
     723            setBtnBorder(); 
     724            p.btn.style.color = THIS.pickerButtonColor; 
     725            p.btn.style.font = '12px sans-serif'; 
     726            p.btn.style.textAlign = 'center'; 
     727            try { 
     728                p.btn.style.cursor = 'pointer'; 
     729            } catch(eOldIE) { 
     730                p.btn.style.cursor = 'hand'; 
     731            } 
     732            p.btn.onmousedown = function () { 
     733                THIS.hidePicker(); 
     734            }; 
     735            p.btnS.style.lineHeight = p.btn.style.height; 
     736 
    658737            // load images in optimal order 
    659738            switch(modeID) { 
     
    661740                case 1: var padImg = 'hv.png'; break; 
    662741            } 
    663             p.padM.style.background = "url('"+jscolor.getDir()+"cross.gif') no-repeat"; 
    664             p.sldM.style.background = "url('"+jscolor.getDir()+"arrow.gif') no-repeat"; 
    665             p.pad.style.background = "url('"+jscolor.getDir()+padImg+"') 0 0 no-repeat"; 
     742            p.padM.style.backgroundImage = "url('"+jscolor.getDir()+"cross.gif')"; 
     743            p.padM.style.backgroundRepeat = "no-repeat"; 
     744            p.sldM.style.backgroundImage = "url('"+jscolor.getDir()+"arrow.gif')"; 
     745            p.sldM.style.backgroundRepeat = "no-repeat"; 
     746            p.pad.style.backgroundImage = "url('"+jscolor.getDir()+padImg+"')"; 
     747            p.pad.style.backgroundRepeat = "no-repeat"; 
     748            p.pad.style.backgroundPosition = "0 0"; 
    666749 
    667750            // place pointers 
     
    671754            jscolor.picker.owner = THIS; 
    672755            document.getElementsByTagName('body')[0].appendChild(p.boxB); 
     756        } 
     757 
     758 
     759        function getPickerDims(o) { 
     760            var dims = [ 
     761                2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[0] + 
     762                    (o.slider ? 2*o.pickerInset + 2*jscolor.images.arrow[0] + jscolor.images.sld[0] : 0), 
     763                o.pickerClosable ? 
     764                    4*o.pickerInset + 3*o.pickerFace + jscolor.images.pad[1] + o.pickerButtonHeight : 
     765                    2*o.pickerInset + 2*o.pickerFace + jscolor.images.pad[1] 
     766            ]; 
     767            return dims; 
    673768        } 
    674769 
     
    781876 
    782877 
     878        function dispatchImmediateChange() { 
     879            if (THIS.onImmediateChange) { 
     880                var callback; 
     881                if (typeof THIS.onImmediateChange === 'string') { 
     882                    callback = new Function (THIS.onImmediateChange); 
     883                } else { 
     884                    callback = THIS.onImmediateChange; 
     885                } 
     886                callback.call(THIS); 
     887            } 
     888        } 
     889 
     890 
    783891        var THIS = this; 
    784892        var modeID = this.pickerMode.toLowerCase()==='hvs' ? 1 : 0; 
     
    812920            var updateField = function() { 
    813921                THIS.fromString(valueElement.value, leaveValue); 
     922                dispatchImmediateChange(); 
    814923            }; 
    815924            jscolor.addEvent(valueElement, 'keyup', updateField); 
     
    822931        if(styleElement) { 
    823932            styleElement.jscStyle = { 
     933                backgroundImage : styleElement.style.backgroundImage, 
    824934                backgroundColor : styleElement.style.backgroundColor, 
    825935                color : styleElement.style.color 
  • simple-fields/trunk/readme.txt

    r517385 r609729  
    1 === Plugin Name === 
    2  
    3 Contributors: eskapism, MarsApril, samface, angrycreative 
    4  
     1=== Simple Fields === 
     2Contributors: eskapism, MarsApril, samface, angrycreative, earth people 
    53Donate link: http://eskapism.se/sida/donate/ 
    6  
    74Tags: admin, fields, custom fields, field manager, attachments, text areas, input fields, tinymce, radio button, drop down, files, meta box, edit, post, post_meta, post meta, custom 
    8  
    95Requires at least: 3.3.1 
    10  
    11 Tested up to: 3.3.1 
    12  
    13 Stable tag: 0.5 
    14  
    15 Add different kind of input fields to your edit post page. Field can be of type textarea, TinyMCE, checkbox, radio buttons, drop downs or files. 
     6Tested up to: 3.4.2 
     7Stable tag: 1.0 
     8 
     9Add more advanced custom fields types to your edit post page. Field can be of several types, including textarea, checkbox, radio buttons, files and color picker. 
    1610 
    1711== Description == 
     
    3832http://eskapism.se/code-playground/simple-fields/tutorial/ 
    3933 
    40 #### Beta? You bet! 
    41  
    42 Please note that this plugin still is in a very early version. Please try it out but be aware of bugs.  
    43 Also, please remember to backup your database, just to be sure if anything goes wrong. 
    44 For bugreports, feature request and so on, please contact me at par.thernstrom@gmail.com or through twitter 
    45 http://twitter.com/eskapism/. 
     34#### Upgrading? Then backup your database 
     35 
     36Please remember to backup your database when you upgrade this plugin. Everything should work fine, but just to be sure and safe: backup the database! 
    4637 
    4738#### Help and Support 
    48 If you have questions/bug reports/feature requests for Simple Fields please use the WordPress [Support Forum](http://wordpress.org/tags/simple-fields?forum_id=10). 
     39 
     40If you have questions/bug reports/feature requests for Simple Fields please use the WordPress [Support Forum](http://wordpress.org/tags/simple-fields?forum_id=10) or  
     41[the new GitHub project page for Simple Fields](github.com/bonny/WordPress-Simple-Fields/). 
    4942There are also [tutorials available for Simple Fields](http://eskapism.se/code-playground/simple-fields/). 
    5043 
    5144#### Donation and more plugins 
    5245* If you like this plugin don't forget to [donate to support further development](http://eskapism.se/sida/donate/). 
    53 * Check out some [more plugins](http://wordpress.org/extend/plugins/profile/eskapism) by the same author. 
     46* Also check out some [more CMS-focused plugins](http://wordpress.org/extend/plugins/profile/eskapism) by the same author. 
    5447 
    5548 
     
    6558 
    6659 
     60== Example usage: Define your simple fields in your theme == 
     61 
     62Simple fields now supports registering field groups and fields with php code. For example, try this in your functions.php: 
     63 
     64--- 8< --- 
     65 
     66simple_fields_register_field_group('test', 
     67                array ( 
     68                    'name' => 'Test field group', 
     69                    'description' => "Test field description", 
     70                    'repeatable' => 1, 
     71                    'fields' => array( 
     72                                    array('name' => 'Test text', 
     73                                          'description' => 'Text description', 
     74                                          'type' => 'text' 
     75                                    ), 
     76                                    array('name' => 'Test textarea', 
     77                                          'description' => 'Textarea description', 
     78                                          'type' => 'textarea', 
     79                                          'type_textarea_options' => array('use_html_editor' => 1) 
     80                                    ), 
     81                                    array('name' => 'Test checkbox', 
     82                                          'description' => 'Checkbox description', 
     83                                          'type' => 'checkbox', 
     84                                          'type_checkbox_options' => array('checked_by_default' => 1) 
     85                                    ), 
     86                                    array('name' => 'Test radiobutton', 
     87                                          'description' => 'Radiobutton description', 
     88                                          'type' => 'radiobutton', 
     89                                          'type_radiobutton_options' => array(array("value" => "Yes"), 
     90                                                                              array("value" => "No") 
     91                                                                        ) 
     92                                    ), 
     93                                    array('name' => 'Test dropdown', 
     94                                          'description' => 'Dropdown description', 
     95                                          'type' => 'dropdown', 
     96                                          'type_dropdown_options' => array(array("value" => "Yes"), 
     97                                                                           array("value" => "No") 
     98                                                                     ) 
     99                                    ), 
     100                                    array('name' => 'Test file', 
     101                                          'description' => 'File description', 
     102                                          'type' => 'file' 
     103                                    ), 
     104                                    array('name' => 'Test post', 
     105                                          'description' => 'Post description', 
     106                                          'type' => 'post', 
     107                                          'type_post_options' => array("enabled_post_types" => array("post")) 
     108                                    ), 
     109                                    array('name' => 'Test taxonomy', 
     110                                          'description' => 'Taxonomy description', 
     111                                          'type' => 'taxonomy', 
     112                                          'type_taxonomy_options' => array("enabled_taxonomies" => array("category")) 
     113                                    ), 
     114                                    array('name' => 'Test taxonomy term', 
     115                                          'description' => 'Taxonomy term description', 
     116                                          'type' => 'taxonomyterm', 
     117                                          'type_taxonomyterm_options' => array("enabled_taxonomy" => "category") 
     118                                    ), 
     119                                    array('name' => 'Test color selector', 
     120                                          'description' => 'Color selector description', 
     121                                          'type' => 'color' 
     122                                    ), 
     123                                    array('name' => 'Test date selector', 
     124                                          'description' => 'Date selector description', 
     125                                          'type' => 'date', 
     126                                          'type_date_options' => array('use_time' => 1) 
     127                                    ), 
     128                                    array('name' => 'Test user selector', 
     129                                          'description' => 'User selector description', 
     130                                          'type' => 'user' 
     131                                    ) 
     132                                ) 
     133                ) 
     134); 
     135 
     136simple_fields_register_post_connector('test_connector', 
     137                array ( 
     138                    'name' => "A test connector", 
     139                    'field_groups' => array( 
     140                                            array('name' => 'Test fields', 
     141                                                  'key' => 'test', 
     142                                                  'context' => 'normal', 
     143                                                  'priority' => 'high') 
     144                                      ), 
     145                    'post_types' => array('post') 
     146                ) 
     147); 
     148 
     149simple_fields_register_post_type_default('test_connector', 'post'); 
     150 
     151--- >8 --- 
     152 
     153 
    67154== Screenshots == 
    68155 
     
    77164 
    78165== Changelog == 
     166 
     167#### Version 1.0 
     168- Note: This is a pretty big update, so please backup your databases before installation! 
     169- Added: Support for adding Custom Field Types/Field Type extensions. Makes Simple Fields Endless Extendable! :) 
     170- Added: New functions for registering field groups and fields in php, see example usage. 
     171- Added: New better/easier functions for getting the saved values for a post: simple_fields_value() and simple_fields_values() 
     172- Added: Field slugs and field group slugs. Now you can use the slug instead of the id to get the values. 
     173- Added: Added CSS classes to field groups in admin area, so developers can style things there. 
     174- Added: Actions and filter so developers can modify parts of Simple Fields behavior. 
     175- Added: Functions for getting the connector for the current post. See simple_fields_connector() and simple_fields_is_connector(). 
     176- Added: Function to set value, see simple_fields_set_value() 
     177- Added: German translation by Johann Heyne (http://johannheyne.de). Thanks a lot! 
     178- Fixed: Simple Fields is now mostly a class. 
     179- Fixed: Various bugfixes. 
    79180 
    80181#### 0.5 
  • simple-fields/trunk/scripts.js

    r517385 r609729  
    22jscolor.bindClass = "simple-fields-field-type-color"; 
    33var simple_fields_datepicker_args = { "clickInput": true }; 
    4 var simple_fields_tinymce_iframes = new Array; 
     4var simple_fields_tinymce_iframes = []; 
     5 
     6// Global module for Simple Fields, using the reveal module pattern 
     7var simple_fields = (function() { 
     8     
     9    var 
     10        i_am_simple_fields = true; 
     11     
     12    return { 
     13         
     14    }; 
     15     
     16})(); 
    517 
    618(function($) { 
     
    4052                    qtname = 'qt_'+id; 
    4153                    qttb = 'qt_'+id+'_toolbar'; 
    42                     if ( typeof(QTags) != undefined && iframe_el.canvas != undefined ) { 
     54                    if ( typeof(QTags) !== undefined && iframe_el.canvas !== undefined ) { 
    4355                        QTags.closeAllTags(iframe_el.id); 
    4456                    } 
     
    89101                dom.hide(qttb); 
    90102                dom.addClass(wrap_id, 'tmce-active'); 
    91                 dom.removeClass(wrap_id, 'html-active');     
     103                dom.removeClass(wrap_id, 'html-active'); 
    92104                } 
    93105            } 
     
    168180            $(this).closest("li").find(".hidden_deleted").attr("value", 1); 
    169181            $(this).closest("li").hide("slow"); 
     182            // Remove required attribute on slug so we can post the form even if slug is empty 
     183            $(this).closest("li").find("input[required]").removeAttr("required"); 
    170184        } else { 
    171185        } 
     
    258272     
    259273        $.post(ajaxurl, data, function(response) { 
    260             // alert('Got this from the server: ' + response); 
     274 
    261275            $ul = $wrapper.find("ul.simple-fields-metabox-field-group-fields"); 
    262276            $response = $(response); 
     
    264278            $ul.prepend($response); 
    265279            $response.slideDown("slow", function() { 
     280                 
    266281                simple_fields_metabox_tinymce_attach(); 
    267282                $response.effect("highlight", 1000); 
     
    270285                // add datepicker too 
    271286                $('input.simple-fields-field-type-date', $ul).datePicker(simple_fields_datepicker_args); 
     287                 
     288                // Fire event so plugins can listen to the add-button 
     289                //simple_fields.trigger("field_group_added"); 
     290                //simple_fields.dispatchEvent(); 
     291                $(document.body).trigger("field_group_added", $response); 
    272292            }); 
    273293            $t.html("<a href='#'>+ "+sfstrings.add+"</a>"); 
     
    361381    // popup a dialog where the user can choose  the post to attach 
    362382    $("a.simple-fields-metabox-field-post-select").live("click", function(e) { 
     383 
    363384        e.preventDefault(); 
    364385         
     
    375396            zIndex: 300000, 
    376397            open: function(event, ui) { 
    377                 //console.log("event", event); 
    378                 //console.log("ui", ui); 
    379                 //console.log("originLink", $(this).data("originLink")); 
    380398                var originLink = $($(this).data("originLink")); 
    381                 //console.log(enabled_post_types); 
    382                 //var select_type = $("div.simple-fields-meta-box-field-group-field-type-post-dialog-select-type"); 
    383399                arr_enabled_post_types = enabled_post_types.split(","); 
    384400                $(this).text("Loading...").load(ajaxurl, { 
     
    390406 
    391407    }); 
     408     
     409    /** 
     410     * Post type dialog: click on cancel link 
     411     * Close the dialog 
     412     */ 
    392413    $(".simple-fields-postdialog-link-cancel").live("click", function(e) { 
    393414        e.preventDefault(); 
     
    395416    }); 
    396417     
    397     // in dialog: click on post type 
     418    /** 
     419     * in dialog: click on post type = show posts of that type 
     420     */ 
    398421    $(".simple-fields-meta-box-field-group-field-type-post-dialog-post-types a").live("click", function(e) { 
    399422 
    400423        e.preventDefault(); 
     424 
    401425        var a = $(this); 
    402426        var dialog = $("div.simple-fields-meta-box-field-group-field-type-post-dialog"); 
     
    414438    }); 
    415439     
    416     // in dialog: click on post = update input in field group 
     440    /**  
     441     * in dialog: click on a post = update input in field group and then close dialog 
     442     */ 
    417443    $(".simple-fields-meta-box-field-group-field-type-post-dialog-post-posts a").live("click", function(e) { 
    418444         
     
    431457        div.find(".simple-fields-field-type-post-postName").show(); 
    432458 
    433          
    434459        dialog.dialog("close"); 
    435460         
    436461    }); 
    437462     
    438     // clear post id and name 
     463    /**  
     464     * Field type post: link clear = clear post id and name 
     465     */ 
    439466    $(".simple-fields-metabox-field-post-clear").live("click", function(e) { 
    440467        e.preventDefault(); 
     
    588615         
    589616        // type date 
    590         $('input.simple-fields-field-type-date').datePicker(simple_fields_datepicker_args); 
     617        $('input.simple-fields-field-type-date').datePicker(); 
     618     
     619         
     620     
    591621         
    592622    }); 
     
    630660    var a = link.href || link.alt; 
    631661    var g = link.rel || false; 
    632     // alert(t); // title 
    633     // alert(a); // http://localhost/wp-admin/media-upload.php?type=image&post_id=1060&TB_iframe=true 
    634     // alert(g); // false 
    635662    tb_show(t,a,g); 
    636663    link.blur(); 
  • simple-fields/trunk/simple_fields.php

    r517385 r609729  
    44Plugin URI: http://eskapism.se/code-playground/simple-fields/ 
    55Description: Add groups of textareas, input-fields, dropdowns, radiobuttons, checkboxes and files to your edit post screen. 
    6 Version: 0.5 
     6Version: 1.0 
    77Author: Pär Thernström 
    88Author URI: http://eskapism.se/ 
    99License: GPL2 
    10  
    1110*/ 
    1211 
     
    2726*/ 
    2827 
    29 // if called directly, load wordpress 
    30 /* 
    31 if (isset($_GET["wp_abspath"])) { 
    32     define( 'WP_USE_THEMES', false ); 
    33     require( $_GET["wp_abspath"] . './wp-blog-header.php' ); 
    34 } 
    35 */ 
    36  
    37 define( "EASY_FIELDS_URL", WP_PLUGIN_URL . '/simple-fields/'); 
    38 define( "EASY_FIELDS_NAME", "Simple Fields");  
    39 define( "EASY_FIELDS_VERSION", "0.4"); 
    40 #define( "EASY_FIELDS_FILE", "options-general.php?page=simple-fields-options"); // this still feels nasty... 
    41  
    42 load_plugin_textdomain( 'simple-fields', null, basename(dirname(__FILE__)).'/languages/'); 
    43  
    44 // on admin init: add styles and scripts 
    45 add_action( 'admin_init', 'simple_fields_admin_init' ); 
    46 add_action( 'admin_menu', "simple_fields_admin_menu" ); 
    47 add_action( 'admin_head', 'simple_fields_admin_head' ); 
    48  
    49 // ajax. that's right baby. 
    50 add_action('wp_ajax_simple_fields_field_group_add_field', 'simple_fields_field_group_add_field'); 
    51  
    52 function simple_fields_admin_init() { 
    53  
    54     wp_enqueue_script("jquery"); 
    55     wp_enqueue_script("jquery-ui-core"); 
    56     wp_enqueue_script("jquery-ui-sortable"); 
    57     wp_enqueue_script("jquery-effects-highlight"); 
    58     wp_enqueue_script("thickbox"); 
    59     wp_enqueue_style("thickbox"); 
    60     wp_enqueue_script("jscolor", EASY_FIELDS_URL . "jscolor/jscolor.js"); // color picker for type color 
    61     wp_enqueue_script("date", EASY_FIELDS_URL . "datepicker/date.js"); // date picker for type date 
    62     wp_enqueue_script("jquery-datepicker", EASY_FIELDS_URL . "datepicker/jquery.datePicker.js"); // date picker for type date 
    63     wp_enqueue_style('jquery-datepicker', EASY_FIELDS_URL.'datepicker/datePicker.css', false, EASY_FIELDS_VERSION); 
    64  
    65     // add css and scripts 
    66     wp_enqueue_style('simple-fields-styles', EASY_FIELDS_URL.'styles.css', false, EASY_FIELDS_VERSION); 
    67     wp_register_script('simple-fields-scripts', EASY_FIELDS_URL.'scripts.js', false, EASY_FIELDS_VERSION); 
    68     wp_localize_script('simple-fields-scripts', 'sfstrings', array( 
    69         'txtDelete' => __('Delete', 'simple-fields'), 
    70         'confirmDelete' => __('Delete this field?', 'simple-fields'), 
    71         'confirmDeleteGroup' => __('Delete this group?', 'simple-fields'), 
    72         'confirmDeleteConnector' => __('Delete this post connector?', 'simple-fields'), 
    73         'confirmDeleteRadio' => __('Delete radio button?', 'simple-fields'), 
    74         'confirmDeleteDropdown' => __('Delete dropdown value?', 'simple-fields'), 
    75         'adding' => __('Adding...', 'simple-fields'), 
    76         'add' => __('Add', 'simple-fields'), 
    77         'confirmRemoveGroupConnector' => __('Remove field group from post connector?', 'simple-fields'), 
    78         'confirmRemoveGroup' => __('Remove this field group?', 'simple-fields'), 
    79         'context' => __('Context', 'simple-fields'), 
    80         'normal' => __('normal'), 
    81         'advanced' => __('advanced'), 
    82         'side' => __('side'), 
    83         'low' => __('low'), 
    84         'high' => __('high'), 
    85     )); 
    86     wp_enqueue_script('simple-fields-scripts'); 
    87  
    88     define( "EASY_FIELDS_FILE", menu_page_url("simple-fields-options", false) ); 
    89  
    90 } 
    91  
    92 require("functions_admin.php"); 
    93 require("functions_post.php"); 
    94  
     28/** 
     29 * Class to keep all simple fields stuff together a bit better 
     30 */  
     31class simple_fields { 
     32 
     33    const DEBUG_ENABLED = false; // set to true to enable some debug output 
     34     
     35    public  
     36 
     37        // Looks something like this: "Simple-Fields-GIT/simple_fields.php" 
     38        $plugin_foldername_and_filename, 
     39     
     40        // array with registered field type objects 
     41        $registered_field_types 
     42     
     43    ; 
     44 
     45 
     46    /** 
     47     * Init is where we setup actions and filers and loads stuff and a little bit of this and that 
     48     * 
     49     */ 
     50    function init() { 
     51 
     52        define( "SIMPLE_FIELDS_URL", plugins_url(basename(dirname(__FILE__))). "/"); 
     53        define( "SIMPLE_FIELDS_NAME", "Simple Fields"); 
     54        define( "SIMPLE_FIELDS_VERSION", "1.0"); 
     55 
     56        load_plugin_textdomain( 'simple-fields', null, basename(dirname(__FILE__)).'/languages/'); 
     57         
     58        require( dirname(__FILE__) . "/functions.php" ); 
     59        require( dirname(__FILE__) . "/class_simple_fields_field.php" ); 
     60        require( dirname(__FILE__) . "/field_types/field_example.php" ); 
     61        require( dirname(__FILE__) . "/field_types/field_minimalistic_example.php" ); 
     62 
     63        $this->plugin_foldername_and_filename = basename(dirname(__FILE__)) . "/" . basename(__FILE__); 
     64        $this->registered_field_types = array(); 
     65 
     66        // Actions and filters 
     67        add_action( 'admin_init', array($this, 'admin_init') ); 
     68        add_action( 'admin_menu', array($this, "admin_menu") ); 
     69        add_action( 'admin_head', array($this, 'admin_head') ); 
     70        add_action( 'admin_head', array($this, 'admin_head_select_file') ); 
     71        add_filter( 'plugin_row_meta', array($this, 'set_plugin_row_meta'), 10, 2 ); 
     72        add_action( 'admin_footer', array($this, 'admin_footer') ); 
     73        add_action( 'admin_init', array($this,'post_admin_init') ); 
     74        add_action( 'dbx_post_sidebar', array($this, 'post_dbx_post_sidebar') ); 
     75        add_action( 'save_post', array($this, 'save_postdata') ); 
     76        add_action( 'plugins_loaded', array($this, 'plugins_loaded') ); 
     77        add_action( 'init', array($this, "maybe_add_debug_info") );  
     78 
     79        // Hacks for media select dialog 
     80        add_filter( 'media_send_to_editor', array($this, 'media_send_to_editor'), 15, 2 ); 
     81        add_filter( 'media_upload_tabs', array($this, 'media_upload_tabs'), 15 ); 
     82        add_filter( 'media_upload_form_url', array($this, 'media_upload_form_url') ); 
     83 
     84        // Ajax calls 
     85        add_action( 'wp_ajax_simple_fields_metabox_fieldgroup_add', array($this, 'metabox_fieldgroup_add') ); 
     86        add_action( 'wp_ajax_simple_fields_field_type_post_dialog_load', array($this, 'field_type_post_dialog_load') ); 
     87        add_action( 'wp_ajax_simple_fields_field_group_add_field', array($this, 'field_group_add_field') ); 
     88 
     89        // Boot up 
     90        do_action("simple_fields_init", $this); 
     91         
     92    } 
     93     
     94         
     95    /** 
     96     * When all plugins have loaded = simple fields has also loaded = safe to add custom field types 
     97     */ 
     98    function plugins_loaded() { 
     99        do_action("simple_fields_register_field_types"); 
     100    } 
     101 
     102    /** 
     103     * Gets the pattern that are allowed for slugs 
     104     * @return string 
     105     */ 
     106    function get_slug_pattern() { 
     107        return "[A-Za-z0-9_]+"; 
     108    } 
     109     
     110    /** 
     111     * Get the title for a slug 
     112     * I.e. the help text that the input field will show when the slug pattern is not matched 
     113     */ 
     114    function get_slug_title() { 
     115        return __("Allowed chars: a-z and underscore.", 'simple-fields'); 
     116    } 
     117     
     118    /** 
     119     * Returns a post connector 
     120     * @param int $connector_id 
     121     */ 
     122    function get_connector_by_id($connector_id) { 
     123 
     124        $connectors = $this->get_post_connectors(); 
     125        if (isset($connectors[$connector_id])) { 
     126            return $connectors[$connector_id]; 
     127        } else { 
     128            return FALSE; 
     129        } 
     130    } 
     131 
     132    /** 
     133     * If setting debug = true then output some debug stuff a little here and there 
     134     * Hopefully this saves us some var_dump/sf_d/echo all the time 
     135     * usage: 
     136     * first set DEBUG_ENABLED = true in beginning of class 
     137     * then: 
     138     * simple_fields("Saved post connector", array("description" => $value, "description n" => $value_n)); 
     139     */ 
     140    public static function debug($description, $details) { 
     141        if (self::DEBUG_ENABLED) { 
     142            echo "<pre class='sf_box_debug'>"; 
     143            echo "<strong>".$description."</strong>"; 
     144            if ($details) { 
     145                echo "<br>"; 
     146                echo htmlspecialchars(print_r($details, TRUE), ENT_QUOTES, 'UTF-8'); 
     147            } else { 
     148                echo "<br>&lt;Empty thing.&gt;"; 
     149            } 
     150            echo "</pre>"; 
     151        } 
     152    } 
     153 
     154    function admin_init() { 
     155 
     156        wp_enqueue_script("jquery"); 
     157        wp_enqueue_script("jquery-ui-core"); 
     158        wp_enqueue_script("jquery-ui-sortable"); 
     159        wp_enqueue_script("jquery-ui-dialog"); 
     160        wp_enqueue_style('wp-jquery-ui-dialog'); 
     161        wp_enqueue_script("jquery-effects-highlight"); 
     162        wp_enqueue_script("thickbox"); 
     163        wp_enqueue_style("thickbox"); 
     164        wp_enqueue_script("jscolor", SIMPLE_FIELDS_URL . "jscolor/jscolor.js"); // color picker for type color 
     165        wp_enqueue_script("simple-fields-date", SIMPLE_FIELDS_URL . "datepicker/date.js"); // date picker for type date 
     166        wp_enqueue_script("jquery-datepicker", SIMPLE_FIELDS_URL . "datepicker/jquery.datePicker.js"); // date picker for type date 
     167        wp_enqueue_style('jquery-datepicker', SIMPLE_FIELDS_URL.'datepicker/datePicker.css', false, SIMPLE_FIELDS_VERSION); 
     168 
     169        wp_enqueue_style('simple-fields-styles', SIMPLE_FIELDS_URL.'styles.css', false, SIMPLE_FIELDS_VERSION); 
     170        wp_register_script('simple-fields-scripts', SIMPLE_FIELDS_URL.'scripts.js', false, SIMPLE_FIELDS_VERSION); 
     171        wp_localize_script('simple-fields-scripts', 'sfstrings', array( 
     172            'txtDelete' => __('Delete', 'simple-fields'), 
     173            'confirmDelete' => __('Delete this field?', 'simple-fields'), 
     174            'confirmDeleteGroup' => __('Delete this group?', 'simple-fields'), 
     175            'confirmDeleteConnector' => __('Delete this post connector?', 'simple-fields'), 
     176            'confirmDeleteRadio' => __('Delete radio button?', 'simple-fields'), 
     177            'confirmDeleteDropdown' => __('Delete dropdown value?', 'simple-fields'), 
     178            'adding' => __('Adding...', 'simple-fields'), 
     179            'add' => __('Add', 'simple-fields'), 
     180            'confirmRemoveGroupConnector' => __('Remove field group from post connector?', 'simple-fields'), 
     181            'confirmRemoveGroup' => __('Remove this field group?', 'simple-fields'), 
     182            'context' => __('Context', 'simple-fields'), 
     183            'normal' => __('normal'), 
     184            'advanced' => __('advanced'), 
     185            'side' => __('side'), 
     186            'low' => __('low'), 
     187            'high' => __('high'), 
     188        )); 
     189        wp_enqueue_script('simple-fields-scripts'); 
     190 
     191        define( "SIMPLE_FIELDS_FILE", menu_page_url("simple-fields-options", false) ); 
     192 
     193    } 
     194 
     195    /** 
     196     * Add settings link to plugin page 
     197     * Hopefully this helps some people to find the settings page quicker 
     198     */ 
     199    function set_plugin_row_meta($links, $file) { 
     200 
     201        if ($file == $this->plugin_foldername_and_filename) { 
     202            return array_merge( 
     203                $links, 
     204                array( sprintf( '<a href="options-general.php?page=%s">%s</a>', "simple-fields-options", __('Settings') ) ) 
     205            ); 
     206        } 
     207        return $links; 
     208 
     209    } 
     210 
     211 
     212    /** 
     213     * Return an array of the post types that we have set up post connectors for 
     214     * 
     215     * Format of return: 
     216     * 
     217     * Array 
     218     * ( 
     219     *     [0] => post 
     220     *     [1] => page 
     221     *     [2] => testposttype 
     222     * ) 
     223     * 
     224     * @param return array 
     225     */ 
     226    function get_post_connector_attached_types() { 
     227        global $sf; 
     228        $post_connectors = $this->get_post_connectors(); 
     229        $arr_post_types = array(); 
     230        foreach ($post_connectors as $one_post_connector) { 
     231            $arr_post_types = array_merge($arr_post_types, (array) $one_post_connector["post_types"]); 
     232        } 
     233        $arr_post_types = array_unique($arr_post_types); 
     234        return $arr_post_types; 
     235    } 
     236 
     237 
     238    /** 
     239     * Get default connector for a post type 
     240     * If no connector has been set, __none__ is returned 
     241     * 
     242     * @param string $post_type 
     243     * @return mixed int connector id or string __none__ or __inherit__ 
     244     */ 
     245    function get_default_connector_for_post_type($post_type) { 
     246        $post_type_defaults = (array) get_option("simple_fields_post_type_defaults"); 
     247        $selected_post_type_default = (isset($post_type_defaults[$post_type]) ? $post_type_defaults[$post_type] : "__none__"); 
     248        return $selected_post_type_default; 
     249    } 
     250 
     251 
     252    /** 
     253     * Output HTML for dialog in bottom 
     254     */ 
     255    function admin_footer() { 
     256        // HTML for post dialog 
     257        ?><div class="simple-fields-meta-box-field-group-field-type-post-dialog hidden"></div><?php 
     258    } 
     259     
     260    /** 
     261     * output nonce 
     262     */ 
     263    function post_dbx_post_sidebar() { 
     264        ?> 
     265        <input type="hidden" name="simple_fields_nonce" id="simple_fields_nonce" value="<?php echo wp_create_nonce( plugin_basename(__FILE__) ); ?>" /> 
     266        <?php 
     267    } 
     268 
     269    /** 
     270     * Saves simple fields data when post is being saved 
     271     */ 
     272    function save_postdata($post_id = null, $post = null) { 
     273     
     274        // verify this came from the our screen and with proper authorization, 
     275        // because save_post can be triggered at other times 
     276        // so not checking nonce can lead to errors, for example losing post connector 
     277        if (!isset($_POST['simple_fields_nonce']) || !wp_verify_nonce( $_POST['simple_fields_nonce'], plugin_basename(__FILE__) )) { 
     278            return $post_id; 
     279        } 
     280     
     281        // verify if this is an auto save routine. If it is our form has not been submitted, so we dont want to do anything 
     282        if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) { return $post_id; } 
     283         
     284        // attach post connector 
     285        $simple_fields_selected_connector = (isset($_POST["simple_fields_selected_connector"])) ? $_POST["simple_fields_selected_connector"] : null; 
     286        update_post_meta($post_id, "_simple_fields_selected_connector", $simple_fields_selected_connector); 
     287     
     288        $post_id = (int) $post_id; 
     289        $fieldgroups = (isset($_POST["simple_fields_fieldgroups"])) ? $_POST["simple_fields_fieldgroups"] : null; 
     290        $field_groups_option = $this->get_field_groups(); 
     291     
     292        if ( !$table = _get_meta_table("post") ) { return false; } 
     293 
     294        global $wpdb; 
     295 
     296        // We have a post_id and we have fieldgroups 
     297        if ($post_id && is_array($fieldgroups)) { 
     298     
     299            // remove existing simple fields custom fields for this post 
     300            $wpdb->query("DELETE FROM $table WHERE post_id = $post_id AND meta_key LIKE '_simple_fields_fieldGroupID_%'"); 
     301     
     302            // cleanup missing keys, due to checkboxes not being checked 
     303            $fieldgroups_fixed = $fieldgroups; 
     304            foreach ($fieldgroups as $one_field_group_id => $one_field_group_fields) { 
     305             
     306                foreach ($one_field_group_fields as $posted_id => $posted_vals) { 
     307                    if ($posted_id == "added") { 
     308                        continue; 
     309                    } 
     310                    $fieldgroups_fixed[$one_field_group_id][$posted_id] = array(); 
     311                    // loopa igenom "added"-värdena och fixa så att allt finns 
     312                    foreach ($one_field_group_fields["added"] as $added_id => $added_val) { 
     313                        $fieldgroups_fixed[$one_field_group_id][$posted_id][$added_id] = @$fieldgroups[$one_field_group_id][$posted_id][$added_id]; 
     314                    } 
     315                } 
     316             
     317            } 
     318            $fieldgroups = $fieldgroups_fixed; 
     319     
     320            // Save info about the fact that this post have been saved. This info is used to determine if a post should get default values or not. 
     321            update_post_meta($post_id, "_simple_fields_been_saved", "1"); 
     322     
     323            // Loop through each fieldgroups 
     324            foreach ($fieldgroups as $one_field_group_id => $one_field_group_fields) { 
     325                 
     326                // Loop through each field in each field group 
     327#simple_fields::debug("one_field_group_fields", $one_field_group_fields); 
     328                foreach ($one_field_group_fields as $one_field_id => $one_field_values) { 
     329 
     330                    // one_field_id = id på fältet vi sparar. t.ex. id:et på "måndag" eller "tisdag" 
     331                    // one_field_values = sparade värden för detta fält, sorterat i den ordning som syns i admin 
     332                    //                    dvs. nyaste överst (med key "new0"), och sedan key 0, key 1, osv. 
     333 
     334#simple_fields::debug("save, loop fields, one_field_id", $one_field_id); 
     335#simple_fields::debug("save, loop fields, one_field_values", $one_field_values); 
     336 
     337                    // determine type of field we are saving 
     338                    $field_info = isset($field_groups_option[$one_field_group_id]["fields"][$one_field_id]) ? $field_groups_option[$one_field_group_id]["fields"][$one_field_id] : NULL; 
     339                    $field_type = $field_info["type"]; // @todo: this should be a function 
     340 
     341#simple_fields::debug("save, field_type", $field_type); 
     342 
     343                    $do_wpautop = false; 
     344                    if ($field_type == "textarea" && isset($field_info["type_textarea_options"]["use_html_editor"]) && $field_info["type_textarea_options"]["use_html_editor"] == 1) { 
     345                        // it's a tiny edit area, so use wpautop to fix p and br 
     346                        $do_wpautop = true; 
     347                    } 
     348                     
     349                    // save entered value for each added group 
     350                    $num_in_set = 0; 
     351                    foreach ($one_field_values as $one_field_value) { 
     352                     
     353                        $custom_field_key = "_simple_fields_fieldGroupID_{$one_field_group_id}_fieldID_{$one_field_id}_numInSet_{$num_in_set}"; 
     354                        $custom_field_value = $one_field_value; 
     355 
     356                        if (array_key_exists($field_type, $this->registered_field_types)) { 
     357                            // Custom field type                             
     358                            // @todo: callback to filter this, from fields class or hook 
     359                             
     360                        } else { 
     361                            // core/legacy field type 
     362                            if ($do_wpautop) { 
     363                                $custom_field_value = wpautop($custom_field_value); 
     364                            } 
     365     
     366                        } 
     367 
     368                        update_post_meta($post_id, $custom_field_key, $custom_field_value); 
     369                        $num_in_set++; 
     370                     
     371                    } 
     372     
     373                } 
     374                 
     375            } 
     376            // if array 
     377        } else if (empty($fieldgroups)) { 
     378            // if fieldgroups are empty we still need to save it 
     379            // remove existing simple fields custom fields for this post 
     380            $wpdb->query("DELETE FROM $table WHERE post_id = $post_id AND meta_key LIKE '_simple_fields_fieldGroupID_%'"); 
     381        }  
     382     
     383    } // save postdata 
     384 
     385    /** 
     386     * adds a fieldgroup through ajax = also fetch defaults 
     387     * called when clicking "+ add" in post edit screen 
     388     */ 
     389    function metabox_fieldgroup_add() { 
     390     
     391        global $sf; 
     392     
     393        $simple_fields_new_fields_count = (int) $_POST["simple_fields_new_fields_count"]; 
     394        $post_id = (int) $_POST["post_id"]; 
     395        $field_group_id = (int) $_POST["field_group_id"]; 
     396     
     397        $num_in_set = "new{$simple_fields_new_fields_count}"; 
     398        $this->meta_box_output_one_field_group($field_group_id, $num_in_set, $post_id, true); 
     399     
     400        exit; 
     401    } 
     402 
     403 
     404    /** 
     405     * Output the html for a field group in the meta box on the post edit screen 
     406     * Also called from ajax when clicking "+ add" 
     407     */ 
     408    function meta_box_output_one_field_group($field_group_id, $num_in_set, $post_id, $use_defaults) { 
     409     
     410        $post = get_post($post_id); 
     411         
     412        $field_groups = $this->get_field_groups(); 
     413        $current_field_group = $field_groups[$field_group_id]; 
     414        $repeatable = (bool) $current_field_group["repeatable"]; 
     415        $field_group_css = "simple-fields-fieldgroup-$field_group_id"; 
     416 
     417        ?> 
     418        <li class="simple-fields-metabox-field-group <?php echo $field_group_css ?>"> 
     419            <?php // must use this "added"-thingie do be able to track added field group that has no added values (like unchecked checkboxes, that we can't detect ?> 
     420            <input type="hidden" name="simple_fields_fieldgroups[<?php echo $field_group_id ?>][added][<?php echo $num_in_set ?>]" value="1" /> 
     421             
     422            <div class="simple-fields-metabox-field-group-handle"></div> 
     423            <?php 
     424            // if repeatable: add remove-link 
     425            if ($repeatable) { 
     426                ?><div class="hidden simple-fields-metabox-field-group-delete"><a href="#" title="<?php _e('Remove field group', 'simple-fields') ?>"></a></div><?php 
     427            } 
     428            ?> 
     429            <?php 
     430             
     431            // Output content for each field in this fieldgroup 
     432            // LI = fieldgroup 
     433            // DIV = field 
     434 
     435            foreach ($current_field_group["fields"] as $field) { 
     436             
     437                if ($field["deleted"]) { continue; } 
     438 
     439                $field_id = $field["id"]; 
     440                $field_unique_id = "simple_fields_fieldgroups_{$field_group_id}_{$field_id}_{$num_in_set}"; 
     441                $field_name = "simple_fields_fieldgroups[$field_group_id][$field_id][$num_in_set]"; 
     442                $field_class = "simple-fields-fieldgroups-field-{$field_group_id}-{$field_id} "; 
     443                $field_class .= "simple-fields-fieldgroups-field-type-" . $field["type"]; 
     444     
     445                $custom_field_key = "_simple_fields_fieldGroupID_{$field_group_id}_fieldID_{$field_id}_numInSet_{$num_in_set}"; 
     446                $saved_value = get_post_meta($post_id, $custom_field_key, true); // empty string if does not exist 
     447                 
     448                $description = ""; 
     449                if (!empty($field["description"])) { 
     450                    $description = sprintf("<div class='simple-fields-metabox-field-description'>%s</div>", esc_html($field["description"])); 
     451                } 
     452                 
     453                ?> 
     454                <div class="simple-fields-metabox-field <?php echo $field_class ?>"  
     455                    data-fieldgroup_id=<?php echo $field_group_id ?> 
     456                    data-field_id="<?php echo $field_id ?>" 
     457                    data-num_in_set=<?php echo $num_in_set ?> 
     458                    > 
     459                    <?php 
     460                    // different output depending on field type 
     461                    if ("checkbox" == $field["type"]) { 
     462         
     463                        if ($use_defaults) { 
     464                            $checked = @$field["type_checkbox_options"]["checked_by_default"]; 
     465                        } else { 
     466                            $checked = (bool) $saved_value; 
     467                        } 
     468                         
     469                        if ($checked) { 
     470                            $str_checked = " checked='checked' "; 
     471                        } else { 
     472                            $str_checked = ""; 
     473                        } 
     474                        echo "<input $str_checked id='$field_unique_id' type='checkbox' name='$field_name' value='1' />"; 
     475                        echo "<label class='simple-fields-for-checkbox' for='$field_unique_id'> " . $field["name"] . "</label>"; 
     476                        echo $description; 
     477         
     478                    } elseif ("radiobuttons" == $field["type"]) { 
     479         
     480                        echo "<label>" . $field["name"] . "</label>"; 
     481                        echo $description; 
     482                        $radio_options = $field["type_radiobuttons_options"]; 
     483                        $radio_checked_by_default_num = @$radio_options["checked_by_default_num"]; 
     484     
     485                        $loopNum = 0; 
     486                        foreach ($radio_options as $one_radio_option_key => $one_radio_option_val) { 
     487                            if ($one_radio_option_key == "checked_by_default_num") { continue; } 
     488                            if ($one_radio_option_val["deleted"]) { continue; } 
     489                            $radio_field_unique_id = $field_unique_id . "_radio_".$loopNum; 
     490                             
     491                            $selected = ""; 
     492                            if ($use_defaults) { 
     493                                if ($radio_checked_by_default_num == $one_radio_option_key) { $selected = " checked='checked' "; } 
     494                            } else { 
     495                                if ($saved_value == $one_radio_option_key) { $selected = " checked='checked' "; } 
     496                            } 
     497                                                     
     498                            echo "<div class='simple-fields-metabox-field-radiobutton'>"; 
     499                            echo "<input $selected name='$field_name' id='$radio_field_unique_id' type='radio' value='$one_radio_option_key' />"; 
     500                            echo "<label for='$radio_field_unique_id' class='simple-fields-for-radiobutton'> ".$one_radio_option_val["value"]."</label>"; 
     501                            echo "</div>"; 
     502                             
     503                            $loopNum++; 
     504                        } 
     505         
     506                    } elseif ("dropdown" == $field["type"]) { 
     507                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     508                        echo $description; 
     509                        echo "<select id='$field_unique_id' name='$field_name'>"; 
     510                        foreach ($field["type_dropdown_options"] as $one_option_internal_name => $one_option) { 
     511                            // $one_option_internal_name = dropdown_num_3 
     512                            if ($one_option["deleted"]) { continue; } 
     513                            $dropdown_value_esc = esc_html($one_option["value"]); 
     514                            $selected = ""; 
     515                            if ($use_defaults == false && $saved_value == $one_option_internal_name) { 
     516                                $selected = " selected='selected' "; 
     517                            } 
     518                            echo "<option $selected value='$one_option_internal_name'>$dropdown_value_esc</option>"; 
     519                        } 
     520                        echo "</select>"; 
     521     
     522                    } elseif ("file" == $field["type"]) { 
     523     
     524                        $current_post_id = !empty( $_GET['post_id'] ) ? (int) $_GET['post_id'] : 0; 
     525                        $attachment_id = (int) $saved_value; 
     526                        $image_html = ""; 
     527                        $image_name = ""; 
     528                        if ($attachment_id) { 
     529                            $image_thumbnail = wp_get_attachment_image_src( $attachment_id, 'thumbnail', true ); 
     530                            $image_thumbnail = $image_thumbnail[0]; 
     531                            $image_html = "<img src='$image_thumbnail' alt='' />"; 
     532                            $image_post = get_post($attachment_id); 
     533                            $image_name = esc_html($image_post->post_title); 
     534                        } 
     535                        $class = ""; 
     536                        if ($description) { 
     537                            $class = "simple-fields-metabox-field-with-description"; 
     538                        } 
     539                        echo "<div class='simple-fields-metabox-field-file $class'>"; 
     540                            echo "<label>{$field["name"]}</label>"; 
     541                            echo $description; 
     542                            echo "<div class='simple-fields-metabox-field-file-col1'>"; 
     543                                echo "<div class='simple-fields-metabox-field-file-selected-image'>$image_html</div>"; 
     544                            echo "</div>"; 
     545                            echo "<div class='simple-fields-metabox-field-file-col2'>"; 
     546                                echo "<input type='hidden' class='text simple-fields-metabox-field-file-fileID' name='$field_name' id='$field_unique_id' value='$attachment_id' />";                             
     547     
     548                                $field_unique_id_esc = rawurlencode($field_unique_id); 
     549                                // $file_url = "media-upload.php?simple_fields_dummy=1&simple_fields_action=select_file&simple_fields_file_field_unique_id=$field_unique_id_esc&post_id=$post_id&TB_iframe=true"; 
     550                                $file_url = get_bloginfo('wpurl') . "/wp-admin/media-upload.php?simple_fields_dummy=1&simple_fields_action=select_file&simple_fields_file_field_unique_id=$field_unique_id_esc&post_id=$current_post_id&TB_iframe=true"; 
     551                                echo "<a class='thickbox simple-fields-metabox-field-file-select' href='$file_url'>".__('Select file', 'simple-fields')."</a>"; 
     552                                 
     553                                $class = ($attachment_id) ? " " : " hidden "; 
     554                                $href_edit = ($attachment_id) ? admin_url("media.php?attachment_id={$attachment_id}&action=edit") : "#"; 
     555                                echo " <a href='{$href_edit}' class='simple-fields-metabox-field-file-edit $class'>".__('Edit', 'simple-fields') . "</a>"; 
     556                                echo " <a href='#' class='simple-fields-metabox-field-file-clear $class'>".__('Clear', 'simple-fields')."</a>";                          
     557                                echo "<div class='simple-fields-metabox-field-file-selected-image-name'>$image_name</div>"; 
     558                                 
     559                            echo "</div>"; 
     560                        echo "</div>"; 
     561     
     562                    } elseif ("image" == $field["type"]) { 
     563     
     564                        $text_value_esc = esc_html($saved_value); 
     565                        echo "<label>".__('image', 'simple-fields')."</label>"; 
     566                        echo $description; 
     567                        echo "<input class='text' name='$field_name' id='$field_unique_id' value='$text_value_esc' />"; 
     568                         
     569                    } elseif ("textarea" == $field["type"]) { 
     570         
     571                        $textarea_value_esc = esc_html($saved_value); 
     572                        $textarea_options = isset($field["type_textarea_options"]) ? $field["type_textarea_options"] : array(); 
     573                         
     574                        $textarea_class = ""; 
     575                        $textarea_class_wrapper = ""; 
     576     
     577                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     578                        echo $description; 
     579     
     580                        if (isset($textarea_options["use_html_editor"])) { 
     581                            // This helps get_upload_iframe_src() determine the correct post id for the media upload button 
     582                            global $post_ID; 
     583                            if (intval($post_ID) == 0) { 
     584                                if (intval($_REQUEST['post_id']) > 0) { 
     585                                    $post_ID = intval($_REQUEST['post']); 
     586                                } elseif (intval($_REQUEST['post']) > 0) { 
     587                                    $post_ID = intval($_REQUEST['post']); 
     588                                } 
     589                            } 
     590                            $args = array("textarea_name" => $field_name, "editor_class" => "simple-fields-metabox-field-textarea-tinymce"); 
     591                            echo "<div class='simple-fields-metabox-field-textarea-tinymce-wrapper'>"; 
     592                            wp_editor( $saved_value, $field_unique_id, $args ); 
     593                            echo "</div>"; 
     594                        } else { 
     595                            echo "<div class='simple-fields-metabox-field-textarea-wrapper'>"; 
     596                            echo "<textarea class='simple-fields-metabox-field-textarea' name='$field_name' id='$field_unique_id' cols='50' rows='5'>$textarea_value_esc</textarea>"; 
     597                            echo "</div>"; 
     598                        } 
     599         
     600                    } elseif ("text" == $field["type"]) { 
     601         
     602                        $text_value_esc = esc_html($saved_value); 
     603                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     604                        echo $description; 
     605                        echo "<input class='text' name='$field_name' id='$field_unique_id' value='$text_value_esc' />"; 
     606         
     607                    } elseif ("color" == $field["type"]) { 
     608                         
     609                        $text_value_esc = esc_html($saved_value); 
     610                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     611                        echo $description; 
     612                        echo "<input class='text simple-fields-field-type-color {pickerClosable:true}' name='$field_name' id='$field_unique_id' value='$text_value_esc' />"; 
     613     
     614                    } elseif ("date" == $field["type"]) { 
     615     
     616                        // $datef = __( 'M j, Y @ G:i' ); // same format as in meta-boxes.php 
     617                        // echo date_i18n( $datef, strtotime( current_time('mysql') ) ); 
     618                         
     619                        $text_value_esc = esc_html($saved_value); 
     620                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     621                        echo $description; 
     622                        echo "<input class='text simple-fields-field-type-date' name='$field_name' id='$field_unique_id' value='$text_value_esc' />"; 
     623     
     624                    } elseif ("taxonomy" == $field["type"]) { 
     625                         
     626                        $arr_taxonomies = get_taxonomies(array(), "objects");                    
     627                        $enabled_taxonomies = (array) @$field["type_taxonomy_options"]["enabled_taxonomies"]; 
     628                         
     629                        //echo "<pre>";print_r($enabled_taxonomies );echo "</pre>"; 
     630                         
     631                        $text_value_esc = esc_html($saved_value); 
     632                        // var_dump($saved_value); 
     633                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     634                        echo $description; 
     635                         
     636                        echo "<select name='$field_name'>"; 
     637                        printf("<option value=''>%s</option>", __('Select...', 'simple-fields')); 
     638                        foreach ($arr_taxonomies as $one_taxonomy) { 
     639                            if (!in_array($one_taxonomy->name, $enabled_taxonomies)) { 
     640                                continue; 
     641                            } 
     642                            $selected = ($saved_value == $one_taxonomy->name) ? ' selected="selected" ' : ''; 
     643                            printf ("<option %s value='%s'>%s</option>", $selected, $one_taxonomy->name, $one_taxonomy->label); 
     644                        } 
     645                        echo "</select>"; 
     646     
     647     
     648                    } elseif ("taxonomyterm" == $field["type"]) { 
     649                         
     650                        $enabled_taxonomy = @$field["type_taxonomyterm_options"]["enabled_taxonomy"]; 
     651                        $additional_arguments = @$field["type_taxonomyterm_options"]["additional_arguments"]; 
     652     
     653                        // hämta alla terms som finns för taxonomy $enabled_taxonomy 
     654                        // @todo: kunna skicka in args här, t.ex. för orderby 
     655     
     656                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     657                        echo $description; 
     658     
     659                        $arr_selected_cats = (array) $saved_value; 
     660                         
     661                        $walker = new Simple_Fields_Walker_Category_Checklist(); 
     662                        $args = array( 
     663                            "taxonomy" => $enabled_taxonomy, 
     664                            "selected_cats" => $arr_selected_cats, 
     665                            "walker" => $walker, 
     666                            "sf_field_name" => $field_name // walker is ot able to get this one, therefor global 
     667                        ); 
     668                        global $simple_fields_taxonomyterm_walker_field_name; // sorry for global…! 
     669                        $simple_fields_taxonomyterm_walker_field_name = $field_name; 
     670                        echo "<ul class='simple-fields-metabox-field-taxonomymeta-terms'>"; 
     671                        wp_terms_checklist(NULL, $args); 
     672                        echo "</ul>"; 
     673                         
     674                    } elseif ("post" == $field["type"]) { 
     675                         
     676                        $saved_value_int = (int) $saved_value; 
     677                        if ($saved_value_int) { 
     678                            $saved_post_name = get_the_title($saved_value_int); 
     679                            $showHideClass = ""; 
     680                        } else { 
     681                            $saved_post_name = ""; 
     682                            $showHideClass = "hidden"; 
     683                        } 
     684                         
     685                        $type_post_options = (array) @$field["type_post_options"]; 
     686                        $enabled_post_types = $type_post_options["enabled_post_types"]; 
     687                         
     688                        echo "<div class='simple-fields-metabox-field-post'>"; 
     689                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     690                        echo $description;                   
     691     
     692                        echo "<div>"; 
     693                        printf("<a class='%s' href='#'>%s</a>", "simple-fields-metabox-field-post-select", __("Select post", "simple-fields")); 
     694                        printf("<a class='%s' href='#'>%s</a>", "simple-fields-metabox-field-post-clear $showHideClass", __("Clear", "simple-fields")); 
     695                        echo "</div>"; 
     696                         
     697                        // output the post types that are selected for this post field 
     698                        printf("<input type='hidden' name='%s' value='%s' />", "simple-fields-metabox-field-post-enabled-post-types", join(",", $enabled_post_types)); 
     699                                             
     700                        // name of the selected post 
     701                        echo "<div class='simple-fields-field-type-post-postName $showHideClass'>$saved_post_name</div>"; 
     702                         
     703                        // print the id of the current post 
     704                        echo "<input type='hidden' class='simple-fields-field-type-post-postID' name='$field_name' id='$field_unique_id' value='$saved_value_int' />"; 
     705                         
     706                        // output additional arguments for this post field 
     707                        echo "<input type='hidden' name='additional_arguments' id='additional_arguments' value='".$type_post_options['additional_arguments']."' />"; 
     708                         
     709                        echo "</div>"; 
     710     
     711                    } elseif ("user" == $field["type"]) { 
     712                     
     713                        $saved_value_int = (int) $saved_value; 
     714                     
     715                        echo "<div class='simple-fields-metabox-field-post'>"; 
     716                        // echo "<pre>"; print_r($type_post_options); echo "</pre>"; 
     717                        echo "<label for='$field_unique_id'> " . $field["name"] . "</label>"; 
     718                        echo $description; 
     719                         
     720                        // must set orderby or it will not get any users at all. yes. it's that weird. 
     721                        $args = array( 
     722                            //' role' => 'any' 
     723                            "orderby" => "login", 
     724                            "order" => "asc" 
     725                        ); 
     726                        $users_query = new WP_User_Query( $args ); 
     727                        $users = $users_query->results; 
     728                         
     729                        echo "<select name='$field_name' id='$field_unique_id'>"; 
     730                        printf("<option value=''>%s</option>", __('Select...', 'simple-fields')); 
     731                        foreach ($users as $one_user) { 
     732                            $first_name = get_the_author_meta("first_name", $one_user->ID); 
     733                            $last_name = get_the_author_meta("last_name", $one_user->ID); 
     734                            $first_and_last_name = ""; 
     735                            if (!empty($first_name) || !empty($last_name)) { 
     736                                $first_and_last_name = $first_name . " " . $last_name; 
     737                                $first_and_last_name = trim($first_and_last_name); 
     738                                $first_and_last_name = " ($first_and_last_name)"; 
     739                            } 
     740                             
     741                            printf("<option %s value='%s'>%s</option>",  
     742                                ($saved_value_int == $one_user->ID) ? " selected='selected' " : "", 
     743                                $one_user->ID, 
     744                                $one_user->display_name . "$first_and_last_name" 
     745                            ); 
     746                        } 
     747                        echo "</select>"; 
     748                         
     749                        echo "</div>"; 
     750     
     751     
     752                    } else { 
     753                         
     754                        // Filed type is not "core", so check for added field types 
     755                        if (isset($this->registered_field_types[$field["type"]])) { 
     756                         
     757                            $custom_field_type = $this->registered_field_types[$field["type"]]; 
     758                            $custom_field_type->set_options_base_id($field_unique_id); 
     759                            $custom_field_type->set_options_base_name($field_name); 
     760 
     761                            // Get the options that are saved for this field type. 
     762                            // @todo: should be a method of the class? must know what field group it's connected to to be able to fetch the right one 
     763                            $custom_field_type_options = isset($field["options"][$field["type"]]) ? $field["options"][$field["type"]] : array(); 
     764 
     765                            // Always output label and description, for consistency 
     766                            echo "<label>" . $field["name"] . "</label>"; 
     767                            echo $description; 
     768                             
     769                            // Get and output the edit-output from the field type 
     770                            echo $custom_field_type->edit_output( (array) $saved_value, $custom_field_type_options); 
     771 
     772                        } 
     773                     
     774                    } // field types 
     775                     
     776                    // Output hidden field that can be shown with JS to see the name and slug of a field 
     777                    ?> 
     778                    <div class="simple-fields-metabox-field-custom-field-key hidden highlight"> 
     779                        <strong><?php _e('Meta key:', 'simple-fields') ?></strong> 
     780                        <?php echo $custom_field_key ?> 
     781                        <?php if (isset($field["slug"])) { ?> 
     782                            <br><strong><?php _e('Field slug:', 'simple-fields') ?></strong> 
     783                            <?php echo $field["slug"] ?> 
     784                        <?php } ?> 
     785                    </div> 
     786                </div><!-- // end simple-fields-metabox-field --> 
     787                <?php 
     788            } // foreach 
     789             
     790            ?> 
     791        </li> 
     792        <?php 
     793    } // end function print 
     794 
     795 
     796    /** 
     797     * Head of admin area 
     798     * - Add meta box with info about currently selected connector + options to choose another one 
     799     * - Add meta boxes with field groups 
     800     */ 
     801    function admin_head() { 
     802     
     803        // Add meta box to post 
     804        global $post, $sf; 
     805     
     806        if ($post) { 
     807     
     808            $post_type = $post->post_type; 
     809            $arr_post_types = $this->get_post_connector_attached_types(); 
     810             
     811            // check if the post type being edited is among the post types we want to add boxes for 
     812            if (in_array($post_type, $arr_post_types)) { 
     813                 
     814                // general meta box to select fields for the post 
     815                add_meta_box('simple-fields-post-edit-side-field-settings', 'Simple Fields', array($this, 'edit_post_side_field_settings'), $post_type, 'side', 'low'); 
     816                 
     817                $connector_to_use = $this->get_selected_connector_for_post($post); 
     818                 
     819                // get connector to use for this post 
     820                $post_connectors = $this->get_post_connectors(); 
     821                if (isset($post_connectors[$connector_to_use])) { 
     822                     
     823                    $field_groups = $this->get_field_groups(); 
     824                    $selected_post_connector = $post_connectors[$connector_to_use]; 
     825                     
     826                    // check if we should hide the editor, using css to keep things simple 
     827                    // echo "<pre>";print_r($selected_post_connector);echo "</pre>"; 
     828                    $hide_editor = (bool) isset($selected_post_connector["hide_editor"]) && $selected_post_connector["hide_editor"]; 
     829                    if ($hide_editor) { 
     830                        ?><style type="text/css">#postdivrich, #postdiv { display: none; }</style><?php 
     831                    } 
     832                     
     833                    // get the field groups for the selected connector 
     834                    $selected_post_connector_field_groups = $selected_post_connector["field_groups"]; 
     835     
     836                    foreach ($selected_post_connector_field_groups as $one_post_connector_field_group) { 
     837     
     838                        // check that the connector is not deleted 
     839                        if ($one_post_connector_field_group["deleted"]) { 
     840                            continue; 
     841                        } 
     842     
     843                        // check that the field group for the connector we want to add also actually exists 
     844                        if (isset($field_groups[$one_post_connector_field_group["id"]])) { 
     845                                                     
     846                            $field_group_to_add = $field_groups[$one_post_connector_field_group["id"]]; 
     847     
     848                            $meta_box_id = "simple_fields_connector_" . $field_group_to_add["id"]; 
     849                            $meta_box_title = $field_group_to_add["name"]; 
     850                            $meta_box_context = $one_post_connector_field_group["context"]; 
     851                            $meta_box_priority = $one_post_connector_field_group["priority"]; 
     852                            // @todo: could we just create an anonymous function the "javascript way" instead? does that require a too new version of PHP? 
     853                            $meta_box_callback = create_function ("", "global \$sf; \$sf->meta_box_output({$one_post_connector_field_group["id"]}, $post->ID); "); 
     854                             
     855                            add_meta_box( $meta_box_id, $meta_box_title, $meta_box_callback, $post_type, $meta_box_context, $meta_box_priority ); 
     856                             
     857                        } 
     858                         
     859                    } 
     860                } 
     861                 
     862            } 
     863        } 
     864         
     865    } // end function admin head 
     866 
     867 
     868    /** 
     869     * print out fields for a meta box 
     870     */ 
     871    function meta_box_output($post_connector_field_id, $post_id) { 
     872      
     873        // if not repeatable, just print it out 
     874        // if repeatable: only print out the ones that have a value 
     875        // and + add-button 
     876         
     877        global $sf; 
     878      
     879        $field_groups = $this->get_field_groups(); 
     880        $current_field_group = $field_groups[$post_connector_field_id]; 
     881      
     882        echo "<div class='simple-fields-meta-box-field-group-wrapper'>"; 
     883        echo "<input type='hidden' name='simple-fields-meta-box-field-group-id' value='$post_connector_field_id' />"; 
     884      
     885        // show description 
     886        if (!empty($current_field_group["description"])) { 
     887            printf("<p class='%s'>%s</p>", "simple-fields-meta-box-field-group-description", esc_html($current_field_group["description"])); 
     888        } 
     889        //echo "<pre>";print_r($current_field_group);echo "</pre>"; 
     890      
     891        if ($current_field_group["repeatable"]) { 
     892      
     893            echo " 
     894                <div class='simple-fields-metabox-field-add'> 
     895                    <a href='#'>+ ".__('Add', 'simple-fields')."</a> 
     896                </div> 
     897            "; 
     898            echo "<ul class='simple-fields-metabox-field-group-fields simple-fields-metabox-field-group-fields-repeatable'>"; 
     899      
     900            // check for prev. saved fieldgroups 
     901            // _simple_fields_fieldGroupID_1_fieldID_added_numInSet_0 
     902            // try until returns empty 
     903            $num_added_field_groups = 0; 
     904      
     905            while (get_post_meta($post_id, "_simple_fields_fieldGroupID_{$post_connector_field_id}_fieldID_added_numInSet_{$num_added_field_groups}", true)) { 
     906                $num_added_field_groups++; 
     907            } 
     908            //var_dump( get_post_meta($post_id, "_simple_fields_fieldGroupID_{$post_connector_field_id}_fieldID_added_numInSet_0", true) ); 
     909            //echo "num_added_field_groups: $num_added_field_groups"; 
     910            // now add them. ooooh my, this is fancy stuff. 
     911            $use_defaults = null; 
     912            for ($num_in_set=0; $num_in_set<$num_added_field_groups; $num_in_set++) { 
     913                $this->meta_box_output_one_field_group($post_connector_field_id, $num_in_set, $post_id, $use_defaults);   
     914            } 
     915      
     916            echo "</ul>"; 
     917      
     918        } else { 
     919              
     920            // is this a new post, ie. should default values be used 
     921            $been_saved = (bool) get_post_meta($post_id, "_simple_fields_been_saved", true); 
     922            if ($been_saved) { $use_defaults = false; } else { $use_defaults = true; } 
     923              
     924            echo "<ul>"; 
     925            $this->meta_box_output_one_field_group($post_connector_field_id, 0, $post_id, $use_defaults); 
     926            echo "</ul>"; 
     927      
     928        } 
     929          
     930        echo "</div>"; 
     931      
     932    } // end 
     933 
     934    /** 
     935     * Returns all defined post connectors 
     936     * @return array 
     937     */ 
     938    function get_post_connectors() { 
     939        $connectors = get_option("simple_fields_post_connectors"); 
     940        if ($connectors === FALSE) $connectors = array(); 
     941     
     942        // calculate number of active field groups 
     943        // @todo: check this a bit more, does not seem to be any deleted groups. i thought i saved the deletes ones to, but with deleted flag set 
     944        foreach (array_keys($connectors) as $i) { 
     945                     
     946                    // Sanity check the connector id 
     947                    if (empty($connectors[$i]["id"]) && empty($connectors[$i]["deleted"])) { 
     948                         
     949                        // Found field group without id, let's try to repair it 
     950                        $highest_id = 0; 
     951                        foreach($connectors as $one_connector) { 
     952                            if ($one_connector["id"] > $highest_id) 
     953                                $highest_id = $one_connector["id"]; 
     954                            if ($one_connector["id"] === $i) 
     955                                $id_already_exists = true; 
     956                        } 
     957                         
     958                        if ($i > 0 && !$id_already_exists) { 
     959                            // If the array key is larger than 0 and 
     960                            // not used as id by any other connector, 
     961                            // then it's the perfect id 
     962                            $connectors[$i]["id"] = $i; 
     963                        } else { 
     964                            // The array key is either less than or equal to 0, 
     965                            // or another connector is using it as id. In any case, 
     966                            // let's treat it as a new connector and give it a new id. 
     967                            $new_id = $highest_id + 1; 
     968                            $connectors[$i]["id"] = $new_id; 
     969                             
     970                            // Now make sure the array key matches the new id 
     971                            $connectors[$new_id] = $connectors[$i]; 
     972                            unset($connectors[$i]); 
     973                            $i = $new_id; 
     974                        } 
     975                         
     976                    } 
     977         
     978            // compatibility fix key vs slug 
     979            if (isset($connectors[$i]["slug"]) && $connectors[$i]["slug"]) { 
     980                $connectors[$i]["key"] = $connectors[$i]["slug"]; 
     981            } else if (isset($connectors[$i]["key"]) && $connectors[$i]["key"]) { 
     982                $connectors[$i]["slug"] = $connectors[$i]["key"]; 
     983            } 
     984         
     985            $num_fields_in_group = 0; 
     986            foreach ($connectors[$i]["field_groups"] as $one_group) { 
     987                if (!$one_group["deleted"]) $num_fields_in_group++; 
     988            } 
     989            $connectors[$connectors[$i]["id"]]["field_groups_count"] = $num_fields_in_group; 
     990        } 
     991     
     992        return $connectors; 
     993    } 
     994     
     995    /** 
     996     * Returns all defined field groups 
     997     * 
     998     * @return array 
     999     */ 
     1000    function get_field_groups() { 
     1001 
     1002        $field_groups = get_option("simple_fields_groups"); 
     1003        if ($field_groups === FALSE) $field_groups = array(); 
     1004         
     1005        // Calculate the number of active fields 
     1006        // And some other things 
     1007        foreach (array_keys($field_groups) as $i) { 
     1008                     
     1009                    // Sanity check the field group id 
     1010                    if (empty($field_groups[$i]["id"]) && empty($field_groups[$i]["deleted"])) { 
     1011                         
     1012                        // Found field group without id, let's try to repair it 
     1013                        $highest_id = 0; 
     1014                        foreach($field_groups as $one_field_group) { 
     1015                            if ($one_field_group["id"] > $highest_id) 
     1016                                $highest_id = $one_field_group["id"]; 
     1017                            if ($one_field_group["id"] === $i) 
     1018                                $id_already_exists = true; 
     1019                        } 
     1020                         
     1021                        if ($i > 0 && !$id_already_exists) { 
     1022                            // If the array key is larger than 0 and 
     1023                            // not used as id by any other field group, 
     1024                            // then it's the perfect id 
     1025                            $field_groups[$i]["id"] = $i; 
     1026                        } else { 
     1027                            // The array key is either less than or equal to 0, 
     1028                            // or another field group is using it as id. In any case, 
     1029                            // let's treat it as a new field group and give it a new id. 
     1030                            $new_id = $highest_id + 1; 
     1031                            $field_groups[$i]["id"] = $new_id; 
     1032                             
     1033                            // Now make sure the array key matches the new id 
     1034                            $field_groups[$new_id] = $field_groups[$i]; 
     1035                            unset($field_groups[$i]); 
     1036                            $i = $new_id; 
     1037                        } 
     1038                         
     1039                    } 
     1040 
     1041            // Make sure we have both key and slug set to same. key = old name for slug 
     1042            if (isset($field_groups[$i]["slug"]) && $field_groups[$i]["slug"]) { 
     1043                $field_groups[$i]["key"] = $field_groups[$i]["slug"]; 
     1044            } else if (isset($field_groups[$i]["key"]) && $field_groups[$i]["key"]) { 
     1045                $field_groups[$i]["slug"] = $field_groups[$i]["key"]; 
     1046            } 
     1047 
     1048            $num_active_fields = 0; 
     1049            foreach ($field_groups[$i]["fields"] as $one_field) { 
     1050                if (!$one_field["deleted"]) $num_active_fields++; 
     1051            } 
     1052            $field_groups[$i]["fields_count"] = $num_active_fields; 
     1053        } 
     1054         
     1055        return $field_groups; 
     1056         
     1057    } 
     1058 
     1059    /** 
     1060     * Get a field group 
     1061     * @param int $group_id 
     1062     * @return array with field group or false if field group is not found 
     1063     */ 
     1064    function get_field_group($group_id) { 
     1065        $field_groups = $this->get_field_groups(); 
     1066        $return = false; 
     1067        if (is_array($field_groups)) { 
     1068            foreach($field_groups as $field_group) { 
     1069                if (is_numeric($group_id)) { 
     1070                    if ($field_group['id'] == $group_id) { 
     1071                        $return = $field_group; 
     1072                        break; 
     1073                    } 
     1074                } else { 
     1075                    if ($field_group['name'] == $group_id) { 
     1076                        $return = $field_group; 
     1077                        break; 
     1078                    } 
     1079                } 
     1080            } 
     1081        } 
     1082        return $return; 
     1083    } 
     1084 
     1085 
     1086    /** 
     1087     * Returns a field from a field group 
     1088     * @param int $field_group 
     1089     * @param int $field_id 
     1090     * @return false on error 
     1091     */ 
     1092    function get_field_in_group($field_group, $field_id) { 
     1093        $return = false; 
     1094        if (is_array($field_group) && is_array($field_group['fields'])) { 
     1095            foreach($field_group['fields'] as $field) { 
     1096                if (is_numeric($field_id)) { 
     1097                    if ($field['id'] == $field_id) { 
     1098                        $return = $field; 
     1099                        break; 
     1100                    } 
     1101                } else { 
     1102                    if ($field['name'] == $field_id) { 
     1103                        $return = $field; 
     1104                        break; 
     1105                    } 
     1106                } 
     1107            } 
     1108        } 
     1109        return $return; 
     1110    } 
     1111 
     1112 
     1113    /** 
     1114     * meta box in sidebar in post edit screen 
     1115     * let user select post connector to use for current post 
     1116     */ 
     1117    function edit_post_side_field_settings() { 
     1118         
     1119        global $post, $sf; 
     1120         
     1121        $arr_connectors = $this->get_post_connectors_for_post_type($post->post_type); 
     1122        $connector_default = $this->get_default_connector_for_post_type($post->post_type); 
     1123        $connector_selected = $this->get_selected_connector_for_post($post); 
     1124     
     1125        // $connector_selected returns the id of the connector to use, yes, but we want the "real" connector, not the id of the inherited or so 
     1126        // this will be empty if this is a new post and default connector is __inherit__ 
     1127        // if this is empty then use connector_selected. this may happen in post is new and not saved 
     1128        $saved_connector_to_use = get_post_meta($post->ID, "_simple_fields_selected_connector", true); 
     1129        if (empty($saved_connector_to_use)) { 
     1130            $saved_connector_to_use = $connector_default; 
     1131        } 
     1132        /* 
     1133        echo "<br>saved_connector_to_use: $saved_connector_to_use"; 
     1134        echo "<br>connector_selected: $connector_selected"; 
     1135        echo "<br>connector_default: $connector_default"; 
     1136        on parent post we can use simple_fields_get_selected_connector_for_post($post) to get the right one? 
     1137        can't use that function on the current post, because it won't work if we don't acually have inherit 
     1138        confused? I AM! 
     1139        */ 
     1140         
     1141        // get name of inherited post connector 
     1142        $parents = get_post_ancestors($post); 
     1143        $str_inherit_parent_connector_name = __('(no parent found)', 'simple-fields'); 
     1144        if (empty($parents)) { 
     1145        } else { 
     1146            $post_parent = get_post($post->post_parent); 
     1147            $parent_selected_connector = $this->get_selected_connector_for_post($post_parent); 
     1148            $str_parent_connector_name = ""; 
     1149            if ($parent_selected_connector) 
     1150            foreach ($arr_connectors as $one_connector) { 
     1151                if ($one_connector["id"] == $parent_selected_connector) { 
     1152                    $str_parent_connector_name = $one_connector["name"]; 
     1153                    break; 
     1154                } 
     1155            } 
     1156            if ($str_parent_connector_name) { 
     1157                $str_inherit_parent_connector_name = "({$str_parent_connector_name})"; 
     1158            } 
     1159        } 
     1160         
     1161        ?> 
     1162        <div class="inside"> 
     1163            <div> 
     1164                <select name="simple_fields_selected_connector" id="simple-fields-post-edit-side-field-settings-select-connector"> 
     1165                    <option <?php echo ($saved_connector_to_use == "__none__") ? " selected='selected' " : "" ?> value="__none__"><?php _e('None', 'simple-fields') ?></option> 
     1166                    <option <?php echo ($saved_connector_to_use == "__inherit__") ? " selected='selected' " : "" ?> value="__inherit__"><?php _e('Inherit from parent', 'simple-fields') ?> 
     1167                        <?php 
     1168                        echo $str_inherit_parent_connector_name; 
     1169                        ?> 
     1170                    </option> 
     1171                    <?php foreach ($arr_connectors as $one_connector) : ?> 
     1172                        <?php if ($one_connector["deleted"]) { continue; } ?> 
     1173                        <option <?php echo ($saved_connector_to_use == $one_connector["id"]) ? " selected='selected' " : "" ?> value="<?php echo $one_connector["id"] ?>"><?php echo $one_connector["name"] ?></option> 
     1174                    <?php endforeach; ?> 
     1175                </select> 
     1176            </div> 
     1177            <div id="simple-fields-post-edit-side-field-settings-select-connector-please-save" class="hidden"> 
     1178                <p><?php _e('Save post to switch to selected fields.', 'simple-fields') ?></p> 
     1179            </div> 
     1180            <div> 
     1181                <p><a href="#" id="simple-fields-post-edit-side-field-settings-show-keys"><?php _e('Show custom field keys', 'simple-fields') ?></a></p> 
     1182            </div> 
     1183        </div> 
     1184        <?php 
     1185    } // function  
     1186 
     1187    /** 
     1188     * get selected post connector for a post 
     1189     * @param object $post 
     1190     * @return id or string __none__ 
     1191     */ 
     1192    function get_selected_connector_for_post($post) { 
     1193        /* 
     1194        om sparad connector finns för denna artikel, använd den 
     1195        om inte sparad connector, använd default 
     1196        om sparad eller default = inherit, leta upp connector för parent post 
     1197        */ 
     1198        #d($post); 
     1199         
     1200        global $sf; 
     1201         
     1202        $post_type = $post->post_type; 
     1203        $connector_to_use = null; 
     1204        if (!$post->ID) { 
     1205            // no id (new post), use default for post type 
     1206            $connector_to_use = $this->get_default_connector_for_post_type($post_type); 
     1207        } elseif ($post->ID) { 
     1208            // get saved connector for post 
     1209            $connector_to_use = get_post_meta($post->ID, "_simple_fields_selected_connector", true); 
     1210            #var_dump($connector_to_use); 
     1211            if ($connector_to_use == "") { 
     1212                // no previous post connector saved, use default for post type 
     1213                $connector_to_use = $this->get_default_connector_for_post_type($post_type); 
     1214            } 
     1215        } 
     1216         
     1217        // $connector_to_use is now a id or __none__ or __inherit__ 
     1218     
     1219        // if __inherit__, get connector from post_parent 
     1220        if ("__inherit__" == $connector_to_use && $post->post_parent > 0) { 
     1221            $parent_post_id = $post->post_parent; 
     1222            $parent_post = get_post($parent_post_id); 
     1223            $connector_to_use = $this->get_selected_connector_for_post($parent_post); 
     1224        } elseif ("__inherit__" == $connector_to_use && 0 == $post->post_parent) { 
     1225            // already at the top, so inherit should mean... __none__..? right? 
     1226            // hm.. no.. then the wrong value is selected in the drop down.. hm... 
     1227            #$connector_to_use = "__none__"; 
     1228        } 
     1229         
     1230        // if selected connector is deleted, then return none 
     1231        $post_connectors = $this->get_post_connectors(); 
     1232        if (isset($post_connectors[$connector_to_use]["deleted"]) && $post_connectors[$connector_to_use]["deleted"]) { 
     1233            $connector_to_use = "__none__"; 
     1234        } 
     1235     
     1236        return $connector_to_use; 
     1237     
     1238    } // function get_selected_connector_for_post 
     1239 
     1240 
     1241    /** 
     1242     * Code from Admin Menu Tree Page View 
     1243     */ 
     1244    function get_pages($args) { 
     1245     
     1246        global $sf; 
     1247     
     1248        $defaults = array( 
     1249            "post_type" => "page", 
     1250            "xparent" => "0", 
     1251            "xpost_parent" => "0", 
     1252            "numberposts" => "-1", 
     1253            "orderby" => "menu_order", 
     1254            "order" => "ASC", 
     1255            "post_status" => "any" 
     1256        ); 
     1257        $args = wp_parse_args( $args, $defaults ); 
     1258        $pages = get_posts($args); 
     1259     
     1260        $output = ""; 
     1261        $str_child_output = ""; 
     1262        foreach ($pages as $one_page) { 
     1263            $edit_link = get_edit_post_link($one_page->ID); 
     1264            $title = get_the_title($one_page->ID); 
     1265            $title = esc_html($title); 
     1266                     
     1267            $class = ""; 
     1268            if (isset($_GET["action"]) && $_GET["action"] == "edit" && isset($_GET["post"]) && $_GET["post"] == $one_page->ID) { 
     1269                $class = "current"; 
     1270            } 
     1271     
     1272            // add css if we have childs 
     1273            $args_childs = $args; 
     1274            $args_childs["parent"] = $one_page->ID; 
     1275            $args_childs["post_parent"] = $one_page->ID; 
     1276            $args_childs["child_of"] = $one_page->ID; 
     1277            $str_child_output = $this->get_pages($args_childs); 
     1278             
     1279            $output .= "<li class='$class'>"; 
     1280            $output .= "<a href='$edit_link' data-post-id='".$one_page->ID."'>"; 
     1281            $output .= $title; 
     1282            $output .= "</a>"; 
     1283     
     1284            // add child articles 
     1285            $output .= $str_child_output; 
     1286             
     1287            $output .= "</li>"; 
     1288        } 
     1289         
     1290        // if this is a child listing, add ul 
     1291        if (isset($args["child_of"]) && $args["child_of"] && $output != "") { 
     1292            $output = "<ul class='simple-fields-tree-page-tree_childs'>$output</ul>"; 
     1293        } 
     1294         
     1295        return $output; 
     1296    } 
     1297 
     1298 
     1299    /** 
     1300     * File browser dialog: 
     1301     * hide some things there to make it more clean and user friendly 
     1302     */ 
     1303    function admin_head_select_file() { 
     1304        // Only output this css when we are showing a file dialog for simple fields 
     1305        if (isset($_GET["simple_fields_action"]) && $_GET["simple_fields_action"] == "select_file") { 
     1306            ?> 
     1307            <style type="text/css"> 
     1308                .wp-post-thumbnail, tr.image_alt, tr.post_title, tr.align, tr.image-size,tr.post_excerpt, tr.url, tr.post_content { 
     1309                    display: none;  
     1310                } 
     1311            </style> 
     1312            <?php 
     1313        } 
     1314    } 
     1315 
     1316     
     1317    /** 
     1318     * used from file selector popup 
     1319     * send the selected file to simple fields 
     1320     */ 
     1321    function media_send_to_editor($html, $id) { 
     1322     
     1323        parse_str($_POST["_wp_http_referer"], $arr_postinfo); 
     1324     
     1325        // only act if file browser is initiated by simple fields 
     1326        if (isset($arr_postinfo["simple_fields_action"]) && $arr_postinfo["simple_fields_action"] == "select_file") { 
     1327     
     1328            // add the selected file to input field with id simple_fields_file_field_unique_id 
     1329            $simple_fields_file_field_unique_id = $arr_postinfo["simple_fields_file_field_unique_id"]; 
     1330            $file_id = (int) $id; 
     1331             
     1332            $image_thumbnail = wp_get_attachment_image_src( $file_id, 'thumbnail', true ); 
     1333            $image_thumbnail = $image_thumbnail[0]; 
     1334            $image_html = "<img src='$image_thumbnail' alt='' />"; 
     1335            $file_name = get_the_title($file_id); 
     1336            $post_file = get_post($file_id); 
     1337            $post_title = $post_file->post_title; 
     1338            $post_title = esc_html($post_title); 
     1339            $post_title = utf8_decode($post_title); 
     1340            $file_name = rawurlencode($post_title); 
     1341     
     1342            ?> 
     1343            <script> 
     1344                var win = window.dialogArguments || opener || parent || top; 
     1345                var file_id = <?php echo $file_id ?>; 
     1346                win.jQuery("#<?php echo $simple_fields_file_field_unique_id ?>").val(file_id); 
     1347                var sfmff = win.jQuery("#<?php echo $simple_fields_file_field_unique_id ?>").closest(".simple-fields-metabox-field-file"); 
     1348                sfmff.find(".simple-fields-metabox-field-file-selected-image").html("<?php echo $image_html ?>").show(); 
     1349                sfmff.closest(".simple-fields-metabox-field").find(".simple-fields-metabox-field-file-selected-image-name").html(unescape("<?php echo $file_name?>")).show(); 
     1350                 
     1351                // show clear and edit-links 
     1352                //var url = ajaxurl.replace(/admin-ajax.php$/, "") + "media.php?attachment_id="+file_id+"&action=edit"; 
     1353                var url = "<?php echo admin_url("media.php?attachment_id={$file_id}&action=edit") ?>"; 
     1354     
     1355                sfmff.find(".simple-fields-metabox-field-file-edit").attr("href", url).show(); 
     1356                sfmff.find(".simple-fields-metabox-field-file-clear").show(); 
     1357                 
     1358                // close popup 
     1359                win.tb_remove(); 
     1360            </script> 
     1361            <?php 
     1362            exit; 
     1363        } else { 
     1364            return $html; 
     1365        } 
     1366     
     1367    } 
     1368     
     1369 
     1370    /** 
     1371     * if we have simple fields args in GET, make sure our simple fields-stuff are added to the form 
     1372     */ 
     1373    function media_upload_form_url($url) { 
     1374     
     1375        foreach ($_GET as $key => $val) { 
     1376            if (strpos($key, "simple_fields_") === 0) { 
     1377                $url = add_query_arg($key, $val, $url); 
     1378            } 
     1379        } 
     1380        return $url; 
     1381     
     1382    } 
     1383 
     1384 
     1385    /** 
     1386     * remove gallery and remote url tab in file select 
     1387     * also remove some 
     1388     */ 
     1389    function media_upload_tabs($arr_tabs) { 
     1390     
     1391        if ( (isset($_GET["simple_fields_action"]) || isset($_GET["simple_fields_action"]) ) && ($_GET["simple_fields_action"] == "select_file" || $_GET["simple_fields_action"] == "select_file_for_tiny") ) { 
     1392            unset($arr_tabs["gallery"], $arr_tabs["type_url"]); 
     1393        } 
     1394     
     1395        return $arr_tabs; 
     1396    } 
     1397     
     1398 
     1399     
     1400    /** 
     1401     * In file dialog: 
     1402     * Change "insert into post" to something better 
     1403     *  
     1404     * Code inspired by/gracefully stolen from 
     1405     * http://mondaybynoon.com/2010/10/12/attachments-1-5/#comment-27524 
     1406     */ 
     1407    function post_admin_init() { 
     1408        if (isset($_GET["simple_fields_action"]) && $_GET["simple_fields_action"] == "select_file") { 
     1409            add_filter('gettext', array($this, 'hijack_thickbox_text'), 1, 3); 
     1410        } 
     1411    } 
     1412     
     1413    function hijack_thickbox_text($translated_text, $source_text, $domain) { 
     1414        if (isset($_GET["simple_fields_action"]) && $_GET["simple_fields_action"] == "select_file") { 
     1415            if ('Insert into Post' == $source_text) { 
     1416                return __('Select', 'simple_fields' ); 
     1417            } 
     1418        } 
     1419        return $translated_text; 
     1420    } 
     1421 
     1422 
     1423    /** 
     1424     * Field type: post 
     1425     * Fetch content for field type post dialog via AJAX 
     1426     * Used for field type post 
     1427     * Called from ajax with action wp_ajax_simple_fields_field_type_post_dialog_load 
     1428     * Ajax defined in scripts.js -> $("a.simple-fields-metabox-field-post-select") 
     1429     */ 
     1430    function field_type_post_dialog_load() { 
     1431     
     1432        global $sf; 
     1433     
     1434        $arr_enabled_post_types = (array) $_POST["arr_enabled_post_types"]; 
     1435        $additional_arguments = isset($_POST["additional_arguments"]) ? $_POST["additional_arguments"] : ""; 
     1436        $existing_post_types = get_post_types(NULL, "objects"); 
     1437        $selected_post_type = (string) @$_POST["selected_post_type"]; 
     1438        ?> 
     1439     
     1440        <?php if (count($arr_enabled_post_types) > 1) { ?> 
     1441            <p>Show posts of type:</p> 
     1442            <ul class="simple-fields-meta-box-field-group-field-type-post-dialog-post-types"> 
     1443                <?php 
     1444                $loopnum = 0; 
     1445                foreach ($existing_post_types as $key => $val) { 
     1446                    if (!in_array($key, $arr_enabled_post_types)) { 
     1447                        continue; 
     1448                    } 
     1449                    if (empty($selected_post_type) && $loopnum == 0) { 
     1450                        $selected_post_type = $key; 
     1451                    } 
     1452                    $class = ""; 
     1453                    if ($selected_post_type == $key) { 
     1454                        $class = "selected"; 
     1455                    } 
     1456                    printf("\n<li class='%s'><a href='%s'>%s</a></li>", $class, "$key", $val->labels->name); 
     1457                    $loopnum++; 
     1458                } 
     1459            ?> 
     1460            </ul> 
     1461            <?php  
     1462        } else { 
     1463            $selected_post_type = $arr_enabled_post_types[0]; 
     1464            ?> 
     1465            <p>Showing posts of type: <a href="<?php echo $selected_post_type; ?>"><?php echo $existing_post_types[$selected_post_type]->labels->name; ?></a></p> 
     1466            <?php  
     1467        } ?> 
     1468         
     1469        <div class="simple-fields-meta-box-field-group-field-type-post-dialog-post-posts-wrap"> 
     1470            <ul class="simple-fields-meta-box-field-group-field-type-post-dialog-post-posts"> 
     1471                <?php 
     1472     
     1473                // get root items 
     1474                $args = array( 
     1475                    "echo" => 0, 
     1476                    "sort_order" => "ASC", 
     1477                    "sort_column" => "menu_order", 
     1478                    "post_type" => $selected_post_type, 
     1479                    "post_status" => "publish" 
     1480                ); 
     1481                 
     1482                $hierarchical = (bool) $existing_post_types[$selected_post_type]->hierarchical; 
     1483                if ($hierarchical) { 
     1484                    $args["parent"] = 0; 
     1485                    $args["post_parent"] = 0; 
     1486                } 
     1487                 
     1488                if (!empty($additional_arguments)) { 
     1489                    $args = wp_parse_args( $additional_arguments, $args ); 
     1490                } 
     1491             
     1492                $output = $this->get_pages($args); 
     1493                echo $output; 
     1494                ?> 
     1495            </ul> 
     1496        </div> 
     1497        <div class="submitbox"> 
     1498            <div class="simple-fields-postdialog-link-cancel"> 
     1499                <a href="#" class="submitdelete deletion">Cancel</a> 
     1500            </div> 
     1501        </div> 
     1502        <?php 
     1503             
     1504        exit; 
     1505    } 
     1506     
     1507    /** 
     1508     * Returns the output for a new or existing field with all it's options 
     1509     * Used in options screen / admin screen 
     1510     */ 
     1511    function field_group_add_field_template($fieldID, $field_group_in_edit = null) { 
     1512 
     1513        $fields = $field_group_in_edit["fields"]; 
     1514        // simple_fields::debug("field_grup_in_edit", $fields); 
     1515        $field_name = esc_html($fields[$fieldID]["name"]); 
     1516        $field_description = esc_html($fields[$fieldID]["description"]); 
     1517        $field_slug = esc_html(@$fields[$fieldID]["slug"]); 
     1518        $field_type = $fields[$fieldID]["type"]; 
     1519        $field_deleted = (int) $fields[$fieldID]["deleted"]; 
     1520 
     1521        // If this is a new field then set default type to text so user does not save field with no field type set 
     1522        if ($field_type === NULL) $field_type = "text"; 
     1523         
     1524        $field_type_textarea_option_use_html_editor = (int) @$fields[$fieldID]["type_textarea_options"]["use_html_editor"]; 
     1525        $field_type_checkbox_option_checked_by_default = (int) @$fields[$fieldID]["type_checkbox_options"]["checked_by_default"]; 
     1526        $field_type_radiobuttons_options = (array) @$fields[$fieldID]["type_radiobuttons_options"]; 
     1527        $field_type_dropdown_options = (array) @$fields[$fieldID]["type_dropdown_options"]; 
     1528     
     1529        $field_type_post_options = (array) @$fields[$fieldID]["type_post_options"]; 
     1530        $field_type_post_options["enabled_post_types"] = (array) @$field_type_post_options["enabled_post_types"]; 
     1531     
     1532        $field_type_taxonomy_options = (array) @$fields[$fieldID]["type_taxonomy_options"]; 
     1533        $field_type_taxonomy_options["enabled_taxonomies"] = (array) @$field_type_taxonomy_options["enabled_taxonomies"]; 
     1534     
     1535        $field_type_date_options = (array) @$fields[$fieldID]["type_date_options"]; 
     1536        $field_type_date_option_use_time = @$field_type_date_options["use_time"]; 
     1537     
     1538        $field_type_taxonomyterm_options = (array) @$fields[$fieldID]["type_taxonomyterm_options"]; 
     1539        $field_type_taxonomyterm_options["enabled_taxonomy"] = (string) @$field_type_taxonomyterm_options["enabled_taxonomy"]; 
     1540     
     1541        // Options saved for this field 
     1542        // Options is an array with key = field_type and value = array with options key => saved value 
     1543        $field_options = (array) @$fields[$fieldID]["options"]; 
     1544 
     1545        // Generate output for registred field types 
     1546        $registred_field_types_output = ""; 
     1547        $registred_field_types_output_options = ""; 
     1548        foreach ($this->registered_field_types as $one_field_type) { 
     1549 
     1550            // Output for field type selection dropdown 
     1551            $registred_field_types_output .= sprintf('<option %3$s value="%1$s">%2$s</option>',  
     1552                $one_field_type->key,  
     1553                $one_field_type->name,  
     1554                ($field_type == $one_field_type->key) ? " selected " : "" 
     1555            ); 
     1556 
     1557            $field_type_options = isset($field_options[$one_field_type->key]) && is_array($field_options[$one_field_type->key]) ? $field_options[$one_field_type->key] : array(); 
     1558            /* 
     1559            $field_type_options looks like this: 
     1560            Array 
     1561            ( 
     1562                [myTextOption] => No value entered yet 
     1563                [mapsTextarea] => Enter some cool text here please! 
     1564                [funkyDropdown] =>  
     1565            ) 
     1566            */ 
     1567             
     1568            // Generate common and unique classes for this field types options row 
     1569            $div_class  = "simple-fields-field-group-one-field-row "; 
     1570            $div_class .= "simple-fields-field-type-options "; 
     1571            $div_class .= "simple-fields-field-type-options-" . $one_field_type->key . " "; 
     1572            $div_class .= ($field_type == $one_field_type->key) ? "" : " hidden "; 
     1573             
     1574            // Generate and set the base for ids and names that the field will use for input-elements and similar 
     1575            $field_options_id   = "field_{$fieldID}_options_" . $one_field_type->key . ""; 
     1576            $field_options_name = "field[$fieldID][options][" . $one_field_type->key . "]"; 
     1577            $one_field_type->set_options_base_id($field_options_id); 
     1578            $one_field_type->set_options_base_name($field_options_name); 
     1579             
     1580            // Gather together the options output for this field type 
     1581            // Only output fieldset if field has options 
     1582            $field_options_output = $one_field_type->options_output($field_type_options); 
     1583            if ($field_options_output) { 
     1584                $field_options_output = " 
     1585                    <fieldset>  
     1586                        <legend>Options</legend> 
     1587                        $field_options_output 
     1588                    </fieldset> 
     1589                "; 
     1590                 
     1591            } 
     1592            $registred_field_types_output_options .= sprintf( 
     1593                ' 
     1594                    <div class="%1$s"> 
     1595                        %2$s 
     1596                    </div> 
     1597                ',  
     1598                $div_class,  
     1599                $field_options_output 
     1600            ); 
     1601 
     1602        } 
     1603         
     1604        $out = ""; 
     1605        $out .= " 
     1606        <li class='simple-fields-field-group-one-field simple-fields-field-group-one-field-id-{$fieldID}'> 
     1607            <div class='simple-fields-field-group-one-field-handle'></div> 
     1608     
     1609            <div class='simple-fields-field-group-one-field-row'> 
     1610                <label class='simple-fields-field-group-one-field-name-label'>".__('Name', 'simple-fields')."</label> 
     1611                <input type='text' class='regular-text simple-fields-field-group-one-field-name' name='field[{$fieldID}][name]' value='{$field_name}' /> 
     1612            </div> 
     1613             
     1614            <div class='simple-fields-field-group-one-field-row simple-fields-field-group-one-field-row-description'> 
     1615                <label>".__('Description', 'simple-fields')."</label> 
     1616                <input type='text' class='regular-text' name='field[{$fieldID}][description]' value='{$field_description}' /> 
     1617            </div> 
     1618             
     1619            <div class='simple-fields-field-group-one-field-row simple-fields-field-group-one-field-row-slug'> 
     1620                <label>".__('Slug', 'simple-fields')."</label> 
     1621                <input  
     1622                    type='text' class='regular-text'  
     1623                    name='field[{$fieldID}][slug]'  
     1624                    value='{$field_slug}'  
     1625                    pattern='".$this->get_slug_pattern()."' 
     1626                    title='".$this->get_slug_title()."' 
     1627                    required 
     1628                     />  
     1629                <br><span class='description'>" . __('A unique identifier used in your theme to get the saved values of this field.', 'simple-fields') . "</span> 
     1630            </div> 
     1631             
     1632            <div class='simple-fields-field-group-one-field-row'> 
     1633                <label>".__('Type', 'simple-fields')."</label> 
     1634                <!-- <br> --> 
     1635                <select name='field[{$fieldID}][type]' class='simple-fields-field-type'> 
     1636                    <option value=''>".__('Select', 'simple-fields')."...</option> 
     1637                    <option value='text'" . (($field_type=="text") ? " selected='selected' " : "") . ">".__('Text', 'simple-fields')."</option> 
     1638                    <option value='textarea'" . (($field_type=="textarea") ? " selected='selected' " : "") . ">".__('Textarea', 'simple-fields')."</option> 
     1639                    <option value='checkbox'" . (($field_type=="checkbox") ? " selected='selected' " : "") . ">".__('Checkbox', 'simple-fields')."</option> 
     1640                    <option value='radiobuttons'" . (($field_type=="radiobuttons") ? " selected='selected' " : "") . ">".__('Radio buttons', 'simple-fields')."</option> 
     1641                    <option value='dropdown'" . (($field_type=="dropdown") ? " selected='selected' " : "") . ">".__('Dropdown', 'simple-fields')."</option> 
     1642                    <option value='file'" . (($field_type=="file") ? " selected='selected' " : "") . ">".__('File', 'simple-fields')."</option> 
     1643                    <option value='post'" . (($field_type=="post") ? " selected='selected' " : "") . ">".__('Post', 'simple-fields')."</option> 
     1644                    <option value='taxonomy'" . (($field_type=="taxonomy") ? " selected='selected' " : "") . ">".__('Taxonomy', 'simple-fields')."</option> 
     1645                    <option value='taxonomyterm'" . (($field_type=="taxonomyterm") ? " selected='selected' " : "") . ">".__('Taxonomy Term', 'simple-fields')."</option> 
     1646                    <option value='color'" . (($field_type=="color") ? " selected='selected' " : "") . ">".__('Color', 'simple-fields')."</option> 
     1647                    <option value='date'" . (($field_type=="date") ? " selected='selected' " : "") . ">".__('Date', 'simple-fields')."</option> 
     1648                    <option value='user'" . (($field_type=="user") ? " selected='selected' " : "") . ">".__('User', 'simple-fields')."</option> 
     1649                    $registred_field_types_output 
     1650                </select> 
     1651     
     1652                <div class='simple-fields-field-group-one-field-row " . (($field_type=="text") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-text'> 
     1653                </div> 
     1654            </div> 
     1655     
     1656            $registred_field_types_output_options 
     1657 
     1658            <div class='simple-fields-field-group-one-field-row " . (($field_type=="textarea") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-textarea'> 
     1659                <input type='checkbox' name='field[{$fieldID}][type_textarea_options][use_html_editor]' " . (($field_type_textarea_option_use_html_editor) ? " checked='checked'" : "") . " value='1' /> ".__('Use HTML-editor', 'simple-fields')." 
     1660            </div> 
     1661            "; 
     1662             
     1663            // date 
     1664            $out .= "<div class='" . (($field_type=="date") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-date'>"; 
     1665            $out .= "<input type='checkbox' name='field[{$fieldID}][type_date_options][use_time]' " . (($field_type_date_option_use_time) ? " checked='checked'" : "") . " value='1' /> ".__('Also show time', 'simple-fields'); 
     1666            $out .= "</div>"; 
     1667         
     1668     
     1669            // connect post - select post types 
     1670            $out .= "<div class='" . (($field_type=="post") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-post'>"; 
     1671            $out .= "<div class='simple-fields-field-group-one-field-row'>"; 
     1672            $out .= sprintf("<label>%s</label>", __('Post types to select from', 'simple-fields')); 
     1673            //$out .= sprintf("<select name='%s'>", "field[$fieldID][type_post_options][post_type]"); 
     1674            //$out .= sprintf("<option %s value='%s'>%s</option>", (empty($field_type_post_options["post_type"]) ? " selected='selected' " : "") ,"", "Any"); 
     1675     
     1676            // list all post types in checkboxes 
     1677            $post_types = get_post_types(NULL, "objects"); 
     1678            $loopnum = 0; 
     1679            foreach ($post_types as $one_post_type) { 
     1680            // skip some built in types 
     1681            if (in_array($one_post_type->name, array("attachment", "revision", "nav_menu_item"))) { 
     1682                continue; 
     1683            } 
     1684            $input_name = "field[{$fieldID}][type_post_options][enabled_post_types][]"; 
     1685            $out .= sprintf("%s<input name='%s' type='checkbox' %s value='%s'> %s</input>",  
     1686                                ($loopnum>0 ? "<br>" : ""),  
     1687                                $input_name, 
     1688                                ((in_array($one_post_type->name, $field_type_post_options["enabled_post_types"])) ? " checked='checked' " : ""),  
     1689                                $one_post_type->name,  
     1690                                $one_post_type->labels->name . " ($one_post_type->name)" 
     1691                            ); 
     1692            $loopnum++; 
     1693        } 
     1694            $out .= "</div>"; 
     1695     
     1696            $out .= "<div class='simple-fields-field-group-one-field-row'>"; 
     1697            $out .= "<label>Additional arguments</label>"; 
     1698            $out .= sprintf("<input type='text' name='%s' value='%s' />", "field[$fieldID][type_post_options][additional_arguments]", @$field_type_post_options["additional_arguments"]); 
     1699            $out .= sprintf("<br><span class='description'>Here you can <a href='http://codex.wordpress.org/How_to_Pass_Tag_Parameters#Tags_with_query-string-style_parameters'>pass your own parameters</a> to <a href='http://codex.wordpress.org/Class_Reference/WP_Query'>WP_Query</a>.</span>"); 
     1700            $out .= "</div>"; 
     1701            $out .= "</div>"; // whole divs that shows/hides 
     1702     
     1703     
     1704            // connect taxonomy - select taxonomies 
     1705            $out .= "<div class='" . (($field_type=="taxonomy") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-taxonomy'>"; 
     1706            $out .= sprintf("<label>%s</label>", __('Taxonomies to show in dropdown', 'simple-fields')); 
     1707            $taxonomies = get_taxonomies(NULL, "objects"); 
     1708            $loopnum = 0; 
     1709            foreach ($taxonomies as $one_tax) { 
     1710            // skip some built in types 
     1711            if (in_array($one_tax->name, array("attachment", "revision", "nav_menu_item"))) { 
     1712                continue; 
     1713            } 
     1714            $input_name = "field[{$fieldID}][type_taxonomy_options][enabled_taxonomies][]"; 
     1715            $out .= sprintf("%s<input name='%s' type='checkbox' %s value='%s'> %s",  
     1716                                ($loopnum>0 ? "<br>" : ""),  
     1717                                $input_name,  
     1718                                ((in_array($one_tax->name, $field_type_taxonomy_options["enabled_taxonomies"])) ? " checked='checked' " : ""),  
     1719                                $one_tax->name,  
     1720                                $one_tax->labels->name . " ($one_tax->name)" 
     1721                            ); 
     1722            $loopnum++; 
     1723        } 
     1724            $out .= "</div>"; 
     1725     
     1726            // taxonomyterm - select taxonomies, like above 
     1727            $out .= "<div class='" . (($field_type=="taxonomyterm") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-taxonomyterm'>"; 
     1728            $out .= "<div class='simple-fields-field-group-one-field-row'>"; 
     1729            $out .= sprintf("<label>%s</label>", __('Taxonomy to select terms from', 'simple-fields')); 
     1730            $taxonomies = get_taxonomies(NULL, "objects"); 
     1731            $loopnum = 0; 
     1732            foreach ($taxonomies as $one_tax) { 
     1733            // skip some built in types 
     1734            if (in_array($one_tax->name, array("attachment", "revision", "nav_menu_item"))) { 
     1735                continue; 
     1736            } 
     1737            $input_name = "field[{$fieldID}][type_taxonomyterm_options][enabled_taxonomy]"; 
     1738            $out .= sprintf("%s<input name='%s' type='radio' %s value='%s'> %s",  
     1739                                ($loopnum>0 ? "<br>" : ""),  
     1740                                $input_name,  
     1741                                ($one_tax->name == $field_type_taxonomyterm_options["enabled_taxonomy"]) ? " checked='checked' " : "",  
     1742                                $one_tax->name,  
     1743                                $one_tax->labels->name . " ($one_tax->name)" 
     1744                            ); 
     1745            $loopnum++; 
     1746        } 
     1747            $out .= "</div>"; 
     1748             
     1749            $out .= "<div class='simple-fields-field-group-one-field-row'>"; 
     1750            $out .= "<label>Additional arguments</label>"; 
     1751            $out .= sprintf("<input type='text' name='%s' value='%s' />", "field[$fieldID][type_taxonomyterm_options][additional_arguments]", @$field_type_taxonomyterm_options["additional_arguments"]); 
     1752            $out .= sprintf("<br><span class='description'>Here you can <a href='http://codex.wordpress.org/How_to_Pass_Tag_Parameters#Tags_with_query-string-style_parameters'>pass your own parameters</a> to <a href='http://codex.wordpress.org/Function_Reference/get_terms#Parameters'>get_terms()</a>.</span>"); 
     1753            $out .= "</div>"; 
     1754             
     1755            $out .= "</div>"; 
     1756     
     1757            // radiobuttons 
     1758            $radio_buttons_added = ""; 
     1759            $radio_buttons_highest_id = 0; 
     1760            if ($field_type_radiobuttons_options) { 
     1761            foreach ($field_type_radiobuttons_options as $key => $val) { 
     1762                if (strpos($key, "radiobutton_num_") !== false && $val["deleted"] != true) { 
     1763                    // found one button in format radiobutton_num_0 
     1764                    $radiobutton_num = str_replace("radiobutton_num_", "", $key); 
     1765                    if ($radiobutton_num > $radio_buttons_highest_id) { 
     1766                        $radio_buttons_highest_id = $radiobutton_num; 
     1767                    } 
     1768                    $radiobutton_val = esc_html($val["value"]); 
     1769                    $checked = ($key == @$field_type_radiobuttons_options["checked_by_default_num"]) ? " checked='checked' " : ""; 
     1770                    $radio_buttons_added .= " 
     1771                        <li> 
     1772                            <div class='simple-fields-field-type-options-radiobutton-handle'></div> 
     1773                            <input class='regular-text' value='$radiobutton_val' name='field[$fieldID][type_radiobuttons_options][radiobutton_num_{$radiobutton_num}][value]' type='text' /> 
     1774                            <input class='simple-fields-field-type-options-radiobutton-checked-by-default-values' type='radio' name='field[$fieldID][type_radiobuttons_options][checked_by_default_num]' value='radiobutton_num_{$radiobutton_num}' {$checked} /> 
     1775                            <input class='simple-fields-field-type-options-radiobutton-deleted' name='field[$fieldID][type_radiobuttons_options][radiobutton_num_{$radiobutton_num}][deleted]' type='hidden' value='0' /> 
     1776                            <a href='#' class='simple-fields-field-type-options-radiobutton-delete'>Delete</a> 
     1777                        </li>"; 
     1778                } 
     1779            } 
     1780        } 
     1781            $radio_buttons_highest_id++; 
     1782            $out .= " 
     1783                <div class='" . (($field_type=="radiobuttons") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-radiobuttons'> 
     1784                    <div>Added radio buttons</div> 
     1785                    <div class='simple-fields-field-type-options-radiobutton-checked-by-default'>".__('Default', 'simple-fields')."</div> 
     1786                    <ul class='simple-fields-field-type-options-radiobutton-values-added'> 
     1787                        $radio_buttons_added 
     1788                    </ul> 
     1789                    <div><a class='simple-fields-field-type-options-radiobutton-values-add' href='#'>+ ".__('Add radio button', 'simple-fields')."</a></div> 
     1790                    <input type='hidden' name='' class='simple-fields-field-group-one-field-radiobuttons-highest-id' value='{$radio_buttons_highest_id}' /> 
     1791                </div> 
     1792            "; 
     1793            // end radiobuttons 
     1794     
     1795            // checkbox 
     1796            $out .= " 
     1797            <div class='simple-fields-field-group-one-field-row " . (($field_type=="checkbox") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-checkbox'> 
     1798                <input type='checkbox' name='field[{$fieldID}][type_checkbox_options][checked_by_default]' " . (($field_type_checkbox_option_checked_by_default) ? " checked='checked'" : "") . " value='1' /> ".__('Checked by default', 'simple-fields')." 
     1799            </div> 
     1800            "; 
     1801            // end checkbox 
     1802     
     1803            // start dropdown 
     1804            $dropdown_values_added = ""; 
     1805            $dropdown_values_highest_id = 0; 
     1806            if ($field_type_dropdown_options) { 
     1807            foreach ($field_type_dropdown_options as $key => $val) { 
     1808                if (strpos($key, "dropdown_num_") !== false && $val["deleted"] != true) { 
     1809                    // found one button in format radiobutton_num_0 
     1810                    $dropdown_num = str_replace("dropdown_num_", "", $key); 
     1811                    if ($dropdown_num > $dropdown_values_highest_id) { 
     1812                        $dropdown_values_highest_id = $dropdown_num; 
     1813                    } 
     1814                    $dropdown_val = esc_html($val["value"]); 
     1815                    $dropdown_values_added .= " 
     1816                        <li> 
     1817                            <div class='simple-fields-field-type-options-dropdown-handle'></div> 
     1818                            <input class='regular-text' value='$dropdown_val' name='field[$fieldID][type_dropdown_options][dropdown_num_{$dropdown_num}][value]' type='text' /> 
     1819                            <input class='simple-fields-field-type-options-dropdown-deleted' name='field[$fieldID][type_dropdown_options][dropdown_num_{$dropdown_num}][deleted]' type='hidden' value='0' /> 
     1820                            <a href='#' class='simple-fields-field-type-options-dropdown-delete'>".__('Delete', 'simple-fields')."</a> 
     1821                        </li>"; 
     1822                } 
     1823            } 
     1824        } 
     1825            $dropdown_values_highest_id++; 
     1826            $out .= " 
     1827                <div class='" . (($field_type=="dropdown") ? "" : " hidden ") . " simple-fields-field-type-options simple-fields-field-type-options-dropdown'> 
     1828                    <div>".__('Added dropdown values', 'simple-fields')."</div> 
     1829                    <ul class='simple-fields-field-type-options-dropdown-values-added'> 
     1830                        $dropdown_values_added 
     1831                    </ul> 
     1832                    <div><a class='simple-fields-field-type-options-dropdown-values-add' href='#'>+ ".__('Add dropdown value', 'simple-fields')."</a></div> 
     1833                    <input type='hidden' name='' class='simple-fields-field-group-one-field-dropdown-highest-id' value='{$dropdown_values_highest_id}' /> 
     1834                </div> 
     1835            "; 
     1836            // end dropdown 
     1837     
     1838     
     1839            $out .= " 
     1840            <div class='delete'> 
     1841                <a href='#'>".__('Delete field', 'simple-fields')."</a> 
     1842            </div> 
     1843            <input type='hidden' name='field[{$fieldID}][id]' class='simple-fields-field-group-one-field-id' value='{$fieldID}' /> 
     1844            <input type='hidden' name='field[{$fieldID}][deleted]' value='{$field_deleted}' class='hidden_deleted' /> 
     1845     
     1846        </li>"; 
     1847        return $out; 
     1848     
     1849    } // /simple_fields_field_group_add_field_template 
     1850 
     1851    /** 
     1852     * Called from AJAX call to add a field group to the post in edit 
     1853     */ 
     1854    function field_group_add_field() { 
     1855        global $sf; 
     1856        $simple_fields_highest_field_id = (int) $_POST["simple_fields_highest_field_id"]; 
     1857        echo $this->field_group_add_field_template($simple_fields_highest_field_id); 
     1858        exit; 
     1859    } 
     1860 
     1861 
     1862    /** 
     1863     * Output all stuff for the options page 
     1864     * Should be modularized a bit, it's way to long/big right now 
     1865     */ 
     1866    function options_page() { 
     1867     
     1868        global $sf; 
     1869     
     1870        $field_groups = $this->get_field_groups(); 
     1871        $post_connectors = $this->get_post_connectors(); 
     1872 
     1873        // for debug purposes, here we can reset the option 
     1874        #$field_groups = array(); update_option("simple_fields_groups", $field_groups); 
     1875        #$post_connectors = array(); update_option("simple_fields_post_connectors", $post_connectors); 
     1876     
     1877        // sort them by name 
     1878        function simple_fields_uasort($a, $b) { 
     1879            if ($a["name"] == $b["name"]) { return 0; } 
     1880            return strcasecmp($a["name"], $b["name"]); 
     1881        } 
     1882         
     1883        uasort($field_groups, "simple_fields_uasort"); 
     1884        uasort($post_connectors, "simple_fields_uasort"); 
     1885             
     1886        ?> 
     1887        <div class="wrap"> 
     1888     
     1889            <h2><?php echo SIMPLE_FIELDS_NAME ?></h2> 
     1890     
     1891            <div class="clear"></div> 
     1892     
     1893            <div class="simple-fields-bonny-plugins-inner-sidebar"> 
     1894                <h3>Keep this plugin alive</h3> 
     1895                <p> 
     1896                    I develop this plugin mostly on my spare time. Please consider <a href="http://eskapism.se/sida/donate/">donating</a> 
     1897                    or <a href="https://flattr.com/thing/116510/Simple-Fields">Flattr</a> 
     1898                    to keep the development going. 
     1899                </p> 
     1900     
     1901                <h3>Support</h3> 
     1902                <p>If you have any problems with this plugins please check out the <a href="http://wordpress.org/tags/simple-fields?forum_id=10">support forum</a>.</p> 
     1903                <p>You can <a href="https://github.com/bonny/WordPress-Simple-Fields">follow the development of this plugin at GitHub</a>.</p> 
     1904                                         
     1905            </div> 
     1906     
     1907        <div class="simple-fields-settings-wrap"> 
     1908     
     1909            <?php 
     1910             
     1911            $action = (isset($_GET["action"])) ? $_GET["action"] : null; 
     1912 
     1913            /** 
     1914             * save post type defaults 
     1915             */ 
     1916            if ("edit-post-type-defaults-save" == $action) { 
     1917     
     1918                $post_type = $_POST["simple_fields_save-post_type"]; 
     1919                $post_type_connector = $_POST["simple_fields_save-post_type_connector"]; 
     1920                             
     1921                simple_fields_register_post_type_default($post_type_connector, $post_type); 
     1922                 
     1923                $simple_fields_did_save_post_type_defaults = true; 
     1924                $action = ""; 
     1925     
     1926            } 
     1927     
     1928            /** 
     1929             * edit post type defaults 
     1930             */ 
     1931            if ("edit-post-type-defaults" == $action) { 
     1932                $post_type = $_GET["post-type"]; 
     1933                global $wp_post_types; 
     1934                if (isset($wp_post_types[$post_type])) { 
     1935                    $selected_post_type = $wp_post_types[$post_type]; 
     1936                    ?> 
     1937                    <h3><?php echo __( sprintf('Edit default post connector for post type %1$s', $selected_post_type->label), "simple-fields" ) ?></h3> 
     1938                     
     1939                    <form action="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=edit-post-type-defaults-save" method="post"> 
     1940                        <table class="form-table"> 
     1941                            <tr> 
     1942                                <th><?php _e('Default post connector', 'simple-fields') ?></th> 
     1943                                <td> 
     1944                                    <?php 
     1945                                    $arr_post_connectors = $this->get_post_connectors_for_post_type($post_type); 
     1946                                    if ($arr_post_connectors) { 
     1947                                        $selected_post_type_default = $this->get_default_connector_for_post_type($post_type); 
     1948                                        ?> 
     1949                                        <select name="simple_fields_save-post_type_connector"> 
     1950                                            <option <?php echo ($selected_post_type_default==="__none__") ? " selected='selected' " : "" ?> value="__none__"><?php _e('No post connector', 'simple-fields') ?></option> 
     1951                                            <option <?php echo ($selected_post_type_default==="__inherit__") ? " selected='selected' " : "" ?> value="__inherit__"><?php _e('Inherit from parent post', 'simple-fields') ?></option> 
     1952                                            <?php 
     1953                                            foreach ($arr_post_connectors as $one_post_connector) { 
     1954                                                echo "<option " . ((intval($selected_post_type_default)==intval($one_post_connector["id"])) ? " selected='selected' " : "") . "value='{$one_post_connector["id"]}'>" . $one_post_connector["name"] . "</option>"; 
     1955                                            } 
     1956                                            ?> 
     1957                                        </select> 
     1958                                        <?php 
     1959                                    } else { 
     1960                                        ?><p><?php _e('There are no post connectors for this post type.', 'simple-fields') ?></p><?php 
     1961                                    } 
     1962                                    ?> 
     1963                                </td> 
     1964                            </tr> 
     1965                        </table> 
     1966                        <p class="submit"> 
     1967                            <input class="button-primary" type="submit" value="<?php _e("Save changes", "simple-fields") ?>" /> 
     1968                            <input type="hidden" name="simple_fields_save-post_type" value="<?php echo $post_type ?>" /> 
     1969                            <?php _e('or', 'simple_fields');  ?> 
     1970                            <a href="<?php echo SIMPLE_FIELDS_FILE ?>"><?php _e('cancel', 'simple-fields') ?></a> 
     1971                        </p> 
     1972                    </form> 
     1973                    <?php 
     1974                     
     1975                } 
     1976            } 
     1977     
     1978            /** 
     1979             * Delete a field group 
     1980             */ 
     1981            if ("delete-field-group" == $action) { 
     1982                $field_group_id = (int) $_GET["group-id"]; 
     1983                $field_groups[$field_group_id]["deleted"] = true; 
     1984                update_option("simple_fields_groups", $field_groups); 
     1985                $simple_fields_did_delete = true; 
     1986                $action = ""; 
     1987            } 
     1988     
     1989     
     1990            /** 
     1991             * Delete a post connector 
     1992             */ 
     1993            if ("delete-post-connector" == $action) { 
     1994                $post_connector_id = (int) $_GET["connector-id"]; 
     1995                $post_connectors[$post_connector_id]["deleted"] = 1; 
     1996                update_option("simple_fields_post_connectors", $post_connectors); 
     1997                $simple_fields_did_delete_post_connector = true; 
     1998                $action = ""; 
     1999            } 
     2000             
     2001             
     2002            /** 
     2003             * save a field group 
     2004             * including fields 
     2005             */ 
     2006            if ("edit-field-group-save" == $action) { 
     2007             
     2008                if ($_POST) { 
     2009#sf_d($_POST); 
     2010                    $field_group_id                               = (int) $_POST["field_group_id"]; 
     2011                    $field_groups[$field_group_id]["name"]        = stripslashes($_POST["field_group_name"]); 
     2012                    $field_groups[$field_group_id]["description"] = stripslashes($_POST["field_group_description"]); 
     2013                    $field_groups[$field_group_id]["slug"]        = stripslashes($_POST["field_group_slug"]); 
     2014                    $field_groups[$field_group_id]["repeatable"]  = (bool) (isset($_POST["field_group_repeatable"]));                    
     2015                    $field_groups[$field_group_id]["fields"]      = (array) stripslashes_deep($_POST["field"]); 
     2016 
     2017                    // Since 0.6 we really want all things to have slugs, so add one if it's not set 
     2018                    if (empty($field_groups[$field_group_id]["slug"])) { 
     2019                        $field_groups[$field_group_id]["slug"] = "field_group_" . $field_group_id; 
     2020                    } 
     2021                     
     2022                    /* 
     2023                    if just one empty array like this, unset first elm 
     2024                    happens if no fields have been added (now why would you do such an evil thing?!) 
     2025                    */ 
     2026                    if (sizeof($field_groups[$field_group_id]["fields"]) == 1 && empty($field_groups[$field_group_id]["fields"][0])) { 
     2027                        unset($field_groups[$field_group_id]["fields"][0]); 
     2028                    } 
     2029                     
     2030                    update_option("simple_fields_groups", $field_groups); 
     2031 
     2032                    // we can have changed the options of a field group, so update connectors using this field group 
     2033                    $post_connectors = (array) $this->get_post_connectors(); 
     2034                    foreach ($post_connectors as $connector_id => $connector_options) { 
     2035                        if (isset($connector_options["field_groups"][$field_group_id])) { 
     2036                            // field group existed, update name 
     2037                            $post_connectors[$connector_id]["field_groups"][$field_group_id]["name"] = stripslashes($_POST["field_group_name"]); 
     2038                        } 
     2039                    } 
     2040                    update_option("simple_fields_post_connectors", $post_connectors); 
     2041                     
     2042                    $simple_fields_did_save = true; 
     2043                } 
     2044                $action = ""; 
     2045                         
     2046            } 
     2047     
     2048            /** 
     2049             * save a post connector 
     2050             */ 
     2051            if ("edit-post-connector-save" == $action) { 
     2052                if ($_POST) { 
     2053                                         
     2054                    $connector_id = (int) $_POST["post_connector_id"]; 
     2055                    $post_connectors[$connector_id]["name"] = (string) stripslashes($_POST["post_connector_name"]); 
     2056                    $post_connectors[$connector_id]["slug"] = (string) ($_POST["post_connector_slug"]); 
     2057                    $post_connectors[$connector_id]["field_groups"] = (array) $_POST["added_fields"]; 
     2058                    $post_connectors[$connector_id]["post_types"] = (array) @$_POST["post_types"]; 
     2059                    $post_connectors[$connector_id]["hide_editor"] = (bool) @$_POST["hide_editor"]; 
     2060     
     2061                    // a post type can only have one default connector, so make sure only the connector 
     2062                    // that we are saving now has it; remove it from all others; 
     2063                    /* 
     2064                    $post_types_type_default = (array) $_POST["post_types_type_default"]; 
     2065                    foreach ($post_types_type_default as $one_default_post_type) { 
     2066                        foreach ($post_connectors as $one_post_connector) { 
     2067                            if (in_array($one_default_post_type, $one_post_connector["post_types_type_default"])) { 
     2068                                $array_key = array_search($one_default_post_type, $one_post_connector["post_types_type_default"]); 
     2069                                if ($array_key !== false) { 
     2070                                    unset($post_connectors[$one_post_connector["id"]]["post_types_type_default"][$array_key]); 
     2071                                } 
     2072                            } 
     2073                        } 
     2074                    } 
     2075                    $post_connectors[$connector_id]["post_types_type_default"] = $post_types_type_default; 
     2076                    */ 
     2077                     
     2078                    // for some reason I got an empty connector (array key was empty) so check for these and remove 
     2079                    $post_connectors_tmp = array(); 
     2080                    foreach ($post_connectors as $key => $one_connector) { 
     2081                        if (!empty($one_connector)) { 
     2082                            $post_connectors_tmp[$key] = $one_connector; 
     2083                        } 
     2084                    } 
     2085                    $post_connectors = $post_connectors_tmp; 
     2086     
     2087                    update_option("simple_fields_post_connectors", $post_connectors); 
     2088     
     2089                    $simple_fields_did_save_connector = true; 
     2090                } 
     2091                $action = ""; 
     2092            } 
     2093     
     2094             
     2095            /** 
     2096             * edit new or existing post connector 
     2097             * If new then connector-id = 0 
     2098             */ 
     2099            if ("edit-post-connector" == $action) { 
     2100     
     2101                $connector_id = (isset($_GET["connector-id"])) ? intval($_GET["connector-id"]) : false; 
     2102                $highest_connector_id = 0; 
     2103     
     2104                // if new, save it as unnamed, and then set to edit that 
     2105                if ($connector_id === 0) { 
     2106     
     2107                    // is new connector 
     2108                    $post_connector_in_edit = simple_fields_register_post_connector(); 
     2109     
     2110                } else { 
     2111     
     2112                    // existing post connector 
     2113                     
     2114                    // set a default value for hide_editor if it does not exist. did not exist until 0.5 
     2115                    $post_connectors[$connector_id]["hide_editor"] = (bool) @$post_connectors[$connector_id]["hide_editor"]; 
     2116                     
     2117                    $post_connector_in_edit = $post_connectors[$connector_id]; 
     2118                } 
     2119     
     2120                ?> 
     2121                <h3><?php _e('Post Connector details', 'simple-fields') ?></h3> 
     2122     
     2123                <form method="post" action="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=edit-post-connector-save"> 
     2124     
     2125                    <table class="form-table"> 
     2126 
     2127                        <tr> 
     2128                            <th><label><?php _e('Name', 'simple-fields') ?></label></th> 
     2129                            <td><input type="text" id="post_connector_name" name="post_connector_name" class="regular-text" value="<?php echo esc_html($post_connector_in_edit["name"]) ?>" /></td> 
     2130                        </tr> 
     2131 
     2132                        <tr> 
     2133                            <th> 
     2134                                <label for="post_connector_slug"><?php _e('Slug', 'simple-fields') ?></label> 
     2135                            </th> 
     2136                            <td> 
     2137                                <input  type="text" name="post_connector_slug" id="post_connector_slug" class="regular-text"  
     2138                                        value="<?php echo esc_html(@$post_connector_in_edit["slug"]) ?>" 
     2139                                        pattern='<?php echo $this->get_slug_pattern() ?>' 
     2140                                        title='<?php echo $this->get_slug_title() ?>' 
     2141                                        required 
     2142                                         /> 
     2143                                 <br> 
     2144                                 <span class="description"><?php echo __("A unique identifier for this connector", 'simple-fields') ?></span> 
     2145                                 <?php 
     2146                                 // sf_d($post_connector_in_edit); 
     2147                                 ?> 
     2148                            </td> 
     2149                        </tr> 
     2150 
     2151                        <tr> 
     2152                            <th><?php _e('Field Groups', 'simple-fields') ?></th> 
     2153                            <td> 
     2154                                <p> 
     2155                                    <select id="simple-fields-post-connector-add-fields"> 
     2156                                        <option value=""><?php _e('Add field group...', 'simple-fields') ?></option> 
     2157                                        <?php 
     2158                                        foreach ($field_groups as $one_field_group) { 
     2159                                            if ($one_field_group["deleted"]) { continue; } 
     2160                                            ?><option value='<?php echo $one_field_group["id"] ?>'><?php echo esc_html($one_field_group["name"]) ?></option><?php 
     2161                                        } 
     2162                                        ?> 
     2163                                    </select> 
     2164                                </p> 
     2165                                <ul id="simple-fields-post-connector-added-fields"> 
     2166                                    <?php 
     2167                                    foreach ($post_connector_in_edit["field_groups"] as $one_post_connector_added_field) { 
     2168                                        if ($one_post_connector_added_field["deleted"]) { continue; } 
     2169                                         
     2170                                        #d($one_post_connector_added_field); 
     2171                                         
     2172                                        ?> 
     2173                                        <li> 
     2174                                            <div class='simple-fields-post-connector-addded-fields-handle'></div> 
     2175                                            <div class='simple-fields-post-connector-addded-fields-field-name'><?php echo $one_post_connector_added_field["name"] ?></div> 
     2176                                            <input type='hidden' name='added_fields[<?php echo $one_post_connector_added_field["id"] ?>][id]' value='<?php echo $one_post_connector_added_field["id"] ?>' /> 
     2177                                            <input type='hidden' name='added_fields[<?php echo $one_post_connector_added_field["id"] ?>][name]' value='<?php echo $one_post_connector_added_field["name"] ?>' /> 
     2178                                            <input type='hidden' name='added_fields[<?php echo $one_post_connector_added_field["id"] ?>][deleted]' value='0' class="simple-fields-post-connector-added-field-deleted" /> 
     2179                                            <div class="simple-fields-post-connector-addded-fields-options"> 
     2180                                                <?php _e('Context', 'simple-fields') ?> 
     2181                                                <select name='added_fields[<?php echo $one_post_connector_added_field["id"] ?>][context]' class="simple-fields-post-connector-addded-fields-option-context"> 
     2182                                                    <option <?php echo ("normal" == $one_post_connector_added_field["context"]) ? " selected='selected' " : "" ?> value="normal"><?php _e('normal') ?></option> 
     2183                                                    <option <?php echo ("advanced" == $one_post_connector_added_field["context"]) ? " selected='selected' " : "" ?> value="advanced"><?php _e('advanced') ?></option> 
     2184                                                    <option <?php echo ("side" == $one_post_connector_added_field["context"]) ? " selected='selected' " : "" ?> value="side"><?php _e('side') ?></option> 
     2185                                                </select> 
     2186                                                 
     2187                                                <?php _e('Priority', 'simple-fields') ?> 
     2188                                                <select name='added_fields[<?php echo $one_post_connector_added_field["id"] ?>][priority]' class="simple-fields-post-connector-addded-fields-option-priority"> 
     2189                                                    <option <?php echo ("low" == $one_post_connector_added_field["priority"]) ? " selected='selected' " : "" ?> value="low"><?php _e('low') ?></option> 
     2190                                                    <option <?php echo ("high" == $one_post_connector_added_field["priority"]) ? " selected='selected' " : "" ?> value="high"><?php _e('high') ?></option> 
     2191                                                </select> 
     2192                                            </div> 
     2193                                            <a href='#' class='simple-fields-post-connector-addded-fields-delete'><?php _e('Delete', 'simple-fields') ?></a> 
     2194                                        </li> 
     2195                                        <?php 
     2196                                    } 
     2197                                    ?> 
     2198                                </ul> 
     2199                            </td> 
     2200                        </tr> 
     2201                         
     2202                        <tr> 
     2203                            <th><?php _e('Options', 'simple-fields') ?></th> 
     2204                            <td><input 
     2205                                 type="checkbox"  
     2206                                 <?php echo $post_connector_in_edit["hide_editor"] == TRUE ? " checked='checked' " : "" ?> 
     2207                                 name="hide_editor"  
     2208                                 class=""  
     2209                                 value="1" /> 
     2210                                 <?php _e('Hide the built in editor', 'simple-fields') ?> 
     2211                            </td> 
     2212                        </tr> 
     2213                         
     2214                        <tr> 
     2215                            <th> 
     2216                                <?php _e('Available for post types', 'simple-fields') ?> 
     2217                            </th> 
     2218                            <td> 
     2219                                <table> 
     2220                                    <?php 
     2221                                    global $wp_post_types; 
     2222                                    $arr_post_types_to_ignore = array("attachment", "revision", "nav_menu_item"); 
     2223                                    foreach ($wp_post_types as $one_post_type) { 
     2224                                        if (!in_array($one_post_type->name, $arr_post_types_to_ignore)) { 
     2225                                            ?> 
     2226                                            <tr> 
     2227                                                <td> 
     2228                                                    <input <?php echo (in_array($one_post_type->name, $post_connector_in_edit["post_types"]) ? " checked='checked' " : ""); ?> type="checkbox" name="post_types[]" value="<?php echo $one_post_type->name ?>" /> 
     2229                                                    <?php echo $one_post_type->name ?> 
     2230                                                </td> 
     2231                                                <?php 
     2232                                                /* 
     2233                                                <!-- <td> 
     2234                                                    <input <?php echo (in_array($one_post_type->name, $post_connector_in_edit["post_types_type_default"]) ? " checked='checked' " : "") ?> type="checkbox" name="post_types_type_default[]" value="<?php echo $one_post_type->name ?>" /> 
     2235                                                    Default connector for post type <?php echo $one_post_type->name ?> 
     2236                                                </td> --> 
     2237                                                */ 
     2238                                            ?> 
     2239                                            </tr> 
     2240                                            <?php 
     2241                                        } 
     2242                                    } 
     2243                                    ?> 
     2244                                </table> 
     2245                            </td> 
     2246                        </tr> 
     2247     
     2248                    </table> 
     2249                    <p class="submit"> 
     2250                        <input class="button-primary" type="submit" value="<?php _e('Save Changes', 'simple-fields') ?>" /> 
     2251                        <input type="hidden" name="action" value="update" /> 
     2252                        <!-- <input type="hidden" name="page_options" value="field_group_name" /> --> 
     2253                        <input type="hidden" name="post_connector_id" value="<?php echo $post_connector_in_edit["id"] ?>" /> 
     2254                        or  
     2255                        <a href="<?php echo SIMPLE_FIELDS_FILE ?>"><?php _e('cancel', 'simple-fields') ?></a> 
     2256                    </p> 
     2257                    <p class="simple-fields-post-connector-delete"> 
     2258                        <a href="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=delete-post-connector&amp;connector-id=<?php echo $post_connector_in_edit["id"] ?>"><?php _e('Delete') ?></a> 
     2259                    </p> 
     2260     
     2261                </form> 
     2262                <?php 
     2263            } 
     2264     
     2265         
     2266            /** 
     2267             * Edit new or existing Field Group 
     2268             */ 
     2269            if ("edit-field-group" == $action) { 
     2270                 
     2271                $field_group_id = (isset($_GET["group-id"])) ? intval($_GET["group-id"]) : false; 
     2272                 
     2273                $highest_field_id = 0; 
     2274 
     2275                // check if field group is new or existing 
     2276                if ($field_group_id === 0) { 
     2277 
     2278                    // new: save it as unnamed, and then set to edit that 
     2279                    $field_group_in_edit = simple_fields_register_field_group(); 
     2280 
     2281                    simple_fields::debug("Added new field group", $field_group_in_edit); 
     2282     
     2283                } else { 
     2284 
     2285                    // existing: get highest field id 
     2286                    foreach ($field_groups[$field_group_id]["fields"] as $one_field) { 
     2287                        if ($one_field["id"] > $highest_field_id) { 
     2288                            $highest_field_id = $one_field["id"]; 
     2289                        } 
     2290                    } 
     2291     
     2292                    $field_group_in_edit = $field_groups[$field_group_id]; 
     2293 
     2294                } 
     2295 
     2296                ?> 
     2297                <form method="post" action="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=edit-field-group-save"> 
     2298                    <h3><?php _e('Field group details', 'simple-fields') ?></h3> 
     2299                    <table class="form-table"> 
     2300                        <tr> 
     2301                            <th> 
     2302                                <label for="field_group_name"><?php _e('Name', 'simple-fields') ?></label> 
     2303                            </th> 
     2304                            <td> 
     2305                                <input type="text" name="field_group_name" id="field_group_name" class="regular-text" value="<?php echo esc_html($field_group_in_edit["name"]) ?>" required /> 
     2306                            </td> 
     2307                        </tr> 
     2308                        <tr> 
     2309                            <th> 
     2310                                <label for="field_group_description"><?php _e('Description', 'simple-fields') ?></label> 
     2311                            </th> 
     2312                            <td> 
     2313                                <input  type="text" name="field_group_description" id="field_group_description" class="regular-text"  
     2314                                        value="<?php echo esc_html(@$field_group_in_edit["description"]) ?>" 
     2315                                         /> 
     2316                            </td> 
     2317                        </th> 
     2318 
     2319                        <tr> 
     2320                            <th> 
     2321                                <label for="field_group_slug"><?php _e('Slug', 'simple-fields') ?></label> 
     2322                            </th> 
     2323                            <td> 
     2324                                <input  type="text" name="field_group_slug" id="field_group_slug" class="regular-text"  
     2325                                        value="<?php echo esc_html(@$field_group_in_edit["slug"]) ?>" 
     2326                                        pattern='<?php echo $this->get_slug_pattern() ?>' 
     2327                                        title='<?php echo $this->get_slug_title() ?>' 
     2328                                        required 
     2329                                        title="<?php _e("Allowed chars: a-z and underscore.", 'simple-fields') ?>" 
     2330                                         /> 
     2331                                 <br> 
     2332                                 <span class="description"><?php echo __("A unique identifier for this field group.", 'simple-fields') ?></span> 
     2333                            </td> 
     2334                        </tr> 
     2335 
     2336                        <tr> 
     2337                            <th> 
     2338                                <?php echo __("Options", 'simple-fields') ?> 
     2339                            </th> 
     2340                            <td> 
     2341                                <label for="field_group_repeatable"> 
     2342                                    <input type="checkbox" <?php echo ($field_group_in_edit["repeatable"] == true) ? "checked='checked'" : ""; ?> value="1" id="field_group_repeatable" name="field_group_repeatable" /> 
     2343                                    <?php _e('Repeatable', 'simple-fields') ?> 
     2344                                </label>                                 
     2345                            </td> 
     2346                        </tr> 
     2347                        <tr> 
     2348                            <th><?php _e('Fields', 'simple-fields') ?></th> 
     2349                            <td> 
     2350                                <div id="simple-fields-field-group-existing-fields"> 
     2351                                    <ul class='simple-fields-edit-field-groups-added-fields'> 
     2352                                        <?php 
     2353                                        foreach ($field_group_in_edit["fields"] as $oneField) { 
     2354                                            if (!$oneField["deleted"]) { 
     2355                                                echo $this->field_group_add_field_template($oneField["id"], $field_group_in_edit); 
     2356                                            } 
     2357                                        } 
     2358                                        ?> 
     2359                                    </ul> 
     2360                                </div> 
     2361                                <p><a href="#" id="simple-fields-field-group-add-field">+ <?php _e('Add field', 'simple-fields') ?></a></p> 
     2362                            </td> 
     2363                        </tr>            
     2364                    </table> 
     2365     
     2366                    <p class="submit"> 
     2367                        <input class="button-primary" type="submit" value="<?php _e('Save Changes', 'simple-fields') ?>" /> 
     2368                        <input type="hidden" name="action" value="update" /> 
     2369                        <input type="hidden" name="page_options" value="field_group_name" /> 
     2370                        <input type="hidden" name="field_group_id" value="<?php echo $field_group_in_edit["id"] ?>" /> 
     2371                        <?php _e('or', 'simple-fields') ?>  
     2372                        <a href="<?php echo SIMPLE_FIELDS_FILE ?>"><?php _e('cancel', 'simple-fields') ?></a> 
     2373                    </p> 
     2374                    <p class="simple-fields-field-group-delete"> 
     2375                        <a href="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=delete-field-group&amp;group-id=<?php echo $field_group_in_edit["id"] ?>"><?php _e('Delete', 'simple-fields') ?></a> 
     2376                    </p> 
     2377                     
     2378                </form> 
     2379         
     2380                <script type="text/javascript"> 
     2381                    var simple_fields_highest_field_id = <?php echo (int) $highest_field_id ?>; 
     2382                </script> 
     2383         
     2384                <?php 
     2385             
     2386            } 
     2387     
     2388            // view debug information 
     2389            if ("simple-fields-view-debug-info" == $action) { 
     2390     
     2391                echo "<h3>Post Connectors</h3>\n"; 
     2392                echo "<p>Called with function <code>get_post_connectors()</code>"; 
     2393                sf_d( $this->get_post_connectors() ); 
     2394     
     2395                echo "<hr>"; 
     2396                 
     2397                echo "<h3>Field Groups</h3>\n"; 
     2398                echo "<p>Called with function <code>get_field_groups()</code>"; 
     2399                sf_d( $this->get_field_groups() ); 
     2400                 
     2401                echo "<hr>"; 
     2402                echo "<h3>simple_fields_post_type_defaults</h3>"; 
     2403                echo '<p>Called with: get_option("simple_fields_post_type_defaults")'; 
     2404                sf_d( get_option("simple_fields_post_type_defaults") ); 
     2405                 
     2406            } 
     2407     
     2408            // Save options 
     2409            if ("edit-options-save" == $action) { 
     2410                 
     2411                $this->save_options(array( 
     2412                    "debug_type" => (int) $_POST["debug_type"] 
     2413                )); 
     2414                 
     2415                $action = ""; 
     2416                $simple_fields_did_save_options = TRUE; 
     2417                 
     2418            } 
     2419     
     2420            // overview, if no action 
     2421            if (!$action) { 
     2422     
     2423     
     2424                /** 
     2425                 * view post connectors 
     2426                 */ 
     2427                $post_connector_count = 0; 
     2428                foreach ($post_connectors as $onePostConnector) { 
     2429                    if (!$onePostConnector["deleted"]) { 
     2430                        $post_connector_count++; 
     2431                    } 
     2432                } 
     2433     
     2434     
     2435                /** 
     2436                 * view existing field groups 
     2437                 */  
     2438                ?> 
     2439                <div class="simple-fields-edit-field-groups"> 
     2440     
     2441                    <h3><?php _e('Field groups', 'simple-fields') ?></h3> 
     2442     
     2443                    <?php 
     2444                     
     2445                    // Show messages, like "saved" and so on 
     2446                    if (isset($simple_fields_did_save) && $simple_fields_did_save) { 
     2447                        ?><div id="message" class="updated"><p><?php _e('Field group saved', 'simple-fields') ?></p></div><?php 
     2448                    } elseif (isset($simple_fields_did_delete) && $simple_fields_did_delete) { 
     2449                        ?><div id="message" class="updated"><p><?php _e('Field group deleted', 'simple-fields') ?></p></div><?php 
     2450                    } elseif (isset($simple_fields_did_delete_post_connector) && $simple_fields_did_delete_post_connector) { 
     2451                        ?><div id="message" class="updated"><p><?php _e('Post connector deleted', 'simple-fields') ?></p></div><?php 
     2452                    } elseif (isset($simple_fields_did_save_post_type_defaults) && $simple_fields_did_save_post_type_defaults) { 
     2453                        ?><div id="message" class="updated"><p><?php _e('Post type defaults saved', 'simple-fields') ?></p></div><?php 
     2454                    } elseif (isset($simple_fields_did_save_options) && $simple_fields_did_save_options) { 
     2455                        ?><div id="message" class="updated"><p><?php _e('Simple Fields options saved', 'simple-fields') ?></p></div><?php 
     2456                    } 
     2457                     
     2458                    $field_group_count = 0; 
     2459                    foreach ($field_groups as $oneFieldGroup) { 
     2460                        if (!$oneFieldGroup["deleted"]) { 
     2461                            $field_group_count++; 
     2462                        } 
     2463                    } 
     2464     
     2465                    if ($field_groups == $field_group_count) { 
     2466                        echo "<p>".__('No field groups yet.', 'simple-fields')."</p>"; 
     2467                    } else { 
     2468                        echo "<ul class=''>"; 
     2469                        foreach ($field_groups as $oneFieldGroup) { 
     2470                            if ($oneFieldGroup["id"] && !$oneFieldGroup["deleted"]) { 
     2471                                 
     2472                                echo "<li>"; 
     2473                                echo "<a href='" . SIMPLE_FIELDS_FILE . "&amp;action=edit-field-group&amp;group-id=$oneFieldGroup[id]'>$oneFieldGroup[name]</a>"; 
     2474                                if ($oneFieldGroup["fields_count"]) { 
     2475                                    $format = $oneFieldGroup["repeatable"] ? _n('1 added field, repeatable', '%d added fields, repeatable', $oneFieldGroup["fields_count"]) : _n('1 added field', '%d added fields', $oneFieldGroup["fields_count"]); 
     2476                                    echo "<br>" . __( sprintf($format, $oneFieldGroup["fields_count"]) ); 
     2477                                } 
     2478                                echo "</li>"; 
     2479                            } 
     2480                        } 
     2481                        echo "</ul>"; 
     2482                    } 
     2483                    echo "<p><a class='button' href='" . SIMPLE_FIELDS_FILE . "&amp;action=edit-field-group&amp;group-id=0'>+ ".__('New field group', 'simple-fields')."</a></p>"; 
     2484                    ?> 
     2485                </div> 
     2486             
     2487             
     2488                <div class="simple-fields-edit-post-connectors"> 
     2489     
     2490                    <h3><?php _e('Post Connectors', 'simple-fields') ?></h3> 
     2491     
     2492                    <?php 
     2493                    if (isset($simple_fields_did_save_connector) && $simple_fields_did_save_connector) { 
     2494                        ?><div id="message" class="updated"><p><?php _e('Post connector saved', 'simple-fields') ?></p></div><?php 
     2495                    } 
     2496     
     2497                    if ($post_connector_count) { 
     2498                        ?><ul><?php 
     2499                            foreach ($post_connectors as $one_post_connector) { 
     2500                                if ($one_post_connector["deleted"] || !$one_post_connector["id"]) { 
     2501                                    continue; 
     2502                                } 
     2503     
     2504                                ?> 
     2505                                <li> 
     2506                                    <a href="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=edit-post-connector&amp;connector-id=<?php echo $one_post_connector["id"] ?>"><?php echo $one_post_connector["name"] ?></a> 
     2507                                    <?php 
     2508                                    if ($one_post_connector["field_groups_count"]) { 
     2509                                        echo "<br>" . sprintf( _n('1 added field group', '%d added field groups', $one_post_connector["field_groups_count"]), $one_post_connector["field_groups_count"] ); 
     2510                                    } 
     2511                                    ?> 
     2512                                </li> 
     2513                                <?php 
     2514                                 
     2515                            } 
     2516                        ?></ul><?php 
     2517                    } else { 
     2518                        ?> 
     2519                        <!-- <p>No post connectors</p> --> 
     2520                        <?php 
     2521                    } 
     2522                    ?> 
     2523                    <p> 
     2524                        <a href="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=edit-post-connector&amp;connector-id=0" class="button">+ <?php _e('New post connector', 'simple-fields') ?></a> 
     2525                    </p> 
     2526                     
     2527                </div> 
     2528     
     2529                <div class="simple-fields-post-type-defaults"> 
     2530                    <h3><?php _e('Post type defaults', 'simple-fields') ?></h3> 
     2531                    <ul> 
     2532                        <?php 
     2533                        $post_types = get_post_types(); 
     2534                        $arr_post_types_to_ignore = array("attachment", "revision", "nav_menu_item"); 
     2535                        foreach ($post_types as $one_post_type) { 
     2536                            $one_post_type_info = get_post_type_object($one_post_type); 
     2537                            if (!in_array($one_post_type, $arr_post_types_to_ignore)) { 
     2538     
     2539                                $default_connector = $this->get_default_connector_for_post_type($one_post_type); 
     2540                                switch ($default_connector) { 
     2541                                    case "__none__": 
     2542                                        $default_connector_str = __('Default is to use <em>no connector</em>', 'simple-fields'); 
     2543                                        break; 
     2544                                    case "__inherit__": 
     2545                                        $default_connector_str = __('Default is to inherit from <em>parent connector</em>', 'simple-fields'); 
     2546                                        break; 
     2547                                    default: 
     2548                                        if (is_numeric($default_connector)) { 
     2549                                             
     2550                                            $connector = $this->get_connector_by_id($default_connector); 
     2551                                            if ($connector !== FALSE) { 
     2552                                                $default_connector_str = sprintf(__('Default is to use connector <em>%s</em>', 'simple-fields'), $connector["name"]); 
     2553                                            } 
     2554                                        } 
     2555     
     2556                                } 
     2557     
     2558                                ?><li> 
     2559                                    <a href="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=edit-post-type-defaults&amp;post-type=<?php echo $one_post_type ?>"> 
     2560                                        <?php echo $one_post_type_info->label ?> 
     2561                                    </a> 
     2562                                    <br> 
     2563                                    <span><?php echo $default_connector_str ?></span> 
     2564                                </li><?php 
     2565                            } 
     2566                        } 
     2567                        ?> 
     2568                    </ul> 
     2569                </div>   
     2570 
     2571 
     2572                <div class="simple-fields-debug"> 
     2573                    <h3><?php echo __('Debug', 'simple-fields') ?></h3> 
     2574                    <?php 
     2575                    // Dropdown with debug options 
     2576 
     2577                    // Debug type. 0 = no debug, 1 = debug for admins only, 2 = debug for all 
     2578                    $options = $this->get_options(); 
     2579                    $debug_type = isset($options["debug_type"]) ? (int) $options["debug_type"] : "0"; 
     2580                    // capability edit_themes 
     2581                    ?> 
     2582                    <form action="<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=edit-options-save" method="post"> 
     2583                        <?php 
     2584                        printf(' 
     2585                            <p> 
     2586                                <select name=debug_type> 
     2587                                    <option value=0 %1$s>%4$s</option> 
     2588                                    <option value=1 %2$s>%5$s</option> 
     2589                                    <option value=2 %3$s>%6$s</option> 
     2590                                </select> 
     2591                            </p> 
     2592                            ',  
     2593                            $debug_type === 0 ? "selected" : "", 
     2594                            $debug_type === 1 ? "selected" : "", 
     2595                            $debug_type === 2 ? "selected" : "", 
     2596                            __("Don't enable debug output", "simple-fields"), 
     2597                            __("Enable debug output for administrators", "simple-fields"), 
     2598                            __("Enable debug output for all users", "simple-fields") 
     2599                        ); 
     2600                        ?> 
     2601                        <p class=description> 
     2602                            <?php _e("Automatically append information about attached fields on posts (using filter 'the_content').", "simple-fields"); ?> 
     2603                        </p> 
     2604 
     2605                        <p> 
     2606                            <input class="button-primary" type=submit value="<?php _e("Save changes", "simple-fields") ?>"> 
     2607                        </p> 
     2608                    </form> <!-- // enable debug --> 
     2609                 
     2610                    <ul> 
     2611                        <li><a href='<?php echo SIMPLE_FIELDS_FILE ?>&amp;action=simple-fields-view-debug-info'><?php echo __('View debug information', 'simple-fields') ?></a></li> 
     2612                    </ul> 
     2613 
     2614                </div> 
     2615                 
     2616                <?php 
     2617     
     2618            } // end simple_fields_options 
     2619     
     2620            ?> 
     2621            </div> 
     2622        </div>   
     2623     
     2624        <?php 
     2625    } // end func simple_fields_options 
     2626 
     2627 
     2628    /** 
     2629     * Add the admin menu page for simple fields 
     2630     * If you want to hide this for some reason (maybe you are a theme developer that want to use simple fields, but not show the options page to your users) 
     2631     * you can add a filter like this: 
     2632     * 
     2633     * add_filter("simple-fields-add-admin-menu", function($bool) { 
     2634     *     return FALSE; 
     2635     * }); 
     2636     * 
     2637     */ 
     2638    function admin_menu() { 
     2639                 
     2640        $show_submenu_page = TRUE; 
     2641        $show_submenu_page = apply_filters("simple-fields-add-admin-menu", $show_submenu_page); 
     2642        if ($show_submenu_page) { 
     2643            add_submenu_page( 'options-general.php' , SIMPLE_FIELDS_NAME, SIMPLE_FIELDS_NAME, "administrator", "simple-fields-options", array($this, "options_page")); 
     2644        } 
     2645         
     2646    } 
     2647 
     2648 
     2649    /** 
     2650     * Gets the post connectors for a post type 
     2651     * 
     2652     * @return array 
     2653     */ 
     2654    function get_post_connectors_for_post_type($post_type) { 
     2655         
     2656        global $sf; 
     2657         
     2658        $arr_post_connectors = $this->get_post_connectors(); 
     2659        $arr_found_connectors = array(); 
     2660     
     2661        foreach ($arr_post_connectors as $one_connector) { 
     2662            if ($one_connector && in_array($post_type, $one_connector["post_types"])) { 
     2663                $arr_found_connectors[] = $one_connector; 
     2664            } 
     2665        } 
     2666        return $arr_found_connectors; 
     2667    } 
     2668     
     2669    /** 
     2670     * Registers a new field type 
     2671     * @param string $field_type_name Name of the class with the new field type 
     2672     */ 
     2673    static function register_field_type($field_type_name) { 
     2674        global $sf; 
     2675        $sf->_register_field_type($field_type_name); 
     2676    } 
     2677 
     2678    function _register_field_type($field_type_name) { 
     2679        $custom_field_type = new $field_type_name; 
     2680        $this->registered_field_types[$custom_field_type->key] = $custom_field_type; 
     2681    } 
     2682 
     2683    /** 
     2684     * Get all options 
     2685     * @return array 
     2686     */ 
     2687    function get_options() { 
     2688        $options = (array) get_option("simple_fields_options"); 
     2689        return $options; 
     2690    } 
     2691     
     2692    /** 
     2693     * Save options 
     2694     * @param array $new_options. will be merged with old options, so you only need to add your modified stuff to the array, and then all old stuff will be untouched. 
     2695     */ 
     2696    function save_options($new_options) { 
     2697        $old_options = $this->get_options(); 
     2698        $new_options = wp_parse_args($new_options, $old_options); 
     2699        update_option("simple_fields_options", $new_options); 
     2700    } 
     2701     
     2702    // Some debug functions 
     2703    function maybe_add_debug_info() { 
     2704        global $sf; 
     2705        $options = $sf->get_options(); 
     2706        if (isset($options["debug_type"]) && $options["debug_type"] !== 0) { 
     2707         
     2708            // 1 = debug for admins only, 2 = debug for all 
     2709            if ( ($options["debug_type"] === 1 && current_user_can("edit_themes")) ||  $options["debug_type"] === 2) { 
     2710                add_filter("the_content", array($this, "simple_fields_value_get_functions_test")); 
     2711            }    
     2712     
     2713        } 
     2714    } 
     2715     
     2716    // Outputs the names of the post connectors attached to the post you view + outputs the values 
     2717    function simple_fields_value_get_functions_test($the_content) { 
     2718         
     2719        $output = ""; 
     2720        $output_all = ""; 
     2721        $field_count = 0; 
     2722         
     2723        $post_connector_with_values = simple_fields_get_all_fields_and_values_for_post(get_the_ID()); 
     2724        if ($post_connector_with_values) { 
     2725            foreach ($post_connector_with_values["field_groups"] as $one_field_group) { 
     2726                if ($one_field_group["deleted"]) continue; 
     2727                foreach ($one_field_group["fields"] as $one_field) { 
     2728                    if ($one_field["deleted"]) continue; 
     2729                    $field_count++; 
     2730                    $content = ""; 
     2731                    $content .= "<ul style='background:#eee;padding:.5em;'>"; 
     2732                    $content .= "<li><b>" . $one_field["name"] . "</b><ul>"; 
     2733                    $content .= "<li>Type <b>" . $one_field["type"] . "</b>"; 
     2734                    if (isset($one_field["slug"])) { 
     2735                        $content .=  "<li>Slug <b>" . $one_field["slug"] . "</b>"; 
     2736                         
     2737                        $content .= "<li>Use <code><b>simple_fields_values('".$one_field["slug"]."')</b></code> to get:"; 
     2738                        ob_start(); 
     2739                        sf_d( simple_fields_values($one_field["slug"]) ); 
     2740                        $content .= ob_get_clean(); 
     2741         
     2742                        $content .= "<li>Use <code><b>simple_fields_value('".$one_field["slug"]."')</b></code> to get:"; 
     2743                        ob_start(); 
     2744                        sf_d( simple_fields_value($one_field["slug"]) ); 
     2745                        $content .= ob_get_clean(); 
     2746                    } else { 
     2747                        $content .= "<li>No slug for this field found (probably old field that has not been edited and saved)."; 
     2748                    } 
     2749                    $content .= "</ul></ul>"; 
     2750                    $output_all .= $content; 
     2751                } 
     2752            } 
     2753        } 
     2754         
     2755        if ($output_all) { 
     2756            ?> 
     2757            <script> 
     2758            window.simple_fields_post_debug_show_hide = window.simple_fields_post_debug_show_hide || function(t) { 
     2759                var $t = jQuery(t); 
     2760                var $div_wrap = $t.closest("div.simple-fields-post-debug-wrap"); 
     2761                $div_wrap.find("div.simple-fields-post-debug-content").toggle("fast"); 
     2762                return false; 
     2763            } 
     2764            </script> 
     2765            <?php 
     2766             
     2767            $output_all = ' 
     2768                <div class="simple-fields-post-debug-wrap"> 
     2769                    This post has ' . $field_count . ' Simple Fields-fields attached. <a href="#" onclick="return simple_fields_post_debug_show_hide(this);">Show fields.</a> 
     2770                    <div class="simple-fields-post-debug-content" style="display:none;">'.$output_all.'</div> 
     2771                </div> 
     2772                '; 
     2773        } 
     2774         
     2775        return $the_content . $output_all; 
     2776    } 
     2777 
     2778     
     2779} // end class 
     2780 
     2781 
     2782// Boot it up! 
     2783$sf = new simple_fields(); 
     2784$sf->init(); 
  • simple-fields/trunk/styles.css

    r517385 r609729  
    66} 
    77ul.simple-fields-edit-field-groups-added-fields li { 
     8    position: relative; 
     9    padding: 1em 2em; 
     10    margin: 0; 
     11    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(whiteSmoke), to(white)); 
     12    background-image: -webkit-linear-gradient(top, whiteSmoke, white); 
     13    background-image:    -moz-linear-gradient(top, whiteSmoke, white); 
     14    background-image:     -ms-linear-gradient(top, whiteSmoke, white); 
     15    background-image:      -o-linear-gradient(top, whiteSmoke, white); 
     16    border-top: 2px solid #eee; 
    817    margin-bottom: 2em; 
    9     padding-bottom: 2em; 
    10     border-bottom: 1px solid #DFDFDF; 
    11     background-color: #F9F9F9; 
    12     position: relative; 
    13 } 
    14 ul.simple-fields-edit-field-groups-added-fields li:nth-child(odd) { 
    15     /* background-color: #fff; */ 
    16 } 
     18} 
     19ul.simple-fields-edit-field-groups-added-fields li li { 
     20    background-image: none; 
     21} 
     22 
    1723 
    1824#field_group_name, 
     
    3137} 
    3238 
     39.simple-fields-field-group-one-field-row fieldset { 
     40    border: 1px solid silver; 
     41    padding: 0em 1em; 
     42} 
     43.simple-fields-field-group-one-field-row legend { 
     44    font-weight: bold; 
     45} 
     46 
    3347.simple-fields-field-group-one-field-row label, 
    3448.simple-fields-field-type-options label 
     
    3852 
    3953.simple-fields-field-group-one-field-row-description { 
    40 /*  display: none; */ 
     54} 
     55 
     56.simple-fields-field-group-one-field-row p input[type=text], 
     57.simple-fields-field-group-one-field-row p textarea 
     58{ 
     59    width: 100%; 
     60} 
     61.simple-fields-field-group-one-field-row p textarea { 
     62    height: 8em; 
    4163} 
    4264 
     
    5476    display: none; 
    5577    position: absolute; 
    56     right: 0; 
    57     bottom: 1em; 
     78    right: .5em; 
     79    top: .5em; 
    5880} 
    5981.simple-fields-field-group-delete, 
     
    7597 
    7698.simple-fields-edit-post-connectors, 
     99.simple-fields-post-type-defaults, 
     100.simple-fields-debug 
     101 { 
     102     margin-top: 2em; 
     103} 
     104.simple-fields-edit-post-connectors { 
     105} 
    77106.simple-fields-edit-field-groups { 
    78     xfloat: left;    
    79 } 
    80 .simple-fields-edit-post-connectors { 
    81     xborder-right: 1px solid #DFDFDF; 
    82     xpadding-right: 3em; 
    83 } 
    84 .simple-fields-edit-field-groups { 
    85     xborder-left: 1px solid #DFDFDF; 
    86     xpadding-left: 3em; 
    87     xmargin-left: -1px; 
    88107} 
    89108 
    90109.simple-fields-edit-field-groups ul, 
    91110.simple-fields-edit-post-connectors ul, 
    92 .easy-fields-post-type-defaults ul 
     111.simple-fields-post-type-defaults ul 
    93112 { 
    94113    list-style-type: disc; 
     
    105124    line-height: 2.5em; 
    106125    position: relative; 
    107     background-color: #f9f9f9; 
    108126} 
    109127.simple-fields-field-type-options-radiobutton-checked-by-default { 
     
    142160    cursor: pointer; 
    143161    position: absolute; 
    144     /* bottom: 0; */ 
    145162    top: 0; 
    146163    left: 35em; 
     
    164181} 
    165182ul#simple-fields-post-connector-added-fields li { 
    166     border-bottom: 1px solid #DFDFDF; 
    167     padding-bottom: 1em; 
    168     margin-bottom: 1em; 
     183    margin-bottom: 2em; 
     184    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(whiteSmoke), to(white)); 
     185    background-image: -webkit-linear-gradient(top, whiteSmoke, white); 
     186    background-image:    -moz-linear-gradient(top, whiteSmoke, white); 
     187    background-image:     -ms-linear-gradient(top, whiteSmoke, white); 
     188    background-image:      -o-linear-gradient(top, whiteSmoke, white); 
     189    border-top: 2px solid #eee; 
    169190} 
    170191.simple-fields-post-connector-addded-fields-options { 
     
    178199} 
    179200 
    180 .easy-fields-post-type-defaults, 
     201.simple-fields-post-type-defaults, 
    181202.simple-fields-edit-post-connectors 
    182203 { 
    183     margin-top: 2.5em; 
     204     
    184205} 
    185206 
     
    215236} 
    216237ul.simple-fields-metabox-field-group-fields-repeatable li { 
    217     border-top: 1px solid #ddd; 
    218238    margin-top: 1em; 
    219239    padding-top: .5em; 
    220240    padding-bottom: .5em; 
    221241    padding-left: 11px; 
     242    background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(whiteSmoke), to(white)); 
     243    background-image: -webkit-linear-gradient(top, whiteSmoke, white); 
     244    background-image:    -moz-linear-gradient(top, whiteSmoke, white); 
     245    background-image:     -ms-linear-gradient(top, whiteSmoke, white); 
     246    background-image:      -o-linear-gradient(top, whiteSmoke, white); 
     247    border-top: 2px solid #eee; 
     248    padding: .5em 1.5em; 
     249    margin: 0 0 0 0; 
    222250} 
    223251ul.simple-fields-metabox-field-group-fields-repeatable li.hover { 
     
    253281} 
    254282 
    255 .simple-fields-metabox-field-group .dp-choose-date { 
    256     display: none; 
    257 } 
    258  
    259283.simple-fields-metabox-field-textarea-tinymce-wrapper { 
    260284    width: 100%; 
     
    295319.simple-fields-metabox-field-group-delete { 
    296320    position: absolute; 
    297     left: -6px; 
    298     top: 38px; 
     321    top: 10px; 
     322    right: 10px; 
    299323} 
    300324.simple-fields-metabox-field-group-delete a { 
     
    375399 
    376400.simple-fields-bonny-plugins-inner-sidebar { 
     401    display: none; 
     402} 
     403/*.simple-fields-bonny-plugins-inner-sidebar { 
    377404    float: right; 
    378405    width: 210px; 
     
    385412    float: left; 
    386413} 
     414*/ 
    387415 
    388416.simple-fields-meta-box-field-group-field-type-post-dialog { 
     
    394422 
    395423.simple-fields-meta-box-field-group-field-type-post-dialog-post-types { 
    396 /*  border-bottom: 1px solid #DFDFDF; 
    397     padding-bottom: 10px; 
    398     margin-bottom: 10px; */ 
    399424    margin-bottom: 10px; 
    400425} 
     
    440465    font-weight: normal; 
    441466} 
     467 
     468.sf_box_debug { 
     469    padding: .5em; 
     470    background-color: lightyellow; 
     471} 
     472 
Note: See TracChangeset for help on using the changeset viewer.