Diabox 0.6

Diabox is another modal window solution. It provides support for Images, Local HTML, Remote Pages, PDF's, Powerpoints, TIFF's, Youtube Videos, Vimeo Videos, SWF, Elements, Inline Content, and Raw Text. It's extremely customizable and even allows custom extensions of the provided Renderable interface. Diabox provides you with: Diabox, Diabox.Gallery, and Diabox.Renderable.



Details

Author
MIke Nelson
Current version
0.6
GitHub
mnelson/diabox
Downloads
18362
Category
Interface
Tags
Report
GitHub Issues

Releases


Dependencies

  • _self_/_current_:
    • core/1.3: *
    • more/1.3: Element.Measure, Drag, Array.Extras
    • class/mutators/memoize/0.3: Class.Mutators.Memoize

How to use

Just include diabox.js on your page. Diabox is dependent on Element.Measure and Array.Extras (and Drag if you turn it on) which are part of Mootools More.

<script type="text/javascript" src="/javascripts/mootools.js"></script>
<script type="text/javascript" src="/javascripts/mootools_more.js"></script>
<script type="text/javascript" src="/javascripts/diabox.js"></script>

Box Creation

Diabox does not create a global object because it's intended to be very customizable. So it's up to you to create the Diabox object. Once created however, all links are analyzed, all events are attached, and all required DOM structures are created. Initializing the Diabox is as easy as:

<script type="text/javascript">
    window.addEvent('domready', function(){ window.diabox = new Diabox({gallery : {enabled : true}}); });
</script>

Links

If you want links on your page to be noticed by Diabox just set their rel attribute to diabox or lightbox. So if I wanted some content to be loaded and displayed in the Diabox I would do:

<a href="http://www.google.com" rel="diabox">Don't believe me, Google it!</a>

Galleries

If you want to display galleries it's as easy as adding a [gallery_name] to the rel. The galleries are ordered based on dom traversal. Galleries work for all content types, as long as it's wrapped by the Renderable interface. The gallery names cannot start with a number.

<a href="/images/a.png" rel="diabox[examples]"><img src="/images/a.png" /></a>
<a href="/images/b.png" rel="diabox[examples]"><img src="/images/b.png" /></a>
<a href="/images/c.png" rel="diabox[examples]"><img src="/images/c.png" /></a>
<a href="/images/d.png" rel="diabox[examples]"><img src="/images/d.png" /></a>

Titles

The titles on links are passed to the renderable and displayed when the content is shown. Titles can be turned off if you'd prefer but it's very useful to show them as captions.

<a href="/images/a.png" rel="diabox[examples]" title="Some Awesome [A]"><img src="/images/a.png" /></a>

Custom Dimensions

Custom dimensions can be passed in the rel. They are defined with a similar syntax to galleries except you provide the width and height. The syntax is rel="diabox[widthxheight]". The width and the height are optional meaning you can override the width and leave the height blank if you'd like. Currently dimensions do not determine best fit or anything like that so make sure you're careful when using this on images or proportional content.

<a href="/images/a.png" rel="diabox[200x150]"><img src="/images/a.png" /></a>
<a href="/images/b.png" rel="diabox[examples][200x150]"><img src="/images/b.png" /></a>
<a href="/images/c.png" rel="diabox[examples][200x]"><img src="/images/c.png" /></a>       // only mods the width
<a href="/images/d.png" rel="diabox[examples][x150]"><img src="/images/d.png" /></a>       // only mods the height

Inline Content

Diabox allows you to display inline content without modifying the page at all. Inline content is referenced via id's but the id is not included in the clone. Make sure any css styles reference classes on the element and not the id. To reference an idea just do so in the link target:

<a href="#id_of_element" rel="diabox">Show some content on this page</a>

Dynamic Content

