/**
* Copyright (c) iModel Ltd 2009
* Author: Phil Ewington (phil.ewington@i-model.co.uk)
* Dependencies: YUI library (connection manager)
*				YUI library (animation utility)
* History:		Added fading animation (16/11/2009)	
*				Updated to YUI3 library (uses node, anim & io classes)			
*/

// create global dialog object
if (!this.dialog) {
	var dialog = {};
}

YUI().use('node','anim','io', function(Y) {

	// create dialog object
	if (typeof(dialog.create) !== 'function') {
		dialog.create = function() {
			Y.one('#dialog-modal').setStyle('opacity',0);
			//Y.one('#dialog').setStyle('opacity',0);
		};
		
		dialog.loaded = false;
		dialog.params = {};
		dialog.buttons = [];
	}
	
	// display dialog
	if (typeof(dialog.show) !== 'function') {
		dialog.show = function(params) {
		
			dialog.params = params;
			
			Y.one('#dialog-modal').setStyle('display','block');
			
			var startLoad = function() {
				
				var vw = Y.one('body').get('winWidth');
				var vh = Y.one('body').get('winHeight');
				
				if (!dialog.params.width) dialog.params.width = 400;
				if (!dialog.params.height) dialog.params.height = 30;
				
				// display title bar?
				if (dialog.params.hideTitleBar) Y.one('#dialog-title-bar').setStyle('display','none');
				
				// resize dialog
				Y.one('#dialog').setStyle('width',dialog.params.width + 'px');
				Y.one('#dialog-content').setStyle('height',dialog.params.height + 'px');
				
				// position dialog
				if (dialog.params.top) {
					Y.one('#dialog').setStyle('top', Y.one('window').get('scrollTop') + 'px');
				}
				else {
					Y.one('#dialog').setStyle('top',(((vh - dialog.params.height) / 2) + Y.one('window').get('scrollTop') - 100) + 'px');
				}
				Y.one('#dialog').setStyle('left',((vw - dialog.params.width) / 2) + 'px');
				
				// display dialog
				Y.one('#dialog').setStyle('display','block');
				
				// display title?
				if (dialog.params.dialogTitle) {
					Y.one('#dialog-title').setStyle('display','block');
					Y.one('#dialog-title').set('innerHTML',dialog.params.dialogTitle);
				}
				
				// display dialog icon?
				if (dialog.params.dialogIcon) {
					Y.one('#dialog-content').addClass('dialog-icon-'+dialog.params.dialogIcon);
				}
				
				// display text message
				if (dialog.params.dialogText) {
					
					// display text...
					Y.one('#dialog-content').set('innerHTML',dialog.params.dialogText);
					
					// init onLoad event
					if (params.onLoad) {
						params.onLoad();
						params.onLoad = {};
					}
				}
				
				// display content via Ajax?
				if (dialog.params.contentURL) {
					
					// set IO transaction event context
					var ajaxObj = {
						process: function(str, args) {
							//alert(str);
							var node = Y.one('#dialog-content');
							node.set('innerHTML',str);
							dialog.loaded = true;
							// init onLoad event
							if (dialog.params.onLoad) {
								dialog.params.onLoad();
								dialog.params.onLoad = {};
							}
						},
						success: function(id, o, args) {
							Y.one('#dialog-content').removeClass('ajaxloading');
							this.process(o.responseText);
						},
						failure: function(id, o, args) {
							Y.one('#dialog-content').removeClass('ajaxloading');
						},
						start: function() {
							Y.one('#dialog-content').addClass('ajaxloading');
						}
					}
					
					// transaction cfg obj
					var cfg = {
						on : {success: ajaxObj.success, failure: ajaxObj.failure, start:ajaxObj.start, end:ajaxObj.end},
						context: ajaxObj
					};
					
					// make xhr request
					var request = Y.io(dialog.params.contentURL, cfg);
				}
				
				// dialog close button
				Y.on('click',  dialog.clickHandler, '#dialog-close-button', Y, 0);
				dialog.buttons.push({id:'dialog-close-button', handler:dialog.close});
				
				// generated dialog buttons
				var c = Y.one('#dialog-buttons');
				
				if (dialog.params.hideButtons) {
					// dont display any buttons
					c.setStyle('display','none');
					
					// dialog close button
					Y.on('click',  dialog.clickHandler, '#custom-dialog-close-button', Y, 0);
					dialog.buttons.push({id:'custom-dialog-close-button', handler:dialog.close});
				}
				else {
					c.set('innerHTML','');
					if (!dialog.params.buttons) {
						buttonStr = '<input id="dialog-ok-button" type="button" class="button" value="OK" />';
						c.append(buttonStr);
						Y.on('click', dialog.clickHandler, '#dialog-ok-button', Y, 1);
						dialog.buttons.push({id:'dialog-ok-button', handler:dialog.close});
					}
					else
					{
						for (var i=0; i<dialog.params.buttons.length; i++) {
							if (dialog.params.buttons[i].submit) {
								buttonStr = '<input id="'+dialog.params.buttons[i].id+'" type="submit" class="button" value="'+dialog.params.buttons[i].text+'" />';
								Y.on('click', dialog.clickHandler, '#'+dialog.params.buttons[i].id, Y, i+1);
								dialog.buttons.push({id:dialog.params.buttons[i].id, handler:dialog.params.buttons[i].handler});
							}
							else {
								buttonStr = '<input id="'+dialog.params.buttons[i].id+'" type="button" class="button" value="'+dialog.params.buttons[i].text+'" />';
								Y.on('click', dialog.clickHandler, '#'+dialog.params.buttons[i].id, Y, i+1);
								dialog.buttons.push({id:dialog.params.buttons[i].id, handler:dialog.params.buttons[i].handler});
							}
							c.append(buttonStr);
						}
					}	
				}
			}
			
			// set animation object
			var fadeIn = new Y.Anim({
				node: '#dialog-modal',
				to: { opacity: 0.9 },
				duration: 0.4
			});
			fadeIn.on('end', startLoad);
			fadeIn.run();
		}
	}
	
	// run handlers on buttons
	if (typeof(dialog.clickHandler) !== 'function') {
		dialog.clickHandler = function(e, id) {
			dialog.buttons[id].handler();
		};
	}
	
	// close dialog
	if (typeof(dialog.close) !== 'function') {
		dialog.close = function (params) {
			
			if(params) dialog.params = params;
			
			Y.one('#dialog').setStyle('display','none');
			
			// run on end of animation
			var complete = function () {
				
				// close dialog containers
				Y.one('#dialog-modal').setStyle('display','none');
				
				// handle redirect
				//if (params.redirect) document.location.href = params.redirectURL;
				
				// handle callbacks
				if (dialog.params.callback) {
					if (!dialog.params.callback.config) dialog.params.callback.config = {};
					dialog.params.callback(dialog.params.callback.config);
				}
					
				// remove button nodes
				for (var i=0; i<dialog.buttons.length; i++) {
					Y.detach('click', dialog.clickHandler, '#'+dialog.buttons[i].id);
				}

				// remove icon classes
				Y.one('#dialog-content').removeClass('dialog-icon-question');
				Y.one('#dialog-content').removeClass('dialog-icon-alert');
				Y.one('#dialog-content').removeClass('dialog-icon-information');
				
				Y.one('#dialog-title-bar').setStyle('display','block');
				Y.one('#dialog-buttons').setStyle('display','block');
				
				// reset obejcts/arrays
				dialog.params = {};
				dialog.buttons = [];
				
				// delete data
				Y.one('#dialog-title').set('innerHTML', '');
				Y.one('#dialog-content').set('innerHTML', '');
				Y.one('#dialog-buttons').set('innerHTML', '');

			}
			
			// close dialog
			var fadeOut = new Y.Anim({
				node: '#dialog-modal',
				to: { opacity: 0 },
				duration: 0.4
			});
			fadeOut.on('end', complete);
			fadeOut.run();
		}
	}
	
	// form submit handler
	if(typeof(dialog.submit) !== 'function') {
		dialog.submit = function() {
			Y.one('#dialog-form').set('action', dialog.params.submitURL);
		};
	}
	
	Y.on('domready', dialog.create);
});
