



/*
 The Event manager object, manages events
*/

var PEEventManager=new Object();

PEEventManager._tp_observers=new Hash(); //hash
PEEventManager.currentPortlet='default';
/*
registers an observer
*/
PEEventManager.registerObserver= function(portletName,compName,obsFunction) {

    if (!this._tp_observers.get(portletName+"_"+compName))
        this._tp_observers.set(portletName+"_"+compName,new Array());

    var observer=new Object();
    observer.funct=obsFunction;
    observer.portletName=this.currentPortlet;
    //alert("registering for:"+this.currentPortlet);
    this._tp_observers.get(portletName+"_"+compName).push(observer);
}

PEEventManager.setCurrentPortlet= function(portlet) {
    this.currentPortlet=portlet;
    //alert("setting for:"+this.currentPortlet);
}


/*
 fires an event 
*/
PEEventManager.fireEvent= function(portletName,compName,eventObj) {
    if (this._tp_observers.get(portletName+"_"+compName))
        for (i=0;i<this._tp_observers.get(portletName+"_"+compName).length;i++)
            this._tp_observers.get(portletName+"_"+compName)[i].funct(eventObj);
}

/*
 removes all observers from a particular portlet, used for disappearing portlets
*/
PEEventManager.removeObservers= function(observerPortlet) {
    //alert("remove called with:"+observerPortlet);
    var newobservers=new Hash();
    //alert(this._tp_observers);
    var keys=this._tp_observers.keys();
    
    for (var i=0;i<keys.length;i++) {
        var lab=keys[i];
      
        for (var j=0;j<this._tp_observers.get(lab).length;j++) {
           
            if (this._tp_observers.get(lab)[j].portletName!=observerPortlet) {
                
                if (!newobservers.get(lab))
                    newobservers.set(lab,new Array());
                newobservers.get(lab).push(this._tp_observers.get(lab)[j]);
               
            } 
        }
    }

    this._tp_observers=newobservers;
    //alert('removeexited');
}

var PEAjaxUtils=new Object();
PEAjaxUtils.windowLoaded=false;

Event.observe(window, 'load', function() {
    PEAjaxUtils.windowLoaded=true;
});

/*
 * loads a portlet, the callback receives the markup of the request
 *
 */
PEAjaxUtils.loadPortlet= function(portletid,callback,params) {

  PEAjaxUtils.callAction(portletid, "doView", callback,params);
}

/*
 * refreshes a portlet, the callback, if present, is called after load
 *
 */
PEAjaxUtils.refreshPortlet= function(portletid,refreshElementId,callback,params) {


    PEAjaxUtils.loadPortlet(portletid,function(markup) {

       var oldelements=$$('#'+refreshElementId);


       if (oldelements.length>0)
          oldelements[0].update(PEAjaxUtils.selectHtml(markup, refreshElementId));

       if (callback)
           callback();
       
       
    },params);
}

/**
 * refreshes a page portion using a url
 */
 PEAjaxUtils.refreshElementByUrl= function(url,refreshElementId,callback,params) {

    if (!params) {
        params=new Object();
    }
    params.tmt=(new Date()).getTime();

    document.body.style.cursor = 'wait';

    new Ajax.Request(url, {
                          method: 'get',
                          parameters: params,
                          onSuccess: function(transport) {

                                var oldelements=$$('#'+refreshElementId);


                               if (oldelements.length>0)
                                  oldelements[0].update(PEAjaxUtils.selectHtml(transport.responseText, refreshElementId));

                               if (callback)
                                   callback();
                          },
                          onComplete: function() {
                              document.body.style.cursor = 'default';

                          }
                        });
}
/**
 * refreshes a page portion and passes markup to callback
 */
 PEAjaxUtils.getPagePortion= function(url,parentElementId,callback,params) {

    if (!params) {
        params=new Object();
    }
    params.tmt=(new Date()).getTime();

    document.body.style.cursor = 'wait';

    new Ajax.Request(url, {
                          method: 'get',
                          parameters: params,
                          onSuccess: function(transport) {

                               if (callback)
                                   callback(PEAjaxUtils.selectHtml(transport.responseText, parentElementId));
                          },
                          onComplete: function() {
                              document.body.style.cursor = 'default';

                          }
                        });
}


