/**
 * Easy Block page elements v1.0
 * http://www.code-masters.org
 *
 * Copyright 2011, Strong
 * 
 * Under GPL license Version 2.
 * http://www.gnu.org/licenses/gpl-2.0.html
 * 
 * Date: 15/06/2011
 *
 * @author  Strong
 * @version 1.0
 */
var blockUI = {
    
    defaults : {
        element     : null,
        content     : null,
        popupWidth  : null,
        popupHeight : null,
        sameElement : false,
        position    : 'center', // Posible params: center, top, bottom, left, right and combinations.
        buttons     : {},
        loading     : false,
        setFocus    : false,
        closeMask   : true,
        showOverlay : false,
        opacity     : .2,
        maskStyle   : {
            'background-color' : '#525252'
        },     
        onBlock     : null,
        onUnblock   : null
    },
    
    _guid   : 0,
    
    isInit  : false,
    
    element : null,
    
    options : {},
    
    overlay : null,
    
    mask    : null,
    
    popup   : null,
    
    content : null,
    
    buttons : null,
    
    log : function(text) {
        try {
            if (typeof(console) !== "undefined") {
               console.log(text);
            }
        } catch (e) {}   
    },
       
    setOptions : function(options) {
        blockUI.options = jQuery.extend({}, blockUI.defaults, options || {});
        return this;
    },
    
    setOverlay : function() {
        blockUI.overlay = jQuery('<div></div>')
              .appendTo('body')
              .addClass('block-ui-overlay')
              .hide();
              
        return this;
    },
    
    setMask : function() {
        blockUI.mask = jQuery('<div></div>')
              .appendTo('body')
              .addClass('block-ui-mask')
              .hide();
              
        return this;
    },
    
    setPopup : function() {
        blockUI.popup = jQuery('<div></div>')
              .appendTo('body')
              .addClass('block-ui-popup unselectable')
              .hide();
        
        return this;
    },
    
    setContent : function(content) {
        blockUI.content = jQuery('<div></div>')
              .appendTo(blockUI.popup)
              .addClass('block-ui-content')
              .empty()
              .html(content);
              
        return this;
    },
    
    setButtons : function(buttons) {
        if (jQuery.isEmptyObject(buttons)) {
            return;
        }
        
        blockUI.buttons = jQuery('<div></div>')
              .insertAfter(blockUI.content)
              .addClass('block-ui-buttons')
              .empty();
        
        if (typeof(buttons) === 'object') {            
            jQuery.each(buttons, function(name, fn) {
                var button = jQuery('<input type="button" />')
		    .val(name)
		    .click(function() { fn.apply(); })
		    .appendTo(blockUI.buttons);				
	    });
        }
    },    
    
    create : function(options) {
        if (blockUI.isInit === true) {
            return;
        }  
        
        blockUI._guid++;
    
        blockUI.isInit = true;
        
        blockUI.setOptions(options);
                    
        blockUI.element = blockUI.options.element;
        
        if (jQuery.isEmptyObject(blockUI.element)) {
            blockUI.log('Element is empty');
            return;
        }
        
        blockUI.setOverlay();
        
        blockUI.setMask();
        
        blockUI.setPopup();
                   
        blockUI.setContent(blockUI.options.content);
        
        if (blockUI.options.loading === true) {
            var loading = $('<div></div>')
                .addClass('block-ui-loading')
                .appendTo(blockUI.content);
        }
        
        if (blockUI.options.loading === false) {
            blockUI.setButtons(blockUI.options.buttons);
        }
        
        if (blockUI.options.closeMask === true) {
            blockUI.mask.bind('click', function() {
                blockUI.unblock();
            });
        }
        
        if (blockUI.options.maskStyle) {
            blockUI.mask.css(blockUI.options.maskStyle);
        }
                                   
        return this;
    },
    
    position : function() {
        var 
            elPosition     = blockUI.element.offset(),
            elWidth        = blockUI.element.outerWidth(),
            elHeight       = blockUI.element.outerHeight(),
            maskWidth      = elWidth,
            maskHeight     = elHeight,             
            popupWidth     = blockUI.popup.outerWidth(),
            popupHeight    = blockUI.popup.outerHeight();
                        
        blockUI.overlay.css({
            width  : jQuery(document).width(),
            height : jQuery(document).height()
        });
                                    
        blockUI.mask.css({
            top     : elPosition.top,
            left    : elPosition.left,
            width   : maskWidth,
            height  : maskHeight,
            opacity : blockUI.options.opacity > 0 ? blockUI.options.opacity : .2
        });
        
        var position = '', customValues = [];
        
        if (jQuery.isArray(blockUI.options.position)) {
            position = 'custom';
            customValues = blockUI.options.position;
            
            if (customValues.length < 2) {
                blockUI.log('Invalid data for custom values.');
                position = ''; // Set defaults
            }
            
        } else {
            position = blockUI.options.position;
        }
                
        switch (position) {
        
            case 'custom' :
            
                var left = customValues[0], top = customValues[1];         
                
            
                break;
            
            default :
            case 'center-center' :
            case 'center' :
            
                blockUI.popup.css({
                    left : elPosition.left + (elWidth/2 - popupWidth/2),
                    top  : elPosition.top + (elHeight/2 - popupHeight/2)  
                });
                
                break;
                
            case 'center-top' :                
            case 'top' :
            
                blockUI.popup.css({
                    left : elPosition.left + (elWidth/2 - popupWidth/2),
                    top  : elPosition.top
                });
                
                break;
                            
            case 'center-bottom' :    
            case 'bottom' :
            
                blockUI.popup.css({
                    left : elPosition.left + (elWidth/2 - popupWidth/2),
                    top : elPosition.top + (elHeight-popupHeight)
                });
                
                break;
            
            case 'center-left' :    
            case 'left' :
            
                blockUI.popup.css({
                    left : elPosition.left,
                    top : elPosition.top
                });
                
                break;
            
            case 'center-right' :    
            case 'right' :
            
                blockUI.popup.css({
                    left : elPosition.left + (elWidth - popupWidth),
                    top  : elPosition.top + (elHeight/2 - popupHeight/2)  
                });
                
                break;
                           
        }
    },
    
    block : function() {  
        blockUI.position();
        
        if (blockUI.options.showOverlay === true) {
            blockUI.overlay.show();
        }
              
        blockUI.mask.show(); 
        blockUI.popup.show();        
                
        if (jQuery.isFunction(blockUI.options.onBlock)) {
            blockUI.options.onBlock.apply();
        }
        
        if (blockUI.options.setFocus === true) {
            jQuery('html, body').stop(true,true).animate({scrollTop:blockUI.element.offset().top}, 300);
        }
        
        return this;
    },
    
    unblock : function() {
        if (blockUI.options.showOverlay === true) {
            blockUI.overlay.hide();
        }
        
        blockUI.popup.hide();
        blockUI.mask.hide();
        
        if (blockUI.options.closeMask === true) {
            blockUI.mask.unbind('click');
        }
        
        if (jQuery.isFunction(blockUI.options.onUnblock)) {
            blockUI.options.onUnblock.apply();
        }
        
        blockUI.refresh();
        
        return this;
    },
        
    refresh : function() {
        blockUI.isInit  = false;
                
        blockUI.overlay.remove();
        blockUI.mask.remove();
        blockUI.popup.remove();
        
        blockUI.element = null;
        blockUI.overlay = null;
        blockUI.mask    = null;
        blockUI.popup   = null;
        blockUI.content = null;
        blockUI.buttons = null;
               
        blockUI._guid   = 0;
                
        blockUI.options = {};
        
        return this;
    }

};

