//
// 2005-10-18
// Copyright (c) Art. Lebedev Studio | http://www.artlebedev.ru/
// Author - Leechy | leechy@design.ru
//

// default values
var bECReplaceFormTarget = false;
var bECReplaceLinkTarget = false;
var sECContentElementID = null;
var bECDisplayAllIfNotCE = false;
var sECErrorIfNotCE = null;
var sECPlaceholder = null;
var bECEnableBackBtn = false;

var sECFrameNamePrefix = 'externalContentFrame';
var iECFramesCounter = 0;


/*---------------*/
/*     Obect     */
/*---------------*/
function ExternalContent(oElem, oOptions) {
	var oThis = this;
	this.oTargetElem = oElem;
	this.oBufferFrame = createECBufferFrame();
	this.sOriginalHTML = oElem.innerHTML;

	// options
	this.bReplaceFormTarget = defaultOption(oOptions, 'bReplaceFormTarget', bECReplaceFormTarget);
	this.bReplaceLinkTarget = defaultOption(oOptions, 'bReplaceLinkTarget', bECReplaceLinkTarget);
	this.sContentElementID = defaultOption(oOptions, 'sContentElementID', sECContentElementID);
	this.bDisplayAllIfNotCE = defaultOption(oOptions, 'bDisplayAllIfNotCE', bECDisplayAllIfNotCE);
	this.sErrorIfNotCE = defaultOption(oOptions, 'sErrorIfNotCE', sECErrorIfNotCE);
	this.sPlaceholder = defaultOption(oOptions, 'sPlaceholder', sECPlaceholder);
	
	this.bEnableBackBtn = defaultOption(oOptions, 'bEnableBackBtn', bECEnableBackBtn);

	this.fOnAfterLoad = defaultOption(oOptions, 'fOnAfterLoad', null);

	return this;
}

/*---------------------------------------*/
/*     Load and display HTML methods     */
/*---------------------------------------*/
ExternalContent.prototype.loadHTML = function(sAddress) {
	// Attach HTML-handlers
		var oThis = this;
		// Mozilla, Safari and Opera understands onload event
		this.oBufferFrame.onload = function() { oThis.displayHTML(oThis); }
		// MSIE - onreadystatechange
		this.oBufferFrame.onreadystatechange = function() { oThis.displayHTML(oThis); }

	// change buffer frame source
	if (this.oBufferFrame.contentDocument) {
		this.oBufferFrame.contentDocument.location.replace(sAddress);
	} else if (this.oBufferFrame.contentWindow) {
		this.oBufferFrame.contentWindow.document.location.replace(sAddress);
	} else {
		this.oBufferFrame.src = sAddress;
	}
}

ExternalContent.prototype.displayHTML = function(oThis) {
	if (oThis && oThis.oBufferFrame) {
		// check is load complete
		if (oThis.oBufferFrame.readyState && oThis.oBufferFrame.readyState != 'complete') return true;

		// get irame document
		var oFrameDocument = null;
		if (oThis.oBufferFrame.contentDocument) {
			oFrameDocument = oThis.oBufferFrame.contentDocument;
		} else if (oThis.oBufferFrame.contentWindow) {
			oFrameDocument = oThis.oBufferFrame.contentWindow.document;
		}
		var oContentBody = oFrameDocument.getElementsByTagName('body')[0];

		// check for specific element
		if (oThis.sContentElementID) {
			var oContentElement = oFrameDocument.getElementById(oThis.sContentElementID);
			if (oContentElement) {
				oContentBody = oContentElement;
			} else {
				if (!oThis.bDisplayAllIfNotCE) oContentBody = null;
			}
		}
		
		if (oContentBody) {
			// replacå target attribute in forms
			if (oThis.bReplaceFormTarget) {
				var oForms = oContentBody.getElementsByTagName('form');
				for (var i = 0; i < oForms.length; i++) oForms[i].target = oThis.oBufferFrame.name;
			}
	
			// replacå target attribute in links
			if (oThis.bReplaceLinkTarget) {
				var oLinks = oContentBody.getElementsByTagName('a');
				for (var i = 0; i < oLinks.length; i++) oLinks[i].target = oThis.oBufferFrame.name;
			}
			// display content in the target element
			oThis.oTargetElem.innerHTML = (oContentBody.firstChild)? oContentBody.innerHTML : oThis.sOriginalHTML;
		} else {
			oThis.oTargetElem.innerHTML = (oThis.sErrorIfNotCE)? oThis.sErrorIfNotCE : '';
		}

		if (oThis.fOnAfterLoad) oThis.fOnAfterLoad();
	}
}


/*------------------------------*/
/*     Additional functions     */
/*------------------------------*/
function defaultOption(oOptions, vOptionValue, vDefault) {
	if (oOptions && oOptions[vOptionValue] != null) return oOptions[vOptionValue];
	else return vDefault;
}

function createECBufferFrame() {
	// create iframe with name
	if (document.all && !window.opera) {
		// to submit a form in JS-created iframe in MSIE it have to be created with HTML string as an argument
		var oNewIFrame = document.createElement('<iframe name="' + sECFrameNamePrefix + iECFramesCounter + '" />');
	} else {
		var oNewIFrame = document.createElement('iframe');
		oNewIFrame.name = sECFrameNamePrefix + iECFramesCounter;
	}
	iECFramesCounter++;

	// hide it
	oNewIFrame.style.width = '100px';
	oNewIFrame.style.height = '100px';
	oNewIFrame.style.position = 'absolute';
	oNewIFrame.style.top = '-1000px';
	oNewIFrame.style.visibility = 'hidden';

	var oBody = document.getElementsByTagName('body')[0];
	oBody.insertBefore(oNewIFrame, oBody.firstChild);

	return oNewIFrame;
}
