Type.registerNamespace('AjaxControlToolkit');
Type.registerNamespace('BlueBridge.SharePointExtensions.MasterPages.Ajax');

BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior = function(element) 
{
    BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior.initializeBase(this, [element]);
    
    // Property values
    this._popupControlSrc = null;
    
    this._popupFrameSrc = null;
    this._popupFrameContainerID = null;
    
    this._clickedCssClass = null;
    this._hoverCssClass = null;
    this._activeParentCssClass = null;
    this._activePopupCssClass = null;   
    this._loadingCssClass = null;
       
    // Handler delegates
    this._onMouseOverHandler = null;
    this._onMouseOutHandler = null; 
}

BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior.prototype = 
{
    initialize : function() 
    {
        BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior.callBaseMethod(this, 'initialize'); 
        
        this.extendElement();   
        this.extendPopupBehavior();     
        this.extendCloseButton();   
    },
    dispose : function()
    {
        var element = this.get_element();
        
        if (element) 
        {
            if (this._onMouseOverHandler) 
            {
                $removeHandler(element, 'mouseover', this._onMouseOverHandler);
                this._onMouseOverHandler = null;
            }
            if (this._onMouseOutHandler) 
            {
                $removeHandler(element, 'mouseout', this._onMouseOutHandler);
                this._onMouseOutHandler = null;
            }
        }

        BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior.callBaseMethod(this, 'dispose');
    },
    get_popupControlSrc : function() 
    {
        return this._popupControlSrc;
    },
    set_popupControlSrc : function(value) 
    {
        if (this._popupControlSrc != value) 
        {
            this._popupControlSrc = value;
            this.raisePropertyChanged('PopupControlSrc');
        }
    },
    get_popupFrameSrc : function() 
    {
        return this._popupFrameSrc;
    },
    set_popupFrameSrc : function(value) 
    {
        if (this._popupFrameSrc != value) 
        {
            this._popupFrameSrc = value;
            this.raisePropertyChanged('PopupFrameSrc');
        }
    },
    get_popupFrameContainerID : function() 
    {
        return this._popupFrameContainerID;
    },
    set_popupFrameContainerID : function(value) 
    {
        if (this._popupFrameContainerID != value) 
        {
            this._popupFrameContainerID = value;
            this.raisePropertyChanged('PopupFrameContainerID');
        }
    },
    get_clickedCssClass : function() 
    {
        return this._clickedCssClass;
    },
    set_clickedCssClass: function(value) 
    {
        if (this._clickedCssClass != value) 
        {
            this._clickedCssClass = value;
            this.raisePropertyChanged('ClickedCssClass');
        }
    },
    get_hoverCssClass : function() 
    {
        return this._hoverCssClass;
    },
    set_hoverCssClass: function(value) 
    {
        if (this._hoverCssClass != value) 
        {
            this._hoverCssClass = value;
            this.raisePropertyChanged('HoverCssClass');
        }
    },
    get_activeParentCssClass : function() 
    {
        return this._activeParentCssClass;
    },
    set_activeParentCssClass: function(value) 
    {
        if (this._activeParentCssClass != value) 
        {
            this._activeParentCssClass = value;
            this.raisePropertyChanged('ActiveParentCssClass');
        }
    },
    get_activePopupCssClass : function() 
    {
        return this._activePopupCssClass;
    },
    set_activePopupCssClass: function(value) 
    {
        if (this._activePopupCssClass != value) 
        {
            this._activePopupCssClass = value;
            this.raisePropertyChanged('ActivePopupCssClass');
        }
    },
    get_loadingCssClass : function() 
    {
        return this._loadingCssClass;
    },
    set_loadingCssClass : function(value) 
    {
        if (this._loadingCssClass != value) 
        {
            this._loadingCssClass = value;
            this.raisePropertyChanged('LoadingCssClass');
        }
    },
    extendElement : function() 
    {
        if(!this._hoverCssClass)
            return;
            
        var element = this.get_element();     
        if(element)
        {
            this._onMouseOverHandler = Function.createDelegate(this, this._onMouseOver);
            $addHandler(element, 'mouseover', this._onMouseOverHandler);
        
            this._onMouseOutHandler = Function.createDelegate(this, this._onMouseOut);
            $addHandler(element, 'mouseout', this._onMouseOutHandler);
        }       
    
    },
    extendPopupBehavior : function() 
    {
        var popupBehavior = this._popupBehavior;
        if(popupBehavior == null)
            return;

        popupBehavior.add_showing(Function.createDelegate(this, this._onPopupShowing));
        popupBehavior.add_shown(Function.createDelegate(this, this._onPopupShown));
        popupBehavior.add_hiding(Function.createDelegate(this, this._onPopupHiding));
        popupBehavior.add_hidden(Function.createDelegate(this, this._onPopupHidden));
    },
    extendCloseButton : function() 
    {
        var closeButton = null;
        var divs = $get(this._popupControlID).getElementsByTagName("div");
        
        for(var index = 0; index < divs.length; index++)
        {
            var elt = divs[index];
            if(Sys.UI.DomElement.containsCssClass(elt, "close"))
            {
                closeButton = elt.firstChild; 
                break;   
            }
        }
        // hook up the trigger if we have one.
        if (closeButton) 
            $addHandler(closeButton, "click", this._bodyClickHandler);
    },
    showPopup : function() 
    {
        var old = AjaxControlToolkit.PopupControlBehavior.__VisiblePopup;
        if (old && old._popupBehavior) {
            old.hidePopup();
        }

        this.populate();
        
        this._popupBehavior.set_x(this._getLeftOffset());
        this._popupBehavior.set_y(this._getTopOffset());
        this._popupBehavior.show();
        
        this._popupVisible = true;
        AjaxControlToolkit.PopupControlBehavior.__VisiblePopup = this;
    },
    populate : function(contextKeyOverride) 
    {
        // If the DynamicPopulateBehavior's element is out of date, dispose of it
        if (this._dynamicPopulateBehavior && (this._dynamicPopulateBehavior.get_element() != $get(this._DynamicControlID))) {
            this._dynamicPopulateBehavior.dispose();
            this._dynamicPopulateBehavior = null;
        }
        
        // If a DynamicPopulateBehavior is not available and the necessary information is, create one
        if (!this._dynamicPopulateBehavior && this._DynamicControlID && (this._DynamicServiceMethod || this._popupControlSrc)) 
        {
            this._dynamicPopulateBehavior = $create(BlueBridge.SharePointExtensions.MasterPages.Ajax.DynamicPopulateBehavior,
                {
                    "id" : this.get_id() + "_DynamicPopulateBehavior",
                    "ContextKey" : this._DynamicContextKey,
                    "ServicePath" : this._DynamicServicePath,
                    "ServiceMethod" : this._DynamicServiceMethod,
                    "cacheDynamicResults" : this._cacheDynamicResults,
                    "PopupControlSrc" : this._popupControlSrc 
                }, null, null, $get(this._DynamicControlID));

            // Attach event handlers
            this._dynamicPopulateBehavior.add_populating(this._populatingHandler);
            this._dynamicPopulateBehavior.add_populated(this._populatedHandler);
        }
        
        // If a DynamicPopulateBehavior is available, use it to populate the dynamic content
        if (this._dynamicPopulateBehavior) {
            this._dynamicPopulateBehavior.populate(contextKeyOverride ? contextKeyOverride : this._DynamicContextKey);
        }
    },
    setLoadingStyle : function(loading) 
    {
        if(this._loadingCssClass)
        {
            var dynamicControl = null;
            if(this._DynamicControlID) 
                dynamicControl = $get(this._DynamicControlID);
            if(dynamicControl != null)
            {
                if(loading)
                    Sys.UI.DomElement.addCssClass(dynamicControl, this._loadingCssClass);
                 else
                    Sys.UI.DomElement.removeCssClass(dynamicControl, this._loadingCssClass);
                
            }
        }
    
    },
    loadIFrame : function() 
    {
        if(!this._popupFrameSrc)
            return;
        
        var frameContainer = null;
        if(this._popupFrameContainerID)
            frameContainer = $get(this._popupFrameContainerID);
        if(!frameContainer)
            return;
            
        var loadingCssClass = this._loadingCssClass;
                    
        var frames = frameContainer.getElementsByTagName("IFRAME");
        if(frames.length == 0)
        {
            frameContainer.innerHTML='<iframe src="javascript: void(0);" frameborder="0" scrolling="no" style="width:100%; height:100%; margin:0; padding:0; background-color:transparent; overflow: hidden"></iframe>';
            var frame = frameContainer.getElementsByTagName("IFRAME")[0];
            var frameSrc = this._popupFrameSrc;
            if(loadingCssClass)
                Sys.UI.DomElement.addCssClass(frame, loadingCssClass);
            frame.src = frameSrc;
            frame.onreadystatechange  = function()
            {                
                var state = frame.readyState;              
                if(state == "complete")
                {
                    if(loadingCssClass)
                        Sys.UI.DomElement.removeCssClass(frame, loadingCssClass);
                    window.status = 'Frame ' + frameSrc + ' was loaded'; 
                    setTimeout( "window.status = '';", 5000);  
                }

            }
    
        }
    },
    _onFocus : function(e) 
    {        
        AjaxControlToolkit.PopupControlBehavior.__LastClickedPopup = this;
        
        // Set the popup position and display it
        if (!this._popupVisible) 
        {
            this.showPopup();
        }
        else
        {
            this.hidePopup();
        }
        if (e) 
        {
            e.stopPropagation();
        }
    },
    _onMouseOver : function() 
    {
        Sys.UI.DomElement.addCssClass(this.get_element(), this._hoverCssClass);
    },
    _onMouseOut : function() 
    {
        Sys.UI.DomElement.removeCssClass(this.get_element(), this._hoverCssClass);
    },
    _onPopulating : function(sender, eventArgs) 
    {
        this.setLoadingStyle(true);
        
        BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior.callBaseMethod(this, '_onPopulating', [sender, eventArgs]);
    },
    _onPopulated : function(sender, eventArgs) 
    {
        this.setLoadingStyle(false);
        
        BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior.callBaseMethod(this, '_onPopulated', [sender, eventArgs]);

        // Dynamic populate may have added content; re-layout to accomodate it
        this._popupBehavior.setupPopup();          
    },
    _onPopupShowing : function(sender, eventArgs)
    {
        var link = sender._parentElement;
        var panel = sender._element; 

        if(this._activePopupCssClass)
            Sys.UI.DomElement.addCssClass(panel, this._activePopupCssClass);

        this.loadIFrame();

        if(this._activeParentCssClass)
            Sys.UI.DomElement.addCssClass(link.parentNode, this._activeParentCssClass);
            
        if(this._clickedCssClass)    
            Sys.UI.DomElement.addCssClass(link, this._clickedCssClass);
    },
    _onPopupShown : function(sender, eventArgs)
    {
        if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.version < 7)) 
        {
            sender.show();
            sender.setupPopup();
        }
    },
    _onPopupHiding : function(sender, eventArgs)
    {
        var link = sender._parentElement;
        var panel = sender._element;
        
        this.setLoadingStyle(false);
        
        if(this._activePopupCssClass)
            Sys.UI.DomElement.removeCssClass(panel, this._activePopupCssClass);
        
        if(this._activeParentCssClass)
            Sys.UI.DomElement.removeCssClass(link.parentNode, this._activeParentCssClass);
            
        if(this._clickedCssClass)    
            Sys.UI.DomElement.removeCssClass(link, this._clickedCssClass);
    },
    _onPopupHidden : function(sender, eventArgs)
    {

    }
}
// This global variable tracks the currently clicked popup.  
AjaxControlToolkit.PopupControlBehavior.__LastClickedPopup = null;

BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior.registerClass('BlueBridge.SharePointExtensions.MasterPages.Ajax.PopupButtonBehavior', AjaxControlToolkit.PopupControlBehavior);

// Dynamically populates content when the populate method is called
BlueBridge.SharePointExtensions.MasterPages.Ajax.DynamicPopulateBehavior = function(element) 
{
    BlueBridge.SharePointExtensions.MasterPages.Ajax.DynamicPopulateBehavior.initializeBase(this, [element]);
    this._popupControlSrc = null;
}

BlueBridge.SharePointExtensions.MasterPages.Ajax.DynamicPopulateBehavior.prototype = 
{
    get_PopupControlSrc : function() 
    {
        return this._popupControlSrc;
    },

    set_PopupControlSrc : function(value) 
    {
        if (this._popupControlSrc != value) 
        {
            this._popupControlSrc = value;
            this.raisePropertyChanged('PopupControlSrc');
        }
    },
    _onMethodError : function(webServiceError, userContext, methodName) 
    {
        if (userContext != this._currentCallID) return;
        var e = this.get_element();
        if (e && webServiceError != null) 
        {
            e.innerHTML = "<div class=\"error\">" + webServiceError + "<\/div>";
        }
    },
    populate : function(contextKey) 
    {
        // Don't populate if we already cached the results
        if (this._populated && this._cacheDynamicResults) {
            return;
        }

        // Initialize the population if this is the very first call
        if (this._currentCallID == -1) {
            var eventArgs = new Sys.CancelEventArgs();
            this.raisePopulating(eventArgs);
            if (eventArgs.get_cancel()) {
                return;
            }
            this._setUpdating(true);
        }
        
        // Either run the custom population script or invoke the web service
        if (this._customScript) 
        {
            // Call custom javascript call to populate control
            var scriptResult = eval(this._customScript);
            this.get_element().innerHTML = scriptResult; 
            this._setUpdating(false);
         } 
         else 
         {
               
             this._currentCallID = ++this._callID;
             if (this._servicePath && this._serviceMethod) 
             {
                Sys.Net.WebServiceProxy.invoke(this._servicePath, this._serviceMethod, false,
                    { contextKey:(contextKey ? contextKey : this._contextKey) },
                    Function.createDelegate(this, this._onMethodComplete), Function.createDelegate(this, this._onMethodError),
                    this._currentCallID);
               
             }
             else if(this._popupControlSrc)
             {
                var context = {};
                context.id = this._id;
                context.currentCallID = this._currentCallID;
            
                PopupButtonExtender_DoCallback(context, this._popupControlSrc);          
             }
             
             $common.updateFormToRefreshATDeviceBuffer();
        }
    }
}

BlueBridge.SharePointExtensions.MasterPages.Ajax.DynamicPopulateBehavior.registerClass('BlueBridge.SharePointExtensions.MasterPages.Ajax.DynamicPopulateBehavior', AjaxControlToolkit.DynamicPopulateBehavior);

function PopupButtonExtender_OnCallbackComplete(result, context)
{
    if(context != null)
    {
        var behavior = $find(context.id);
        if(behavior != null)
            behavior._onMethodComplete(result, context.currentCallID, null);
    }
} 

function PopupButtonExtender_OnCallbackError(result, context)
{
    if(context != null)
    {
        var behavior = $find(context.id);
        if(behavior != null)
            behavior._onMethodError(result, context.currentCallID, null);
    }
} 
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();