window.org_eclipse_osbp_utils_vaadin_saiku_SaikuRenderer = function() {

    // Replace the normal jQuery getScript function with one that supports
    // debugging and which references the script files as external resources
    // rather than inline.
/*  */  jQuery.extend({
        getScript: function(url, callback) {
            var head = document.getElementsByTagName("head")[0];
            var script = document.createElement("script");
            script.src = url;

            // Handle Script loading
            {
                var done = false;

                // Attach handlers for all browsers
                script.onload = script.onreadystatechange = function(){
                    if ( !done && (!this.readyState ||
                            this.readyState == "loaded" || this.readyState == "complete") ) {
                        done = true;
                       if (callback)
                            callback();

                        // Handle memory leak in IE
                        script.onload = script.onreadystatechange = null;
                    }
                };
            }

            head.appendChild(script);

            // We handle everything using the script element injection
            return undefined;
        }
    });


//	saikuCreationCode = "";

	//setCreationCode(this.getState().saikuCreationCode);
	//this.onStateChange = function() {
	//	setCreationCode(this.getState().saikuCreationCode);
	//}
	
	//eval(saikuCreationCode);
	
	
	var element = this.getElement();
	var root = d3.select(element);
	root.append("div").attr("id", "header").attr("class", "hide").attr("style", "display:none");
	root.append("div").attr("class", "processing_container");
	var processingDiv = root.append("div").attr("class", "processing");
	var processingInnerDiv = processingDiv.append("div").attr("class", "processing_inner");
	processingInnerDiv.append("span").attr("class", "saiku_logo");
	var processingContentDiv = processingInnerDiv.append("div").attr("class", "processing_content");
	processingContentDiv.append("span").attr("class", "processing_image").text("\&nbsp\;");
	processingContentDiv.append("span").attr("class", "processing_message i18n").text("Loading...");
	
	
	var body = d3.select("body")
	
	addJQueryTScriptElementToBody(root, "template-toolbar", this.getState().saikuJQueryTemplateToolbarCode);
	addJQueryTScriptElementToBody(root, "template-upgrade", this.getState().saikuJQueryTemplateUpgradeCode);
	addJQueryTScriptElementToBody(root, "template-logincount", this.getState().saikuJQueryTemplateLogincountCode);
	addJQueryTScriptElementToBody(root, "template-cubes", this.getState().saikuJQueryTemplateCubesCode);
	addJQueryTScriptElementToBody(root, "template-dimensions", this.getState().saikuJQueryTemplateDimensionsCode);
	addJQueryTScriptElementToBody(root, "template-measures", this.getState().saikuJQueryTemplateMeasuresCode);
	addJQueryTScriptElementToBody(root, "template-calculated-measures", this.getState().saikuJQueryTemplateCalculatedMeasuresCode);
	addJQueryTScriptElementToBody(root, "template-calculated-member", this.getState().saikuJQueryTemplateCalculatedMemberCode);
	addJQueryTScriptElementToBody(root, "template-workspace", this.getState().saikuJQueryTemplateWorkspaceCode);
	addJQueryTScriptElementToBody(root, "template-attributes", this.getState().saikuJQueryTemplateAttributesCode);
	addJQueryTScriptElementToBody(root, "template-workspace-dropzones", this.getState().saikuJQueryTemplateWorkspaceDropzonesCode);
	addJQueryTScriptElementToBody(root, "template-workspace-toolbar", this.getState().saikuJQueryTemplateWorkspaceToolbarCode);
	addJQueryTScriptElementToBody(root, "template-query-toolbar", this.getState().saikuJQueryTemplateQueryToolbarCode);
	addJQueryTScriptElementToBody(root, "template-open-dialog", this.getState().saikuJQueryTemplateOpenDialogCode);
	addJQueryTScriptElementToBody(root, "template-repository-objects", this.getState().saikuJQueryTemplateRepositoryObjectsCode);
	addJQueryTScriptElementToBody(root, "template-repository-folder", this.getState().saikuJQueryTemplateRepositoryFolderCode);
	addJQueryTScriptElementToBody(root, "template-folder-lazyload", this.getState().saikuJQueryTemplateRepositoryFolderLazyloadCode);
	addJQueryTScriptElementToBody(root, "template-repository-file", this.getState().saikuJQueryTemplateRepositoryFileCode);
	addJQueryTScriptElementToBody(root, "template-selections", this.getState().saikuJQueryTemplateSelectionsCode);
	addJQueryTScriptElementToBody(root, "template-selections-totals", this.getState().saikuJQueryTemplateSelectionsTotalsCode);
	addJQueryTScriptElementToBody(root, "template-selections-options", this.getState().saikuJQueryTemplateSelectionsOptionsCode);
	addJQueryTScriptElementToBody(root, "template-permissions", this.getState().saikuJQueryTemplatePermissionsCode);
	addJQueryTScriptElementToBody(root, "template-permissions-rolelist", this.getState().saikuJQueryTemplatePermissionsRolelistCode);
	addJQueryTScriptElementToBody(root, "template-drillthrough", this.getState().saikuJQueryTemplateDrillthroughCode);
	addJQueryTScriptElementToBody(root, "template-drillacross", this.getState().saikuJQueryTemplateDrillacrossCode);
	addJQueryTScriptElementToBody(root, "template-drillthrough-list", this.getState().saikuJQueryTemplateDrillthroughListCode);
	addJQueryTScriptElementToBody(root, "template-drillthrough-dimensions", this.getState().saikuJQueryTemplateDrillthroughDimensionsCode);
	addJQueryTScriptElementToBody(root, "template-drillthrough-measures", this.getState().saikuJQueryTemplateDrillthroughMeasuresCode);
	
	//body.append("script").attr("src", "VAADIN/themes/osbp/plugin/saiku.osgi/resources/js/ga.js").attr("type", "text/javascript")
	
	//eval(this.getState().saikuJsJQueryPlaceHolderCode);
	
	//root.append("script").attr("type", "text/javascript").text(this.getState().saikuJsJQueryPlaceHolderCode);
	
	/*window.document.dispatchEvent(new Event('DOMContentLoaded', {
												bubbles: true,
												cancelable: true
											 }));
	
	document.addEventListener("DOMContentLoaded", ready);
	document.addEventListener('readystatechange', () => log('readyState:' + document.readyState));*/
	
	// Use the handy event callback
	document.addEventListener( "DOMContentLoaded", completed );

	// A fallback to window.onload, that will always work
	window.addEventListener( "load", completed );
	jQuery.isReady = false;
	jQuery.ready();
}

// The ready event handler and self cleanup method
function completed() {
	document.removeEventListener( "DOMContentLoaded", completed );
	window.removeEventListener( "load", completed );
	jQuery.ready();
}

function addJQueryTScriptElementToBody(element, templateId, code) {
	element.append("script").attr("id", templateId).attr("type", "text/x-jquery-tmpl").text(code);
}

function ready() {
    alert('DOM is ready');
}



