
He.RequireComponent('He.Framework.Sha1');
He.RequireComponent('He.Components.SuggestField.clientside');

He.Bootstrap('He.Framework.Form');

He.Framework.Form.GetKeyField = function()
{
	return He.Application.GetName() + '_frmkey';
}

He.Framework.Form.OnFocusField = function(_field)
{
	$('helper_' + _field.target.id).style.display = 'block';
// 	new Effect.Appear('helper_' + _field.id);
}

He.Framework.Form.OnBlurField = function(_field)
{
	$('helper_' + _field.target.id).style.display = 'none';
// 	new Effect.Fade('helper_' + _field.id);
}

He.Framework.Form.CancelMedia = function() // Is binded to the field
{
	var fid = this.id;
	this.value = null;
	$(fid + '_field').show();
	$(fid + '_preview').hide();
	$(fid + '_manager_rmv').hide();
}

He.Framework.Form.BrowseMedia = function() // Is binded to the field
{
	var field = this;
	He.Components.MediaManager.Open(
		'Media Manager : select from your library', '', '','',
		function(){He.Framework.Form.UpdateMediaField(field,He.Components.MediaManager.mediaIdFromLibrary);}
	);
}

He.Framework.Form.UpdateMediaField = function(_field,_value)
{
	if(_value)
	{
		_field.value = _value;
	}

	var fid = _field.id;
	var media = _field.value;

	He.Framework.Ajax.Update(
		fid + '_preview',
		'/He/Components/MediaForm/ajax.php',
		'field=' + fid + '&media='+ media,
		function()
		{
			$(fid + '_field').hide();
			$(fid + '_preview').show();
			$(fid + '_manager_rmv').show();
		}
	);
}

He.Framework.Form.GetControlField = function()
{
	return He.Application.GetName() + '_frmctr';
}

He.Framework.Form.Trim = function(_str)
{
	return _str.replace(/^\s+/,'').replace(/\s+$/,'');
}

He.Framework.Form.GetSignField = function()
{
	return He.Application.GetName() + '_frmsig';
}

He.Framework.Form.SignQs = function(_query)
{
	var key = '',sig = '',ctr = '';

	var qs = _query.split('&');
	qs.sort(function(a,b)
	{
		a = a.split('=')[0];
		b = b.split('=')[0];

		var ap = a.substr(0,4), an = a;
		if(ap == 'hid_' || ap == 'sta_')
		{
			an = an.substr(4);
		}

		var bp = b.substr(0,4), bn = b;
		if(bp == 'hid_' || bp == 'sta_')
		{
			bn = bn.substr(4);
		}

		if(an < bn) return -1;
		if(an > bn) return 1;

		return 0;
	});

	for(var i = 0; i < qs.length; ++i)
	{
		var f = qs[i];
		var nv = f.split('=');

		if(nv[0] == He.Framework.Form.GetControlField())
		{
			ctr = nv[1];
			sig = ctr + sig;
		}
		else if(nv[0] == He.Framework.Form.GetKeyField())
		{
			key = nv[1];
		}
		else if(nv[0] != He.Framework.Form.GetSignField() && nv[0].substr(0,4) != 'btn_')
		{
			sig += He.Framework.Form.Trim(f.replace(/([\r\n\0"'])/g,'\\$1'));
		}
	}
	He.Log('Signed : ' + sig + ' on ' + key);
	sig = He.Framework.Sha1.HexSha1(sig + key);
	He.Log('Signed : ' + sig);
	return (_query + '&' + He.Framework.Form.GetSignField() + '=' + sig);
}

He.Framework.Form.Sign = function(_form)
{
	var key = '',sig = '',ctr = '';
	var fields = _form.getElements();

	fields.sort(function(a, b)
	{
		var ap = a.name.substr(0,4), an = a.name;
		if(ap == 'hid_' || ap == 'sta_')
		{
			an = an.substr(4);
		}

		var bp = b.name.substr(0,4), bn = b.name;
		if(bp == 'hid_' || bp == 'sta_')
		{
			bn = bn.substr(4);
		}

		if(an < bn) return -1;
		if(an > bn) return 1;

		return 0;
	});

	for(var i = 0; i < fields.length; ++i)
	{
		var e = fields[i];
	
		if(e.name == He.Framework.Form.GetControlField())
		{
			ctr = e.value;
			sig = ctr + sig;
		}
		else if(e.name == He.Framework.Form.GetKeyField())
		{
			key = e.value;
		}
		else if(e.name != He.Framework.Form.GetSignField())
		{
			if((e.type != 'checkbox') && (e.type != 'radio') && (e.type != 'file') && (e.disabled != true))
			{
				e.value = He.Framework.Form.Trim(e.value); // sanitize

				var pre = e.name.substr(0,4), name = e.name;
				if(pre == 'hid_' || pre == 'sta_')
				{
					name = name.substr(4);
				}
				sig += name + '=' + e.value;
			}
		}
	}

	He.Log('JS - Signed : ' + sig + ' on ' + key);
	sig = He.Framework.Sha1.HexSha1(sig + key);
	He.Log('JS - Signed : ' + sig);

	var sf = _form[He.Framework.Form.GetSignField()];

	if(!sf)
	{
		// Create & Append signature field
		sf = document.createElement('input');
		sf.name = He.Framework.Form.GetSignField();
		sf.type = 'hidden';

		_form.appendChild(sf);
	}

	sf.value = sig;
	_form.signed = true;

	return false;
}

