/*
 * Helpful functions
 */

function Bb_Prompt( Caption, Default )
{
	var Result = Default ? Default : new String();
	var First = Default ? true : false;

	while ( Result.trim().length == 0 || First )
	{
		First = false;

		Result = prompt(Caption, Result);
		if ( Result == null )
			return null;
	}

	return Result;
};

function AttachIFrameDocHandler( IFrameObj, Event, Handler )
{
	if (typeof document.addEventListener == "function")
		IFrameObj.addEventListener( Event, Handler, false); 
	else
		IFrameObj.attachEvent( "on" + Event, Handler, false); 
}

/*
 * Some element extensions
 */

Element.extend({
	enable: function()
	{
		this.disabled = false;
		this.removeClass('Disabled');
	},

	disable: function()
	{
		this.disabled = true;
		this.addClass('Disabled');
	},

	childOf: function( Element )
	{
		var currentParent = this.getParent();

		while( currentParent != null && currentParent != document.body )
		{
			if ( currentParent == Element )
				return true;

			currentParent = currentParent.getParent();
		}

		return false;
	},

	nearestParentTagElement: function( Tag )
	{
		var currentParent = this.getParent();

		while( currentParent != null && currentParent != document.body )
		{
			if ( currentParent.getTag() == Tag )
				return currentParent;

			currentParent = currentParent.getParent();
		}

		return false;
	},

	ProgressOn: function()
	{
		this.addClass('Progress');
	},

	ProgressOff: function()
	{
		this.removeClass('Progress');
	},

	Invisible: function()
	{
		this.addClass('Invisible');
	},

	Visible: function()
	{
		this.removeClass('Invisible');
	},

	IsVisible: function()
	{
		var currentParent = this.getParent();

		while( currentParent != null && currentParent != document.body )
		{
			if ( currentParent.hasClass('Hidden') )
				return false;

			currentParent = currentParent.getParent();
		}

		return true;
	},

	InsertTextAtCursor: function(text){
		if (document.selection) {
			this.focus();
			sel = document.selection.createRange();
			sel.text = text + sel.text;
			this.focus();
		} else if (this.selectionStart || this.selectionStart == '0') {
			var prevScrollTop = this.scrollTop;
			var startPos = this.selectionStart;
			this.value = this.value.substring(0, startPos) + text + this.value.substring(startPos, this.value.length);
			this.selectionStart = startPos + text.length;
			this.selectionEnd = this.selectionStart;
			this.scrollTop = prevScrollTop;
			this.focus.delay(20, this);
		} else
			this.value += text;
	}
});

/*
 * Hotkey Selector
 */

var CHotkeySelector = new Class({
	ContainerElement: null,
	Key: null,
	Modifiers: null,
	Function: Class.Empty,

	initialize: function( ContainerId, Key, Modifiers, Function )
	{
		this.Key = Key;
		this.Modifiers = Modifiers;
		this.Function = Function;
		
		if ( $type(ContainerId) == 'string' && ContainerId.length )
			this.ContainerElement = $(ContainerId);
	}
});

