/// <reference name="MicrosoftAjax.debug.js" />
/// <reference name="SharePoint.Ajax.js" />
//-----------------------------------------------------------------------
// SharePoint AJAX Library : me@danlarson.com 
//-----------------------------------------------------------------------
// Shared Source License: www.codeplex.com/sharepointajax.

/////////////////////////////////////////////////////////////////////////////////////////////
// XHtmlComponent is a generic Sys.Component for creating DIV elements from HTTP resources //
// Example:
//    var host = $get(controlID); 
//    var control = document.createElement('DIV');
//    host.appendChild(control);
//    var component = new SharePoint.Ajax.XHtmlComponent(control);
//    component.LoadXml('/_layouts/example/exampleUI.html');
// 
// Within the html document, the body tag's first DIV will be inserted into this component.
// To close the component, call the Close method as follows from within the component's html: 
// <div onclick="javascript:SharePoint.Ajax.XHtmlComponent.Close(this);">Close</div>
/////////////////////////////////////////////////////////////////////////////////////////////

// Dependencies: SharePoint.Ajax.js
if (typeof (SharePoint.Ajax) == 'undefined')
    Type.registerNamespace('SharePoint.Ajax');

/////////////////////////////////////////////////////////////////
// XHtmlComponent Component
SharePoint.Ajax.XHtmlComponent = function(element) {
    SharePoint.Ajax.XHtmlComponent.initializeBase(this); //, [element]);
    this.element = element;
    // Set a reference for accessing this guy later:
    element.XHtmlComponent = this;
    element.controlType = 'XHtmlComponent';
}
SharePoint.Ajax.XHtmlComponent.prototype = {
    initialize: function() {
        SharePoint.Ajax.XHtmlComponent.callBaseMethod(this, "initialize");
    },
    _rendered: false,
    _xml: null,
    _visible: true,
    element: null,
    timerID: null,
    xmlUrl: null,

    set_Visible: function(visible) {
        this._visible = visible;
        if (this.element == null) return;
        if (visible) {
            this.element.style.display = 'block';
            if (this.parentElement != null)
                this.parentElement.style.display = 'block';
        } else {
            this.element.style.display = 'none';
            if (this.parentElement != null)
                this.parentElement.style.display = 'none';
        }
    },

    set_Control: function(control) {
        this.element = control;
        if (this._xml != null)
            this.Render();
    },

    set_Xml: function(xml) {
        this._xml = xml;
        this.Render();
    },

    parentElement: null,
    set_Parent: function(control) {
        this.parentElement = control;
    },

    LoadXml: function(url) {
        if (this.xmlUrl != url) {
            this._rendered = false;
        }
        this.xmlUrl = url;
        if (url == null && url == '') return;
        if (this.xmlLoaderDelegate == null)
            this.xmlLoaderDelegate = Function.createDelegate(this, this.LoadXmlComplete);

        var request = new Sys.Net.WebRequest();
        request.get_headers()["X-SPAJAX"] = "XHtmlComponent.LoadXml";
        request.set_url(url);

        var userContext = new Object();
        request.set_userContext(userContext);

        if (this.xrefresh) {
            request.get_headers()["X-FORCE"] = "true";
            this.xrefresh = null;
            userContext.refresh = true;
        }

        request.add_completed(this.xmlLoaderDelegate);
        request.invoke();
        //SharePoint.Ajax.DataLoader(url, 'set_Xml', this);
    },

    LoadXmlComplete: function(response) {
        if (response == null) return;
        var request = response.get_webRequest();
        var context = request.get_userContext();
        var status = response.get_statusCode();
        var url = request.get_url();
        var xml = response.get_xml();
        var content = document.createElement('div');
        content.innerHTML = response.get_responseData();
        this.element.innerHTML = content.innerHTML;
        this.set_Xml(xml);
    },

    Render: function() {
        // Doesn't really render, as that is done in the loadxmlcomplete handler. 
        //  But retained to handle post render events and custom code.
        if (this.parentElement != null)
            this.parentElement.style.display = '';
        this.element.style.display = '';
        this._rendered = true;
        try {
            if (this.onrender != null)
                this.onrender();
        }
        catch (e) {
            Sys.Debug.trace("Could not call the XmlComponent's onrender method: " + e.description);
        }
    },

    // Dispose of any resources used by the component
    dispose: function() {
        this._xml = null;
        if (this.element != null) {
            this.element.XHtmlComponent = null;
            this.element.controlType = null;
            this.element.innerHTML = '';
            if (this.element.parentNode)
                this.element.parentNode.removeChild(this.element);
            else if (this.element.parent)
                this.element.parent.removeChild(this.element);
        }
        if (this.xmlLoaderDelegate) delete this.xmlLoaderDelegate;
        this.element = null;
        SharePoint.Ajax.XHtmlComponent.callBaseMethod(this, 'dispose');
    }
}

SharePoint.Ajax.XHtmlComponent.Close = function(element) {
    var component = SharePoint.Ajax.FindParentControl(element, 'XHtmlComponent');
    if (component != null) {
        component.XHtmlComponent.dispose();
    }
}

SharePoint.Ajax.XHtmlComponent.inheritsFrom(Sys.Component);
SharePoint.Ajax.XHtmlComponent.registerClass('SharePoint.Ajax.XHtmlComponent', Sys.Component);