var GenericPopup = Class.create();
GenericPopup.prototype = {

    initialize: function(id, url, xPos, yPos, target) {
        this.id = id;
        this.url = url;
        this.xPos = xPos;
        this.yPos = yPos;
        this.target = target;
    },

    show: function(e) {
    },

    hide: function() {
        Element.remove('popupelement_back');
        Element.remove('popupelement');
    },

    _createPopup: function(content) {

        var popupElement = $("popupelement");
        var popupElementBack = $("popupelement_back");

        if(popupElement == null || popupElementBack == null) {

            popupElement = document.createElement('DIV');
            popupElementBack = document.createElement('DIV');
            popupElement.id = "popupelement";
            popupElementBack.id = "popupelement_back";
            popupElement.style.left = this.xPos + 'px';
            popupElementBack.style.left = this.xPos + 'px';
            popupElement.style.top = this.yPos + 'px';
            popupElementBack.style.top = this.yPos + 'px';

            //Now insert 'content' to this node's parent
            //(in order to make it less affected with styling of this node)
            popupElement.innerHTML = content;
            var parent = this.target.parentNode;
            parent.appendChild(popupElementBack);
            parent.appendChild(popupElement);

            //The ajax-fetched content must contain an element with id "close_popupelement" that closes it
            //We will attach an event listener to it to make it close properly
            var closeButton = $("close_popupelement");
            if (closeButton) {
                Event.observe(closeButton, "click", this.hide.bind(this));
            }
        }
    },

    _transformResult: function(response) {

    }
}

var InlinePopup = Class.create();
Object.extend(InlinePopup.prototype, GenericPopup.prototype);
Object.extend(InlinePopup.prototype, {
    initialize: function(id, target, background) {
        this.id = id;
        this.target = target;
        this.background = background;
    },

    show: function(){
        Element.show(this.background);
        Element.show(this.target);
    },

    hide: function() {
        Element.hide(this.background);
        Element.hide(this.target);
    }

});

var AjaxPopup = Class.create();
Object.extend(AjaxPopup.prototype, GenericPopup.prototype);
Object.extend(AjaxPopup.prototype, {
    show: function() {
        if (Prototype && (ajaxObj = new Ajax.Request)) {
            var ajax = new Ajax.Request(
                this.url,
            {
                method: 'post',
                onSuccess: this._fetchDone.bind(this),
                onFailure: this._fetchError.bind(this)
            });
         }
    },

    _fetchDone: function(response){
        this._createPopup(response.responseText);

    },

    _fetchError: function(){
        this.hidePopup();
        alert('There was an error when loading the popup. Please try again later.');
    }
});


function hideNoJSFallbacks() {
    var anchors = $A(document.getElementsByTagName("A"));
    var fallbacks = anchors.findAll(
            function(elem) {
                return Element.hasClassName(elem,"no_js");
            }
    );
    fallbacks.each(function(elem) {
        Element.hide(elem);
    });
}

function initPopups() {
    var anchors = $A(document.getElementsByTagName("A"));
    var popups = anchors.findAll(
            function(elem) {
                return Element.hasClassName(elem,"ajaxpopup") || Element.hasClassName(elem, "popup");
            }
    );
    popups.each(function(elem) {
        if(Element.hasClassName(elem, "ajaxpopup")){
            var ajaxpopup = new GenericPopup(elem.id + "_popup", elem.href, elem.className);
            Event.observe(elem, "click", popup.launch.bindAsEventListener(ajaxpopup));
        }else{
            var content = document.getElementsByClassName("frame", elem.parentNode);
            var background = document.getElementsByClassName("popupelement_back", elem.parentNode);
            if(content.length > 0){
                var inlinePopup = new InlinePopup("", content[0], background[0]);
                Event.observe(elem, "click", inlinePopup.show.bind(inlinePopup));

                var closeButtons = document.getElementsByClassName("close", content[0]);
                if(closeButtons.length>0){
                    Event.observe(closeButtons[0], "click", inlinePopup.hide.bind(inlinePopup));
                }
            }
        }
        Element.show(elem);
    });
}

function bindPopup(ajaxPopup){
    ajaxPopup.show.bind(ajaxPopup);
}

function showPopup(event, url) {
    var sourceElement = Event.element(event);
    var id = sourceElement.id;
    var scrollPos = getScrollXY();
    var xPos = scrollPos[0] + 195;
    var yPos = scrollPos[1] + 90;
    var target;
    if (event.target) {
        target = event.target;
    } else if (event.srcElement) {
        target = event.srcElement;
    }
    var ajaxPopup = new AjaxPopup(id, url, xPos, yPos, target)
    ajaxPopup.show.bind(ajaxPopup);
    ajaxPopup.show();
    Event.stop(event);
}

function displayPopup(id, url) {
    var sourceElement = document.getElementById(id);
    var scrollPos = getScrollXY();
    var xPos = scrollPos[0] + 195;
    var yPos = scrollPos[1] + 90;
    var ajaxPopup = new AjaxPopup(id, url, xPos, yPos, sourceElement)
    ajaxPopup.show.bind(ajaxPopup);
    ajaxPopup.show();
}

function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Fix for Safari
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}
addOnLoad(hideNoJSFallbacks);
addOnLoad(initPopups);