/*
 * Common client-side form handler class
 */

 var CFormHandler = new Class({
	Assets: Class.Empty,
	ActiveSpinners: null,

	KeyMap: Class.Empty,
	Locks: null,

	options:
	{
		assets: Class.empty,
		keymap: Class.empty
	},

	initialize: function( options )
	{
		if (window.ie)
			$(document).addEvent('keydown', this.HandlePageKeys.bind(this) );
		else
			$(window).addEvent('keydown', this.HandlePageKeys.bind(this) );

		this.setOptions(options);

		if ( this.options.assets != Class.empty )
		{
			this.Assets = new Hash();

			for (var key in this.options.assets)
			{
				new Asset.image('/' + this.options.assets[key] );
				this.Assets.set( key, '/' + this.options.assets[key] );
			}
		}
		
		this.ReBindKeymap();

		this.Locks = new Hash();
		this.ActiveSpinners = new Hash;
	},
	
	ReBindKeymap: function()
	{
		if ( this.options.keymap !== Class.empty )
		{
			this.KeyMap = [];

			for (var key in this.options.keymap)
			{
				var mapElement = key;
				var containerElement = '';
				if (key.test(/^[a-z0-9_]+:/i))
				{
					var Parts = key.split(':');
					mapElement = Parts[1].trim();

					containerElement = Parts[0].trim();
				}

				var KeySets = mapElement.split(',');
				KeySets.each(function(KeySet) {
					KeySet = KeySet.trim();
					var Parts = KeySet.split("+");
					if ( Parts.length )
					{
						this.KeyMap.include(new CHotkeySelector( containerElement, Parts.getLast(), Parts.remove( Parts.getLast() ), this.options.keymap[key] ));
					}
				}, this);
			}
		}
	},

	SetLock: function( Name )
	{
		this.Locks.set(Name, 1);
	},

	GetLock: function( Name )
	{
		return this.Locks.hasKey(Name);
	},

	RemoveLock: function( Name )
	{
		this.Locks.remove(Name);
	},

	fixFormHeight: function()
	{
		var HeightFix = $('HeightFix');
		if (HeightFix)
			HeightFix.style.height = '1px';
	},

	hideSaveSpinner: function(responseText)
	{
		var Spinner = $('Spinner');
		if (Spinner)
			Spinner.hide();
	},

	requestFailure: function()
	{
		alert(this.response.text.removeScripts());
	},

	completeRequest: function()
	{
		this.hideSaveSpinner();
		this.fixFormHeight();
	},

	displayError: function(message, elementId)
	{
		if ( !elementId )
			$('Message').innerHTML = "<span class=\"Message Error\">"+message+"</span>"
		else
			$(elementId).innerHTML = "<span class=\"Message Error\">"+message+"</span>"
	},

	showFailure: function( transport )
	{
		this.displayError(transport.response.text, transport.options.errorBlockId);
		this.hideSaveSpinner();
		this.fixFormHeight();
	},

	displayFormError: function( transport )
	{
		if ( !$(transport.options.errorBlockId) )
			return;
			
		var ErrElement = $(transport.options.errorBlockId);

		ErrElement.innerHTML = transport.response.text;
		ErrElement.setStyle('background-color', '#f00');
		ErrElement.show();
		
		(new Fx.Style(ErrElement, 'background-color', {duration:700})).start(
			'#f00',
			'#ffffcc'
		);
	},
	
	showFormError: function(Message, ErrElement)
	{
		ErrElement.innerHTML = Message;
		ErrElement.setStyle('background-color', '#f00');
		ErrElement.show();
		
		(new Fx.Style(ErrElement, 'background-color', {duration:700})).start(
			'#f00',
			'#ffffcc'
		);
	},
	
	goToUrl: function( Url )
	{
		window.location = Url;
	},

	HandlePageKeys: function(event)
	{
		var event = new Event(event);

		if ( this.KeyMap !== Class.Empty )
		{
			this.KeyMap.each(function(Selector){
				if ( Selector.Key == event.key )
				{
					if (!Selector.ContainerElement || Selector.ContainerElement.hasChild(event.target))
					{
						var ModifierFound = true;

						Selector.Modifiers.each(function(Modifier){
							if ( Modifier == 'alt' && !event.alt ) ModifierFound = false;
							if ( Modifier == 'meta' && !event.meta ) ModifierFound = false;
							if ( Modifier == 'control' && !event.control ) ModifierFound = false;
							if ( Modifier == 'shift' && !event.shift ) ModifierFound = false;
						})

						if ( ModifierFound )
						{
							event.stop();
							event.preventDefault();
							Selector.Function(event);
							return;
						}
					}
				}
			});
		}

		if ( this.processPageKeys(event) )
		{
		}
	},

	processPageKeys: function(event)
	{
		return false;
	},

	SetPage: function( Page, Handler, Update )
	{
		var PostBody = Object.toQueryString({PageIndex: Page});

		var Options = {handler:'ev{'+Handler+'}', 
							remote: 1,
							update: Update,
							evalScripts: true,
							onFailure: this.requestFailure,
							postBody: PostBody,
							postBodyOnly: true
						};

		new Phpr_Request(Options);
	},

	ShowSpinner: function( Name, Element, Asset, Options )
	{
		if ( !this.Assets || !this.Assets.get(Asset) )
			return;

		var ImageElement = document.createElement('img');
		$(ImageElement).setStyle('visibility', 'hidden');
//		$(ImageElement).setStyle('display', 'none');
		$(ImageElement).setStyle( 'position', 'absolute' );
		$(ImageElement).setStyle( 'left', '0' );
		$(ImageElement).setStyle( 'top', '0' );
		$(ImageElement).setProperty( 'src', this.Assets.get(Asset) );
		$(ImageElement).setStyle( 'z-index', '10000' );

		var ElementSize = $(Element).getCoordinates();
		$(ImageElement).injectInside( 'Content' );
		var ImageSize = $(ImageElement).getCoordinates();

		var LeftOffset = 0;
		var RightOffset = 0;
		if ( $type(Options.LeftOffset) )
			LeftOffset = Options.LeftOffset;

		if ( $type(Options.RightOffset) )
			RightOffset = Options.RightOffset;

		if ( !$type(Options.Left) && !$type(Options.Right) )
			ImageElement.setStyle( 'left', ElementSize.width/2 + ElementSize.left - ImageSize.width/2 + LeftOffset );
		else
		{
			if ($type(Options.Left))
				ImageElement.setStyle( 'left', ElementSize.left + LeftOffset );
			else
				ImageElement.setStyle( 'left', ElementSize.left + ElementSize.width - ImageSize.width + RightOffset );
		}

		ImageElement.setStyle( 'top', ElementSize.height/2 + ElementSize.top - ImageSize.height/2 );
//		$(ImageElement).setStyle('display', 'block');
		$(ImageElement).setStyle('visibility', 'visible');
		$(Element).setStyle( 'visibility', 'hidden' );

		this.ActiveSpinners.set( Name, {Spinner: ImageElement, SpinnerElement: $(Element)} );
	},

	HideSpinner: function( Name )
	{
		if ( this.ActiveSpinners.hasKey(Name) )
		{
			var Spinner = this.ActiveSpinners.get( Name );
			Spinner.Spinner.remove();
			Spinner.SpinnerElement.setStyle( 'visibility', 'visible' );
			this.ActiveSpinners.remove(Name);
		}
	},

	ProgressOn: function()
	{
		$(document.body).ProgressOn();
	},

	ProgressOff: function()
	{
		$(document.body).ProgressOff();
	},

	Blur: function()
	{
		if ( document.forms[0].blur )
			document.forms[0].blur();
	},
	
	HighlightElement: function(element, endColor)
	{
		(new Fx.Style(element, 'background-color', {duration:700})).start(
			'#ffffcc',
			endColor
		);		
	}
 });

CFormHandler.implement(new Options);

/*
 * Event class extensions
 */

Event.implement({
	isFunctionalKey: function(){
		if (this.key == 'r' && this.control)
			return true;

		if (this.key == 'a' && this.control)
			return true;

		if (this.code >= 16 && this.code <= 20)
			return true;

		if (this.code >= 33 && this.code <= 40)
			return true;

		if (this.code >= 112 && this.code <= 123)
			return true;

		if (this.code == 144 || this.code == 145 || this.code == 20 || this.code == 93 || this.code == 27 )
			return true;

		return false
	},

	isCommandKey: function()
	{
		if (this.key == 'c' && this.control)
			return true;

		return false;
	}
});

/*
 * Functions
 */

function FocusFormSheet(SheetId)
{
	if (WizardForm)
		WizardForm.goToPage(SheetId, true);
}

function StrToElement(Str)
{
	return new Element('div').setHTML(Str).getFirst();
}

/*
 * Initialization
 */

if ( history.navigationMode )
	history.navigationMode = 'compatible';
	
new Asset.images(['/modules/admin/resources/images/form_spinner.gif']);


