var otm = otm ? otm : {};
otm.widget = otm.widget ? otm.widget : {};

otm.widget.DynamicFlashDiv = function(flashIdParam, flashSrcParam, flashWidthParam, flashHeightParam, styleParam, bgcolorParam, flashVarsParam, wmodeParam) {
    var flashId = flashIdParam;
    var flashSrc = flashSrcParam;
    var width = flashWidthParam;
    var height = flashHeightParam;
	var style = styleParam;
	var bgcolor = bgcolorParam;
	var wmode = wmodeParam == null ? '' : wmodeParam;
    var flashVars = flashVarsParam;

    var parentDiv = null;
	var videoPlayer = null;
	var callback = null;

	var externalCallList = new Array();
	var processingExternalCall = false;
	
	function renderFlash() {
        if(parentDiv == null) {
            var delay = 100;
            setTimeout( function() { renderFlash() }, delay );
			return;
		} else {
            videoPlayer = new otm.widget.embed.VideoPlayer(parentDiv.id, flashId, width, height, style, flashSrc, wmode, bgcolor, 'scale', flashVars);
			videoPlayer.render();
			callback();
        }
    }

    this.render = function(divParam, callbackParam) {
        callback = callbackParam;

        var childDivId = divParam.id + '_flash';
        var div = document.createElement('div');
        div.setAttribute('id', childDivId);

        divParam.appendChild(div);
        parentDiv = div;

        renderFlash();
    }

	this.call = function(command, arg) {
		videoPlayer.call(command, arg);
    }
}

otm.widget.DynamicDivContent = function(contextPathParam, dcId, fragmentIdParam, dynamicFragment) {
	var contextPath = contextPathParam;
	var divId = dcId;
    var fragmentId = fragmentIdParam;
    var callback = null;

    var divRendered = false;
    var htmlContent = null;

    this.getHTMLContent = function() {
        return htmlContent == null ? '' : htmlContent;
    }
    
    var handleResponseSuccess = function(responseXML) {
        htmlContent = responseXML;

        divRendered = true;
        
        callback();
    }

    var handleResponseFailure = function() {
        document.getElementById(divId).innerHTML = "";
    }

    this._processResponseSuccess = function(responseObject) {
        handleResponseSuccess(responseObject.request.responseText);
    }

    this._processResponseError = function(responseObject) {
        handleResponseFailure();
    }
    
    this.requestDivContent = function() {
		var params = new Array();
        var view;
		if (dynamicFragment) {
			view = 'dynamic_fragment';
			params.push("p=" + fragmentId);
		} else {
			view = 'fragment';
			params.push("id=" + fragmentId);
			params.push("a=" + new Date().valueOf());
		}

        var url = contextPath + view + '?' + params.join("&");

        var successHandler = this._processResponseSuccess;
        var failureHandler = this._processResponseError;

        XMLUtil.sendPostXMLHttpRequest(url, successHandler, this, failureHandler);
    }

    this.render = function(divParam, callbackParam) {
        callback = callbackParam;

        if(!divRendered && fragmentIdParam != null && fragmentIdParam != '') {
            this.requestDivContent();
        } else {
            callback();
        }
    }
}

