/* -------------------------------------------------------------------------- */
/** 
 *    @fileoverview
 *       Control for Pseudo Dialog content pages.
 *
 *    @version 2.0.20090614
 *    @requires jquery.js
 *    @requires bajl.js
 *    @requires bajl.keyEquiv.js     (optional)
 *    @requires bajl.pseudoDialog.js (in parent window page)
 */
/* -------------------------------------------------------------------------- */
(function($) {



/* --------------- Settings for BAJL.PseudoDialogContent --------------- */
/** 
 * setting for {@link BAJL.PseudoDialogContent}
 * @namespace default setting for {@link BAJL.PseudoDialogContent}
 * @fieldOf BAJL.settings
 * @prperty {String} stateCName        className for document.body for when the page is content of iframe {@link BAJL.PseudoDialogContentFrame.frame}
 * @prperty {String} defaultBtnExpr    expression to find default button element(s)
 * @prperty {Number} closeBtnExpr      expression to find close button element(s)
 */
BAJL.settings.PseudoDialogContent = {
	  'stateCName'     : 'BAJLPseudoDialogContentPage'
	, 'defaultBtnExpr' : 'a.BAJLPseudoDialogDefaultBtn'
	, 'closeBtnExpr'   : 'a.BAJLPseudoDialogCloseBtn'
};



/* --------------- Class : BAJL.PseudoDialogContent --------------- */
/**
 * provides control of 'pseudo dialog' content (use this as single object!).
 * @class pseudo dialog content
 * @extends BAJL.Observable
 * @constructor
 */
BAJL.PseudoDialogContent = function() {
	if (BAJL.env.isDOMReady) {
		this.init();
	}
}

BAJL.PseudoDialogContent.prototype = new BAJL.Observable;

/** 
 * initialize, setup event handlers.
 * @private
 */
BAJL.PseudoDialogContent.prototype.init = function() {
	// preparations
	var settings = BAJL.settings.PseudoDialogContent;
	$(document.body).addClass(settings.stateCName);
	$(document.documentElement).css('width', BAJL.GetGeometry().pageW + 'px');

	// setup event handlers for buttons
	$(settings.defaultBtnExpr).click(BAJL.Delegate(this.defaultBtnClicked, this));
	$(settings.closeBtnExpr  ).click(BAJL.Delegate(this.closeBtnClicked  , this));

	// set key equivalents
	if (typeof BAJL.KeyEquiv != 'undefined') {
		BAJL.Singleton(BAJL.KeyEquiv).addKey('!', this.closeBtnClicked, this);
	}

	// post process
	new BAJL.Timeout(function() {
		window.scrollTo(0, 0); // workaround to Gecko, iframe scroll position is corrupted when browser window is minimized.
		BAJL.Singleton(parent.BAJL.PseudoDialog).contentFrame.setContent(this);
	}, 100, this);
}

/** 
 * process 'default button (OK button)' clicked behavior (event handler).
 * @param {Event} e    event object
 * @private
 */
BAJL.PseudoDialogContent.prototype.defaultBtnClicked = function(e) {
	if (e) e.preventDefault();
	this.doCallback('onDefaultBtnClicked');
}

/** 
 * process 'close button (CANCEL button)' clicked behavior (event handler).
 * @param {Event} e    event object
 * @private
 */
BAJL.PseudoDialogContent.prototype.closeBtnClicked = function(e) {
	if (e) e.preventDefault();
	this.doCallback('onCloseBtnClicked');
}

/**
 * set focus to default button node.
 */
BAJL.PseudoDialogContent.prototype.setDefaultFocus = function() {
	var $node = $(BAJL.settings.PseudoDialogContent.defaultBtnExpr).eq(0).focus();
	if (!$node.is('a, area, input, select, textarea')) {
		window.focus();
		$('a, area, input, textarea, select, button').eq(0).focus();
	}
}

/**
 * get geometry of dialog content page.
 * @return associative array of geometry: windowW, windowH, pageW, pageH, windowX, windowY, scrollX, scrollY, mouseX, mouseY, nodeName, zoom, scrollBar.
 * @type Object
 */
BAJL.PseudoDialogContent.prototype.getGeometry = function() {
	var geom = BAJL.GetGeometry();
	if (BAJL.ua.isOpera) {
		geom.pageW = document.documentElement.offsetWidth ; // but opera returns invalid offsetWidth value...
		geom.pageH = document.documentElement.offsetHeight;
	}
	return geom;
}



/* -------------------- Main : register start-up -------------------- */

$(function() {
	if (typeof parent.BAJL.PseudoDialog != 'undefined') {
		BAJL.Singleton(BAJL.PseudoDialogContent);
	}
});



})(jQuery);