/*
 * calls a portlet action, the callback receives the markup of the request
 *
 */
PEAjaxUtils.callAction= function(portletid,action,callback,params) {



    if (!params) {
        params=new Object();
    }
    params.tmt=(new Date()).getTime();
    params["pe_ajaxform_request"]="true";
    document.body.style.cursor = 'wait';
    PEAjaxUtils.scheduleSessionRefresh();
    new Ajax.Request(portletid+'_'+action+'.pe', {
                                  method: 'get',
                                  parameters: params,
                                  onSuccess: function(transport) {

                                    callback(transport.responseText);
                                  },
                                  onComplete: function() {
                                      document.body.style.cursor = 'default';

                                  }
                                });
};


/**
 * selects a piece of markup from a markup based on id
 */
PEAjaxUtils.selectHtml=function (markup,tagid) {
    var element=document.createElement("div");
    element.innerHTML=markup;
    var newelements=element.getElementsByTagName("*");
    for (i=0;newelements.length>0;i++)
       if (newelements[i].getAttribute("id")==tagid)
            return newelements[i].innerHTML;

    return "";
}

PEAjaxUtils._sessionRefreshId=-1;

PEAjaxUtils.scheduleSessionRefresh=function() {
    window.clearTimeout(PEAjaxUtils._sessionRefreshId);
    PEAjaxUtils._sessionRefreshId=window.setTimeout(PEAjaxUtils._sessionRefresh, 1);
}
PEAjaxUtils._sessionRefresh=function() {
    
    RemoteProxy.checkSession( {callback:
            
            function(data) {
                                                     
                if (data.sessionValid)
                    return;
                
                if (data.redirectPath) {
                    
                    document.location=data.redirectPath;
                }
                                        
            }
    });
                                                   
    PEAjaxUtils._sessionRefreshId=window.setTimeout(PEAjaxUtils._sessionRefresh, 30000);
}


/**
 * opens a popup containing the given element and returns the popup frframe element, element must have an id
 */
PEAjaxUtils.openPopup= function(element,callback) {


        var scrollOffs=document.viewport.getScrollOffsets();
        var viewDims=document.viewport.getDimensions();

        var frameid=element.getAttribute("id")+'_pe_popupframe';
        var popup=$(frameid);
        var container=$$('body')[0];

        if (!popup) {
           

                popup=$(document.createElement("div"));
                

                var dimensions=container.getDimensions();
                var w=dimensions.width;
                if (w<viewDims.width)
                    w=viewDims.width;
                var h=dimensions.height;
                if (h<viewDims.height)
                    h=viewDims.height;

                popup.setStyle({position:"absolute",
                               top:"0px",
                               left:"0px",
                               width:w+"px",
                               height:h+"px",
                               "text-align":"center",
                               "z-index": "999"

                              });

                popup.addClassName("popup_overlay");
                //new Effect.Opacity(overdiv,{from:0.0,to:0.5,duration:0.4});
                popup.id=frameid;
                container.appendChild(popup);



                //sets style of the popup and eventually positiones it
                element.style["z-index"]="1000";
                element.style["position"]="absolute";
                

                popup.appendChild(element);

                       

        }
        
        element.style["display"]="block";
        

        popup.style.display="block";

        
        var elDims=element.getDimensions();

        element.style["top"]=(((viewDims.height-elDims.height)/2)+scrollOffs.top)+"px";
        element.style["left"]=(((viewDims.width-elDims.width)/2)+scrollOffs.left)+"px";


        if (callback)
            callback();
        

        return popup;
    }



PEAjaxUtils.closePopup=function(frameelement) {
        
            frameelement.style.display="none";
       
    }

   