otm.widget.DynamicDiv = function(divIndexParam, divStyleParam, callbackParam) {
    var divIndex = divIndexParam;
    var divStyle = divStyleParam;
    var callback = callbackParam;

    var contentList = new Array();
    var currentIndex = 0;

    var div = null;
    var divRendered = false;
	var origTextAlign = null;

	function doneRendering() {
        var dynDivContent = contentList[currentIndex];
        if(dynDivContent.getHTMLContent) {
			var htmlContent = dynDivContent.getHTMLContent();

			if(htmlContent == null || htmlContent == '') {
				div.style.display = 'none';
			}

			div.style.textAlign = origTextAlign;
			
			div.innerHTML = htmlContent;
		}

		if(!divRendered) {
            callback();
		}

		divRendered = true;
    }
    
    this.addDivContent = function(dynamicDivContent) {
        var nextIndex = contentList.length;
        contentList[nextIndex] = dynamicDivContent;
    }

    this.setCurrentContent = function(index) {
        currentIndex = index;
    }
    
    this.showContent = function(index) {
        if(index == currentIndex) {
            doneRendering();
            return;
        }

        currentIndex = index;
        
		var dynDivContent = contentList[currentIndex];

		if(dynDivContent.getHTMLContent != null) {
			div.style.textAlign = 'center';
			div.innerHTML = '<img src="images/spinners/ajax-loader.gif" />';
		} else {
			div.innerHTML = '';
		}

		div.style.display = 'block';
		
		dynDivContent.render(div, doneRendering);
    }
    
    this.callContent = function(command, param) {
        if(contentList[currentIndex].call)
            contentList[currentIndex].call(command, param);
    }

    this.render = function(parentDiv) {
        if(div == null) {
            var childDivId = 'DynDiv_' + divIndex;
            div = document.createElement('div');
            div.setAttribute('id', childDivId);
			div.setAttribute('style', divStyle);

            parentDiv.appendChild(div);
        }

		origTextAlign = div.style.textAlign;

		contentList[currentIndex].render(div, doneRendering);
    }
}

otm.widget.DynamicContent = function(parentDivId, dynamicFragment) {
    var parentDiv = null;

    var divCount = 0;
    var dynamicDivList = new Array();
    var currentRenderIndex = null;

    function doneRendering() {
        var nextRenderIndex = currentRenderIndex + 1;
        currentRenderIndex = null;

		if(nextRenderIndex < dynamicDivList.length) {
            renderContent(nextRenderIndex);
        } else {
            parentDiv.style.display = 'block';
        }
    }
    
    function renderContent(index) {
        currentRenderIndex = index;

        var dynamicDivContent = dynamicDivList[currentRenderIndex];
        dynamicDivContent.render(parentDiv);
    }

    this.createDynamicDiv = function(style) {
        return {index: divCount++, style: style};
    }
    
	this.addFlashContent = function(dynDivParamObject, width, height, style, flashId, flashSrc, bgcolorParam, flashVarsParam, wmodeParam) {
		var index = dynDivParamObject.index;
		var div = new otm.widget.DynamicFlashDiv(flashId, flashSrc, width, height, style, bgcolorParam, flashVarsParam, wmodeParam);

		var dynDiv = dynamicDivList[index];
		if(dynamicDivList[index] == null) {
			dynDiv = new otm.widget.DynamicDiv(index, dynDivParamObject.style, doneRendering);
			dynamicDivList[index] = dynDiv;
		}

		dynDiv.addDivContent(div);
		return div;
	}

    this.setCurrentContent = function(dynDivParamObject, index) {
        var dynDiv = dynamicDivList[dynDivParamObject.index];
        if(dynDiv != null) {
            dynDiv.setCurrentContent(index);
        }
    }

    this.addFragmentContent = function(contextPath, dynDivParamObject, fragmentId) {
        var index = dynDivParamObject.index;
        var div = new otm.widget.DynamicDivContent(contextPath, index, fragmentId, dynamicFragment);

        var dynDiv = dynamicDivList[index];
        if(dynDiv == null) {
            dynDiv = new otm.widget.DynamicDiv(index, dynDivParamObject.style, doneRendering);
            dynamicDivList[index] = dynDiv;
        }

        dynDiv.addDivContent(div);
        return div;
    }

    this.showIndexedDivContent = function(dynDivParamObject, contentIndex) {
        var divIndex = dynDivParamObject.index;
        var dynamicDivContent = dynamicDivList[divIndex];
        dynamicDivContent.showContent(contentIndex);
    }
    
    this.callIndexedDiv = function(dynDivParamObject, method, param) {
        var divIndex = dynDivParamObject.index;
        var dynamicDivContent = dynamicDivList[divIndex];
        dynamicDivContent.callContent(method, param);
    }

    this.render = function() {
        parentDiv = document.getElementById(parentDivId);
        renderContent(0);
    }
}