Dynamic content can be displayed using the reveal method. It can handle any content that can be mapped to a renderable. So you can pass urls, ids, text content, ids (#id), etc. A second, optional argument is the title that's used for the provided content.

<script type="text/javascript">
    diabox.reveal("#some_element", "Some Element");
    diabox.reveal("http://www.google.com", "Google");
    diabox.reveal("This is some text content I want displayed.");
</script>

Options

Diabox gives you a multitude of options. Rather than explaining each and every one, here's a copy of the source:

options : {
  parser : null,                            // pass in a function that takes a target (url, dom element, etc) and passes back a renderable key
  parent : null,                            // the element that diabox and it's overlay are children of; null will use the body element
  rel_target : /^(dia|light)box/,           // the pattern to match when analyzing links on the site.
  error_text : '<p style="text-align:center;padding:10px;">Sorry, there was an error retrieving the content.<br />Please try again later.</p>',
  iframe : {                              
    width : 850,                            // the content width of an iframe renderable
    height: 575                             // the content height of an iframe renderable
  },                                      
  image : {                               
    maxWidth : 850,                         // the max image width of an image renderable
    maxHeight : 575                         // the max image height of an image renderable
  },                                      
  box : {                                 
    id : 'diabox',                          // the id of the modal window
    content_id : 'diabox_content',          // the id of the content div inside the modal window
    loading_id : 'diabox_loading',          // the id of the loading div that get's injected while no other content is present
    fade_duration : 400,                    // the fade in and fade out duration for the modal window
    resize_duration : 400,                  // the duration when the box is resizing before applying the next content
    content_fade_duration : 200,            // the duration it takes for the content to appear after being added to the modal window
    fade_transition : Fx.Transitions.Sine.easeOut,
    resize_transition : Fx.Transitions.Back.easeOut,
    content_fade_transition : Fx.Transitions.Sine.easeOut,
    classes : '',                           // classes to add to the modal window
    loading_class : 'loading',              // class that's added to the modal window when data is loading.
    max_width : 900,                        // the maximum width the modal window can be
    max_height : 700,                       // the maximum height the modal window can be
    min_width: 50,                          // the minimum width the modal window can be
    min_height : 80,                        // the minimum height the modal window can be
    draggable : false,                      // is the box draggable
    draggable_class : 'draggable',          // the class to add when the box is draggable
    apply_renderable_class : true,          // when content is applied should it add the renderable key to the box (text, ajax, youtube, etc)
    apply_gallery_class : true,             // when a gallery is applied should the gallery name be added to the box
    apply_title_class : true
  },                                      
  gallery : {                             
    enabled : true,                         // allow galleries to be created and iterated through
    box_class : 'diabox_gallery',           // the class that gets added to the modal window when a gallery is present
    slideshow_class : 'diabox_slideshow',   // the class that gets added to the modal window when a slideshow is running
    slideshow_duration : 5000,              // the amount of time each content in the gallery stays present
    autostart : false,                      // start the slideshow whenever a gallery is shown
    loop : false                            // allow iteration from first to last and last to first  
  },                                      
  title : {                               
    id : 'diabox_title',                    // the id of the title element
    default_text : null,                    // a default title
    show : true,                            // show titles
    show_gallery_index : true,              // show the current page of the gallery (1 / 3), (3 / 5), etc
    parent : null,                          // the parent element of the title (id or element)
    box_class : 'with_title'
  },                                      
  overlay : {                             
    id : 'diabox_overlay',                  // id of the overlay
    fade_duration : 400,                    // amount of time for the overlay to fade in
    opacity : 0.7,                          // the end opacity of the overlay
    transition : Fx.Transitions.Sine.easeOut, // the transition to use when the overlay is appearing
    click_to_close : true
  },
  gdoc : {
    width : 850,                            // the width of a pdf, tiff, or ppt
    height : 500                            // the height of a pdf, tiff, or ppt
  },
  youtube : {
    width: 650,                             // the width of youtube videos
    height: 350                             // the height of youtube videos
  },
  vimeo : {
    width : 650,                            // the width of vimeo videos
    height: 350                             // the height of vimeo videos
  },
  swf : {                                   
    width : 500,                            // the default width of swf content
    height : 300,                           // the default height of swf content
    bg_color : '#000000'                    // the default background color of swf content
  },
  controls : {
    next_id : 'diabox_next',                // id of the next button
    prev_id : 'diabox_prev',                // id of the previous button
    close_id : 'diabox_close',              // id of the close button
    play_id : 'diabox_play',                // id of the play button
    next_text : 'next',                     // text of the next button (html ok)
    prev_text : 'prev',                     // text of the prev button (html ok)
    close_text : 'close',                   // text of the close button (html ok)
    play_text : 'start / stop',             // text of the play button (html ok)
    show_close : true,                      // display the close button
    show_play : false,                      // display the play button when a gallery is available
    enable_shortcuts : true,                // allow keyboard shortcuts, by default only ESC is implemented
    key_command : null,                     // function to call when a key command (not ESC) is fired. return false to stop propogation
    classes : 'diabox_control',             // class that's added to all control elements (prev, next, close, play)
    disabled_class : 'diabox_disabled',     // the class that's added to control elements when they should be disabled
    parent : null                           // the parent of the control elements, by default the modal window
  }
}

Creating Your Own Renderable

The renderable interface wraps any content applied to the box. It also allows you to create and register your own renderable objects, essentially giving you the ability to render any type of content not currently supported. If you create your own renderable you'll need to do a few things for the Diabox to see it. First, you'll have to implement the Diabox.Renderable class.

Diabox.MyCustomRenderable = new Class({
    Extends : Diabox.Renderable,
    render : function(){
        if(!this.retrieved()){
            var e = new Element('div').set('html', this.target);
            this.set_content(e);
        }
    }
});

There's a few things to note about this Renderable class. The only method you should be overriding is the render method. The render method should follow the basic format seen above. If the content has previously been created then it will be cached, enabling instantaneous rendering from then on. This is done within the retrieved method. If the retrieved method returns true then a render event has been fired and you should not be modifying the content. If it returns false then you should be setting the content.

The content passed to the set_content method must be 1 or more elements. When the set_content method is called and the elements are properly configured an event is fired and the content will be displayed.

If you need to execute scripts then utilize the set_scripts method. They will be executed after the content is displayed, allowing you to reference elements within the applied content. Here's the AjaxRenderable as an example:

Diabox.AjaxRenderable = new Class({
    Extends : Diabox.Renderable,
    render : function(){
        if(!this.retrieved()){
            new Request.HTML({url : this.target, evalScripts : false, onSuccess : function(tree, elems, html, js){
                this.set_scripts(js);
                this.set_content(elems);
            }.bind(this), onFailure : function(){
                this.set_content(null);
            }}).get();
        }
    }
});

Registering Your Renderable

Once you've created your renderable class you must register it with the Diabox instance. To register it you just call the register_renderable method with the renderable key and the class:

diabox.register_renderable('my_custom_key', Diabox.MyCustomRenderable);

Calling Your Renderable

The last step is to create a parser function that handles converting a target to your renderable key. The parser function is called prior to default evaluation. The parser is passed the target (which could be anything) and should return a renderable key. Here's the parser included in the diabox source:

parse_target : function(target){
    var key = null;
    if(this.options.parser) key = this.options.parser(target);
    if(key){return key};

    if(typeOf(target) == 'element')
    return 'element';
    else if(typeOf(target) == 'string'){
        if(target.test(/youtube\.com\/watch\?v\=(\w+)(&|)/i)){
            return 'youtube';
        } else if(target.test(/vimeo\.com\/(\d+)/i)) {
            return 'vimeo';
        } else if(target.test(/\.(ppt|PPT|tif|TIF|pdf|PDF)$/i)) {
            return 'gdoc';
        } else if(target.test(/\.(png|PNG|jpg|JPG|jpeg|JPEG|gif|GIF)$/i)){
            return 'image';
        } else if(target.test(/\:\/\/[^#]+#([a-zA-Z]?[a-zA-Z0-9\-\_\:\.]*)/i)){ 
            return 'inline';
        } else if(target.test(/\:\/\//i)) {
            if(!target.test(RegExp('^(' + window.location.protocol + '\\/\\/' + window.location.hostname + '/)', 'i')))
                return 'remote';
            else 
                return 'ajax';
        } else {
                return 'text';
        }
    }
    return null;
}

Screenshots


Discuss

A note on comments here: These comments are moderated. No comments will show up until they are approved. Comments that are not productive (i.e. inflammatory, rude, etc) will not be approved.

Found a bug in this plugin? Please report it this repository's Github Issues.

blog comments powered by Disqus