/**
 * @author Ben Egan, Land of War
 */
(function($){
    $.popup = {version: '1.1'};

    $.fn.popup = function(settings){
        settings = jQuery.extend({
            popupOverlay: null,
            loadingContent: '',
            errorLoadingContent: '',
            defaultContentSize: 'auto',
            defaultUrlSize: 'big'
        }, settings);

        settings.popupOverlay = document.createElement('div');
        
        overlayCloseHandler = function(){
            var popup = $('*:last-child', settings.popupOverlay)[0];
            console.log($(".content", this));
            $(".content", popup).remove();
            $(popup).fadeOut("slow", function() {
                $(this).remove();

                if($('.popup', settings.popupOverlay).size() == 0){
                    $(settings.popupOverlay).hide();
                }
            });
        };
        
        $(settings.popupOverlay).click(overlayCloseHandler);
        $(window).keypress(function(event) {
            if($('.popup', settings.popupOverlay).size()!=0){
                if (event.keyCode == '27') {
                    overlayCloseHandler();
                }
                event.preventDefault();
            }
        });


        $(settings.popupOverlay).addClass('popupOverlay');
        $(settings.popupOverlay).hide();
        $('body').append(settings.popupOverlay);
        
        $.popup.initialize = function() {
            $.popup.openUrl($(this).attr('href'), $(this).attr('title'));
            return false;
        };

        $.popup.openUrl = function(url, title, size){
            if(size==null){
                size = settings.defaultUrlSize;
            }

            var popup = $.popup.create('iframe', size);

            popup.title('Loading...');
            popup.title(title);
            popup.contentElement().src = url;
            $(popup.contentElement()).hide();
            
            $(popup.contentElement()).load(function(){
                try {
                    if(popup.contentElement().contentDocument.URL.match(/popup=redirect$/)){
                        window.location = popup.contentElement().contentDocument.URL.replace('popup=redirect', '');
                    }else if(title == null || title == ''){
                        popup.title($(this).contents().find('title').html());
                    }
                } catch (exception) {
                    try{
                        popup.title($(this).contents().find('title').html());
                    }catch(exception){

                    }
                }
            });
            
            popup.show(function(){
                $(popup.contentElement()).show();
            });
        };

        $.popup.openContent = function(content, title, size){
            if(size==null){
                size = settings.defaultContentSize;
            }
            
            if(size=='auto'){
                if(content.length<100){
                    size='small';
                }else if(content.length>500){
                    size='big';
                }else{
                    size='normal';
                }
            }

            var popup = $.popup.create(null, size);
            popup.content(content);
            if(title==null){
                title='';
            }
            
            popup.title(title);
            popup.show();
        };

        $.popup.create = function(contentElementTag, size){
            if(contentElementTag==null){
                contentElementTag = 'div'
            }

            var popup = document.createElement('div');
            $(popup).click(function(){
                return false;
            });
            $(popup).addClass('popup');
            $(popup).addClass(size);
                var popupClose = document.createElement('div');
                popupClose.innerHTML = 'X';
                $(popupClose).addClass('close');
            $(popup).append(popupClose);
                var popupTitle = document.createElement('div');
                $(popupTitle).addClass('title');
            $(popup).append(popupTitle);
                var popupContent = document.createElement(contentElementTag);
                $(popupContent).addClass('content');
            $(popup).append(popupContent);

            var returnObject = {
                title: function(title){
                    if(title === ''){
                        $(popupTitle).addClass('hidden');
                    }else{
                        $(popupTitle).removeClass('hidden');
                        popupTitle.innerHTML = title;
                    }

                    return popupTitle.innerHTML;
                },
                content: function(content){
                    popupContent.innerHTML = '<p>'+content+'</p>';
                },
                contentElement: function(){
                    return popupContent;
                },
                popupOverlay: function(){
                    return settings.popupOverlay;
                },
                popup: function(){
                    return popup;
                },
                close: function(){
                    overlayCloseHandler();
                },
                show: function(callback){
                    if($('.popup', settings.popupOverlay).size() == 0){
                        $(settings.popupOverlay).show();
                    }

                    $(popup).hide();
                    $(settings.popupOverlay).append(popup);
                    $(popup).show('slow', callback);
                }
            };

            $(popupClose).click(returnObject.close);

            return returnObject;
        }

        return this.unbind('click').click($.popup.initialize);
    };
})(jQuery);

