

if (!window.Leetchi)
{
	Leetchi = {};
}

Leetchi.trim = function(s)
{
	if (s == null)
	{
		return '';
	}

	return s.replace(/(^\s*)|(\s*$)/g, '');
};

Leetchi.haveClass = function(object, className)
{
	return new RegExp('^\\s*(.+\\s+)*' + className + '(\\s+(.+\\s*)*)*$', 'g').test(object.className);
};


Leetchi.addClass = function(object, className)
{
	if (!Leetchi.haveClass(object, className))
	{
		object.className = Leetchi.trim(object.className) + ' ' + className;
	}
};


Leetchi.removeClass = function(object, className)
{
	object.className = object.className.replace(new RegExp('(^\\s*(.+\\s+)*)(' + className + ')((\\s+(.+\\s*)*)*$)', 'g'), '$1$4');
};



Leetchi.addListener = function(object, eventName, functionTarget)
{
	if (functionTarget && eventName && typeof (eventName) == 'string' && eventName != '')
	{
		if (object && object.addEventListener)
		{
			object.addEventListener(eventName, functionTarget, false);
			return true;
		}
		else if (object && object.attachEvent)
		{
			object.attachEvent('on' + eventName, functionTarget);
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}
};

Leetchi.removeListener = function(object, eventName, functionTarget)
{
	if (object.removeEventListener)
	{
		object.removeEventListener(eventName, functionTarget, false);
	}
	else if (object.detachEvent)
	{
		object.detachEvent('on' + eventName, functionTarget);
	}
};


Leetchi.getSender = function(e)
{
	if (e && e.target)
	{
		return e.target;
	}
	else if (window.event && window.event.srcElement)
	{
		return window.event.srcElement;
	}

	throw 'Could not get sender.';
};

/*
Leetchi.setReturnValue = function(e, value)
{
	if (window.event)
	{
		window.event.returnValue = value;
	}
	else
	{
		e.returnValue = value;
	}
};
*/
Leetchi.stopPropagation = function(e)
{
	if (e && e.stopPropagation && e.preventDefault)
	{
		e.stopPropagation();
		e.preventDefault();
	}
	else if (window.event)
	{
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}

	return false;
};

Leetchi.CheckBoxManager = function(inputElement)
{
	this._inputElement = inputElement
	this._labelElement = null;
	this._fakeCheckBoxElement = null;
	
	Leetchi.addListener(this._inputElement, 'click', Leetchi.CheckBoxManager._checkBox_OnClick);
};

Leetchi.CheckBoxManager._checkBoxLink_OnClick = function(e)
{
	var ctSender = Leetchi.getSender(e);
	ctSender._checkBoxManager.click();

	return Leetchi.stopPropagation(e);
};

Leetchi.CheckBoxManager._checkBox_OnClick = function(e)
{
	var ctSender = Leetchi.getSender(e);
	ctSender._checkBoxManager.refreshView();
};

Leetchi.CheckBoxManager._label_OnClick = function(e)
{
	var ctSender = Leetchi.getSender(e);
	ctSender._checkBoxManager.click();

	return Leetchi.stopPropagation(e);
};

Leetchi.CheckBoxManager.prototype.setLabel = function(label)
{
	if (this._labelElement != null)
	{
		throw 'Label is already defined.';
	}
	
	this._labelElement = label;
	this._labelElement._checkBoxManager = this;

	Leetchi.addListener(this._labelElement, 'click', Leetchi.CheckBoxManager._label_OnClick);
};

Leetchi.CheckBoxManager.prototype.click = function()
{
	this._inputElement.click();
};

Leetchi.CheckBoxManager.prototype._ensureDom = function()
{
	if (!this._fakeCheckBoxElement)
	{
		if (this._inputElement.disabled)
		{
			this._fakeCheckBoxElement = document.createElement('span');
		}
		else
		{
			this._fakeCheckBoxElement = document.createElement('a');
			this._fakeCheckBoxElement.href = "#";

			Leetchi.addListener(this._fakeCheckBoxElement, 'click', Leetchi.CheckBoxManager._checkBoxLink_OnClick);
		}

		this._fakeCheckBoxElement.className = 'CheckBox';
		this._fakeCheckBoxElement._checkBoxManager = this;
		this._inputElement.parentNode.insertBefore(this._fakeCheckBoxElement, this._inputElement);

		Leetchi.addClass(this._inputElement, 'NotDisplayed');
	}
};

Leetchi.CheckBoxManager.prototype.refreshView = function()
{
	this._ensureDom();
	this._fakeCheckBoxElement.className = 'CheckBox';

	if (this._inputElement.checked)
	{
		this._fakeCheckBoxElement.className += ' CheckBoxChecked';
	}
};

Leetchi._initChild = function(inputElement)
{
	inputElement._checkBoxManager = new Leetchi.CheckBoxManager(inputElement);
	inputElement._checkBoxManager.refreshView();
};

Leetchi.initChildren = function(element)
{
	var sCheckBoxIds = {};

	var ctInputs = element.getElementsByTagName('input');
	for (var i = 0; i < ctInputs.length; i++)
	{
		var ctInput = ctInputs[i];

		if (ctInput.type == 'checkbox')
		{
			sCheckBoxIds[ctInput.id] = ctInput;
			Leetchi._initChild(ctInput);
		}
	}

	delete ctInputs;

	var ctLabels = element.getElementsByTagName('label');
	for (var i = 0; i < ctLabels.length; i++)
	{
		var ctLabel = ctLabels[i];
		if (ctLabel.htmlFor)
		{
			var ctCheckBox = sCheckBoxIds[ctLabel.htmlFor];
			if (ctCheckBox && ctCheckBox._checkBoxManager)
			{
				ctCheckBox._checkBoxManager.setLabel(ctLabel);
			}
		}
	}
};
$().ready(function(e)
{
	Leetchi.initChildren(document.getElementsByTagName('body')[0]);
});
