(function(){
/*
	Class: Dialog
	Description:
	The base Dialog class used for generic user interaction
*/
function Dialog() 
{ 
	if( window["dlg_prefix"] ) 
		this.prefix = window["dlg_prefix"];
	else
		this.prefix = "";

	this.p_config = {};
	this.p_isShowing = false;
	this.submitUrl = null;
	this.action = null;

	var dd1 = new YAHOO.util.DD(this.prefix+"dialog1"); 

	this.dlg = YUIDom.get(this.prefix+"dialog1");
	dd1.setHandleElId(this.prefix+"drag_dialog1");
	this.overlayObj = YUIDom.get(this.prefix+ "overlay" );

	//add events
	//YUIEvent.addListener( "basicdialog_input", "keypress", this.onKeyPress, this, true );
	YUIEvent.addListener( this.prefix+"basicdialog_submit_button_tab", "click", this.submit, this, true );
	YUIEvent.addListener( this.prefix+"basicdialog_cancel_button_tab", "click", this.cancel, this, true );
	YUIEvent.addListener( this.prefix+"basicdialog_close",         "click", this.cancel, this, true );

}

/* -------------------------------------------- */

Dialog.prototype.init = function(idFocus)
{
	var handle = YUIDom.get(this.prefix+"drag_dialog1");
	handle.target = YUIDom.get(this.prefix+"dialog1");
					
	/* calculate dialog position in the center of screen (this is imperfect for Safari) */
	var viewportWidth=document.documentElement.clientWidth;
		if( !viewportWidth ) viewportWidth = document.body.clientWidth;
	var viewportHeight=document.documentElement.clientHeight;		
		if( !viewportHeight ) viewportHeight = document.body.clientHeight;

	var dialogWidth=handle.target.offsetWidth;
	var dialogHeight=handle.target.offsetHeight;
	var dialogTop = (viewportHeight/2) - (dialogHeight/2);
	var dialogLeft = (viewportWidth/2) - (dialogWidth/2);
	
	handle.target.style.top = dialogTop+"px";	
	handle.target.style.left = dialogLeft+"px";

	var basicdialog_input = YUIDom.get(this.prefix+"basicdialog_input");
	/* 
	 * set input field width to 0 before calculating 
	 * dialog width to make IE happy.
	 */
	basicdialog_input.style.width = 0+"px";
	basicdialog_input.style.width = Math.round( this.dlg.offsetWidth * 0.9)+"px";
	if(idFocus) document.getElementById(idFocus).focus();
};

/* -------------------------------------------- */

Dialog.prototype.toString = function() { return "[SB.ui.Dialog]"; };

//Group: Basic Methods 
/*
	Function: setConfig
	Establishes the basic setup for the Dialog.
	
	inConfig - A configuration array (key/value)
*/
Dialog.prototype.setConfig =  function( inConfig )
{
	this.p_config = inConfig;
	reset();
	
	this.action = inConfig.action;
	this.relobj = inConfig.obj;

	YUIDom.get(this.prefix+"basicdialog_title").innerHTML = inConfig.lable;

	if (inConfig.prompt) {
		YUIDom.get(this.prefix+"basicdialog_prompt").innerHTML = inConfig.prompt;
	}
	
	if ( inConfig.message ) {
		YUIDom.get(this.prefix+"basicdialog_message").innerHTML = inConfig.message;
		YUIDom.get(this.prefix+"basicdialog_message").style.display = "block";
	} else if( inConfig.messageNode ) {
		YUIDom.get(this.prefix+"basicdialog_message").appendChild( inConfig.messageNode );
		YUIDom.get(this.prefix+"basicdialog_message").style.display = "block";
	} else {
		YUIDom.get(this.prefix+"basicdialog_message").innerHTML = "";
		YUIDom.get(this.prefix+"basicdialog_message").style.display = "none";	
	}	

/*	
	var dlgmsg = YUIDom.get(this.prefix+"basicdialog_message");
	var children = YUIDom.getChildren( dlgmsg );
	//Get rid of everything after inItem
	for( el in children ) { dlgmsg.removeChild( children[el] ); }
*/

	if (inConfig.showSubmit == false )
	{
		YUIDom.get(this.prefix+"basicdialog_submit_button_tab").style.display="none";
	}

	if (inConfig.submitTitle) {
		YUIDom.get(this.prefix+"basicdialog_submit_button").innerHTML = inConfig.submitTitle;
	}
	if (inConfig.submitCancel) {
		YUIDom.get(this.prefix+"basicdialog_cancel_button_tab").style.display = "inline";
		YUIDom.get(this.prefix+"basicdialog_cancel_button").innerHTML = inConfig.submitCancel;
	}
	else
	{
		YUIDom.get(this.prefix+"basicdialog_cancel_button_tab").style.display = "none";
	}
	
	if ( inConfig.input ) {
		this.dlg.style.display = "block";
		YUIDom.get(this.prefix+"basicdialog_textfieldarea").style.display = "block";
	} else {
		YUIDom.get(this.prefix+"basicdialog_textfieldarea").style.display = "none";	
	}	
	
	
	this.show();

};

/*
	Function: getConfig
	Returns a configuration array for the Dialog.

	See <setConfig> for configuration array definition
*/
Dialog.prototype.getConfig = function()
{
	return this.p_config;
};

Dialog.prototype.show = function()
{
	this.parentNode = this.dlg.parentNode;
	this.overlayObj.appendChild( this.dlg );
	this.dlg.style.display = "block";
	this.dlg.style.visibility = "visible";
	this.overlayObj.style.display = "block";
};

Dialog.prototype.hide = function()
{
	this.parentNode.appendChild( this.dlg );
	this.dlg.style.display = "none";
	this.dlg.style.visibility = "hidden";

	this.overlayObj.style.display = "none";
};

Dialog.prototype.cancel = function( inEvent )
{
	this.destroy();
	YUIEvent.stopEvent(inEvent);

	return false;
};

Dialog.prototype.destroy = function( inEvent )
{
	reset();
	this.hide();
};

function reset()
{
	var prefix = "";

	if( window["dlg_prefix"] ) 
		prefix = window["dlg_prefix"];

	var dlgmsg = YUIDom.get(prefix+"basicdialog_message");
	var children = YUIDom.getChildren( dlgmsg );
	for( el in children ) { dlgmsg.removeChild( children[el] ); }
	dlgmsg.style.display = "none";

	var msg = YUIDom.get(prefix+"basicdialog_message");
	var errMsg = YUIDom.get(prefix+"basicdialog_errormessage");
	
	msg.innerHTML = "";
	msg.style.display = "none";	

	errMsg.innerHTML = "";
	errMsg.style.visibility = "hidden";
	errMsg.style.display = "none";	
	
	YUIDom.get(prefix+"basicdialog_textfieldarea").style.display = "none";
	YUIDom.get(prefix+"basicdialog_input").value = "";	
	YUIDom.get(prefix+"basicdialog_title").innerHTML = "";
	YUIDom.get(prefix+"basicdialog_submit_button").innerHTML = "Submit";
	YUIDom.get(prefix+"basicdialog_cancel_button").innerHTML = "Cancel";
	YUIDom.get(prefix+"basicdialog_submit_button_tab").style.display ="inline";

}

Dialog.prototype.showErrorMessage = function( errMsgTxt )
{
	var errMsg = YUIDom.get(this.prefix+"basicdialog_errormessage");
	errMsg.innerHTML = YUIDom.get(this.prefix+ errMsgTxt ).innerHTML;
	errMsg.style.visibility = "visible";
	errMsg.style.display = "block";	
};


Dialog.prototype.hideErrorMessage = function( errMsg )
{
	YUIDom.get(this.prefix+"basicdialog_errormessage").innerHTML = "";
	YUIDom.get(this.prefix+"basicdialog_errormessage").style.visibility = "hidden";	
};
/*
	Function: submit 
	Removes the Dialog, cleans up memory	
*/
Dialog.prototype.submit = function( inEvent )
{
	//var formObj = YUIDom.getElementsBy( function(){return true;}, "form", this.contentHtmlObj );
	
	var action = this.action;
	var args = null;
	var postdata = "";
	
	if( action.search("/box/add") != -1 )
	{
		var name = encodeURIComponent(YUIDom.get(this.prefix+"basicdialog_input").value);
		if( !name )
		{	
			this.showErrorMessage( "sb_error_dlg_empty" );
			return;
		}
		
		this.submitUrl = "/box/add";
		postdata =  "container_id="+SButil.StateManager.currentContainer.container_obj.container_id;
		postdata += "&name="+name;
		postdata += "&pos=-1";

		args = { action:"addCrate", 
			 name:YUIDom.get(this.prefix+"basicdialog_input").value,
			 container:SButil.StateManager.currentContainer.container_obj};
	
	} 

	if( action.search("/box/sadd") != -1 )
	{
		var name = YUIDom.getElementsByClassName( "box_create_name", "input", this.dlg ); 
		if( !(name[0].value) )
		{
			this.showErrorMessage( "sb_error_dlg_empty" );		
			return;
		}

		var encname = encodeURIComponent(name[0].value);

		this.submitUrl = "/box/add";
		postdata =  "container_id="+SButil.StateManager.currentContainer.container_obj.container_id;
		postdata += "&name="+encname;

		var susers = YUIDom.getElementsByClassName( "box_create_share", "textarea", this.dlg ); 
		if( (susers[0].value) )
		{
			var message = YUIDom.getElementsByClassName( "box_create_share_message", "textarea", this.dlg ); 
			postdata += "&share_users="+encodeURIComponent(susers[0].value);
			postdata += "&share_message="+encodeURIComponent(message[0].value);
		}

		postdata += "&pos=0";

		args = { action:"addBoxFront", 
			 name:name[0].value,
			 container:SButil.StateManager.currentContainer.container_obj
		};
	
	}

	// rename box
	if( action.search("/box/update") != -1 )
	{
		var name = encodeURIComponent(YUIDom.get(this.prefix+"basicdialog_input").value);
		if( !name )
		{	
			this.showErrorMessage( "sb_error_dlg_empty" );
			return;
		}

		this.submitUrl = "/box/update"; 
		postdata = "id="+SButil.StateManager.currentBox.box_obj.box_id;
		postdata += "&name="+name;

		SButil.StateManager.currentBox.rename( YUIDom.get(this.prefix+"basicdialog_input").value );

		args = { action:"updateCrate", 
				name:YUIDom.get(this.prefix+"basicdialog_input").value, 
				boxId:SButil.StateManager.currentBox.box_obj.box_id };
	} 
	
	//delete box
	if( action.search("/box/remove") != -1 )
	{
		this.submitUrl = "/box/remove";
		postdata = "id="+this.relobj.box_obj.box_id;
		
		args = { action:"deleteCrate", 
				 box:this.relobj,
				 container:this.relobj.box_obj.container};
	} 

	//delete comment 
	if( action.search("/comment/remove") != -1 )
	{
		this.submitUrl = "/comment/remove";
		postdata = "id="+this.relobj.comment_obj.id;
		
		args = { action:"deleteComment", item_id:this.relobj.comment_obj.item.item_id }

		this.relobj.comment_obj.kill();
		this.relobj.destroy();
	}

	//add container
	if( action.search("/container/add") != -1 )
	{
		var name = encodeURIComponent(YUIDom.get(this.prefix+"basicdialog_input").value);
		if( !name )
		{	
			this.showErrorMessage( "sb_error_dlg_empty" );
			return;
		}

		this.submitUrl = "/container/add";
		postdata = "name="+encodeURIComponent(YUIDom.get(this.prefix+"basicdialog_input").value);
		postdata += "&pos=-1";
		args = { action:"addContainer", 
			   name:YUIDom.get(this.prefix+"basicdialog_input").value
			};
	}
	//delete container
	if( action.search("/container/remove") != -1 )
	{
		this.submitUrl = "/container/remove";
		postdata = "id="+this.relobj.container_obj.container_id;

		args = { action:"deleteContainer", 
				containerId:this.relobj.container_obj.container_id};
	}
	//submit feedback
	if( action.search("/feedback/send") != -1 )
	{
		this.submitUrl = "/feedback/send";

		var message = YUIDom.getElementsByClassName( "feedback_message", "textarea", this.dlg ); 
		var emailaddress = YUIDom.getElementsByClassName( "feedback_email", "input", this.dlg ); 

		postdata = "message="+encodeURIComponent(message[0].value);
		if( emailaddress.length )
			postdata += "&email="+encodeURIComponent(emailaddress[0].value);

		args = { action:"sendFeedback" };
	}

	//rename container
	if( action.search("/container/update") != -1 )
	{
		var name = encodeURIComponent(YUIDom.get(this.prefix+"basicdialog_input").value);
		if( !name )
		{	
			this.showErrorMessage( "sb_error_dlg_empty" );
			return;
		}

		this.submitUrl = "/container/update"; 
		postdata = "id="+SButil.StateManager.currentContainer.container_obj.container_id;
		postdata += "&name="+name;

		SButil.StateManager.currentContainer.rename( YUIDom.get(this.prefix+"basicdialog_input").value );

		args = { action:"updateContainer", 
				name:YUIDom.get(this.prefix+"basicdialog_input").value,
				containerId:SButil.StateManager.currentContainer.container_obj.container_id};
	}
	//twitter
	if( action.search("twitter") != -1 )
	{
		var statusUpd = YUIDom.getElementsByClassName( "twitter_status", "textarea", this.dlg ); 

		var box = SButil.StateManager.currentBox.box_obj;
		box.twitter.extra = statusUpd[0].value;

		this.submitUrl = "/box/setservice/"; 
		postdata = "id="+SButil.StateManager.currentBox.box_obj.box_id;
		postdata += "&service_id=1";
		postdata += "&activated=1";
		postdata += "&extra="+encodeURIComponent(statusUpd[0].value);

		args = { action:"twitter" };
	}

	//delicious
	if( action.search("delicious") != -1 )
	{
		var statusUpd = YUIDom.getElementsByClassName( "delicious_tags", "input", this.dlg ); 

		var box = SButil.StateManager.currentBox.box_obj;
		box.delicious.extra = statusUpd[0].value;

		this.submitUrl = "/box/setservice/"; 
		postdata = "id="+SButil.StateManager.currentBox.box_obj.box_id;
		postdata += "&service_id=2";
		postdata += "&activated=1";
		postdata += "&extra="+encodeURIComponent(statusUpd[0].value);

		args = { action:"delicious" };
	}

	if( this.submitUrl )
	{
		var callback = { success:this.callbackSuccess,
				 failure:this.callbackFailure,
				 timeout:5000,
				 arguments:{ dlgObj:this, param:args } };

		YUIRequest.asyncRequest('POST', this.submitUrl, callback, postdata );
	}
	
	this.destroy();
	YUIEvent.stopEvent(inEvent);

	return true;
};

/*
	Function: isShowing 
	Returns whether the Dialog is currently displayed	
*/
Dialog.prototype.isShowing = function()
{
	return this.p_isShowing;
};


//Group: Delegate Methods 
/*
	Function: validate
	A stub function which is called before submission of the Dialog.
	Returns TRUE to always allow form submission
*/
Dialog.prototype.validate = function()
{
	return true;
};

/*
	Function: callbackSuccess 
	A stub function which is called in a Form dialog if the submission succeeded.

	inReq - the request object 
*/
Dialog.prototype.callbackSuccess = function( inReq )
{
//alert("success");
	var param = null;
	//this.arguments.dlgObj.destroy();
	
	if( !window["SButil"] ) return; 

	var currentContainer = SButil.StateManager.currentContainer;
	var currentBox = SButil.StateManager.currentBox
	
	if(this.arguments.param.action ) {
		//Add a New Box
		if(this.arguments.param.action == "addCrate") {
			
			var newBoxAttr = YUIJSON.parse( inReq.responseText );
			param = {   name:this.arguments.param.name,
				      id:newBoxAttr.id,
				     container:this.arguments.param.container,
				     tofront:false};
			
			SButil.EventManager.fireEvent( "BoxAdded", param );

		} else

		//Add a New Box
		if(this.arguments.param.action == "addBoxFront") {
			
			var newBoxAttr = YUIJSON.parse( inReq.responseText );
			param = {   name:this.arguments.param.name,
				      id:newBoxAttr.id,
				   share:true,
				container:this.arguments.param.container,
				     tofront:true};
			
			SButil.EventManager.fireEvent( "BoxAdded", param );

		} else

		
		//Delete Box
		if(this.arguments.param.action == "deleteCrate") {

			param = {box:this.arguments.param.box,
				     container:this.arguments.param.container};
			         SButil.EventManager.fireEvent( "BoxDeleted", param );
			
		} else 
		
		//Add a New Container
		if(this.arguments.param.action == "addContainer") {

			var newContainerAttr = YUIJSON.parse( inReq.responseText );
			param = {name:this.arguments.param.name,
				   id:newContainerAttr.id};
			
			SButil.EventManager.fireEvent( "ContainerAdded", param );
		} else 
		//Delete Container
		if(this.arguments.param.action == "deleteContainer") {
			param = {container_id:this.arguments.param.containerId};
			SButil.EventManager.fireEvent( "ContainerDeleted", param );
		} else 
		//Delete Comment 
		if(this.arguments.param.action == "deleteComment") {
			param = {item_id:this.arguments.param.item_id};
			SButil.EventManager.fireEvent( "ItemCommentDeleted", param );
		} else {
			return;
		}
		
	}
};

/*
	Function: callbackFailure
	A stub function which is called in a Form dialog if the submission failed.

	inReq - the request object 
*/
Dialog.prototype.callbackFailure = function( inReq )
{
//alert("failure");
	var junk = 0;
	var junk2 = 0;
	
};

Dialog.prototype.onKeyPress = function( e )
{
   var key;

   if(window.event)
          key = window.event.keyCode;     //IE
   else
          key = e.which;     //firefox

   if(key == 13)
	   this.submit();
};



function destruct( inObj ) { delete inObj; }

window['SB']['ui']['Dialog'] = new Dialog();
window['SB']['ui']['DialogType'] = { Alert:0, Form:1, Confirm:2, Critical:3 };
})();

