function ViewMgrRoot ()
{
	this.managers = new Array ();
	
	this.addManager = function ( wrapperOBJ )
	{
		var managerOBJ = new ViewMgr ( wrapperOBJ );
		this.managers[this.managers.length] = new Array ();
		//window.alert ( this.managers[this.managers.length] );
		this.managers[this.managers.length - 1]['manager'] = managerOBJ;
		this.managers[this.managers.length - 1]['wrapper'] = wrapperOBJ;
		return ( managerOBJ );
	}
	
	this._getManager = function ( wrapperOBJ )
	{
		for ( var i = 0; i < this.managers.length; i++ )
		{
			if ( this.managers[i]['wrapper'] == wrapperOBJ )
			{
				return ( this.managers[i]['manager'] );
				break;
			}
		}
		return ( false );
	}
	
	this.getManager = function ( elementOBJ )
	{
		var elementWrapperOBJ = this.getWrapper ( elementOBJ );
		if ( elementWrapperOBJ )
		{
			for ( var i = 0; i < this.managers.length; i++ )
			{
				if ( this.managers[i]['wrapper'] == elementWrapperOBJ )
				{
					return ( this.managers[i]['manager'] );
					break;
				}
			}
		}
		return ( false );
	}
	
	this.getWrapper  = function ( elementOBJ )
	{
		while ( ! ( elementOBJ.tagName == 'BODY' || elementOBJ == null ) )
		{
			if ( this._getManager ( elementOBJ ) ) return ( elementOBJ );
			elementOBJ = elementOBJ.parentNode;
		}
		return ( false );
	}
}

var CoreViewMgr = new ViewMgrRoot ();

function ViewMgr ( obj )
{	
	this.wrapper = null;
	this.currentView = null;
	this.views = new Array ();
	this.viewStyle = new Array();
	this.names = new Array ();
	this.previousStyle = null;
	this.dataHolders = new Array ();
	
	this._init = function ()
	{
		this.wrapper = obj;
		this._registerNames();
	}
	
	this.init = function ( )
	{
		for ( var i = 0; i < this.views.length; i++ )
		{
			var tmpObjs = this._getDataHolders(this._getViewObj(this.views[i])[0]);
			this.dataHolders[this.views[i]] = new Array ();
			for ( var j = 0; j < tmpObjs.length; j++ )
			{
				var inputName = this._hasRegisteredName(tmpObjs[j]);
				if ( inputName )
				{
					if ( tmpObjs[j].type == 'radio' )
					{
						if ( !this.dataHolders[this.views[i]][inputName] )
						{
							this.dataHolders[this.views[i]][inputName] = new Array ();
						}
						this.dataHolders[this.views[i]][inputName][this.dataHolders[this.views[i]][inputName].length] = tmpObjs[j];
					}
					else
					{
						this.dataHolders[this.views[i]][inputName] = tmpObjs[j];
					}
				}
			}
			//window.alert ( this._getViewObj(this.views[i])[0] );
			this._getViewObj(this.views[i])[0].style.display = 'none';
		}
	}
	
	this._getViewObj = function ( viewName )
	{
		if ( !viewName ) viewName = this.currentView;
		return ( this._getElementsByClassName ( viewName, this.wrapper ) );
	}
	
	this.getInputs = function ()
	{
		var inputs = new Array ();
		var collect = this.wrapper.getElementsByTagName ( 'INPUT' );
		for ( var i = 0; i < collect.length; i++ )
		{
			inputs[inputs.length] = collect[i];
		}
		var collect = this.wrapper.getElementsByTagName ( 'TEXTAREA' );
		for ( var i = 0; i < collect.length; i++ )
		{
			inputs[inputs.length] = collect[i];
		}
		var collect = this.wrapper.getElementsByTagName ( 'SELECT' );
		for ( var i = 0; i < collect.length; i++ )
		{
			inputs[inputs.length] = collect[i];
		}
		return ( inputs );
	}
	
	this._getDataHolders = function ( obj )
	{
		var collection = new Array ();
		var elements = obj.getElementsByTagName ( 'INPUT' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		var elements = obj.getElementsByTagName ( 'TEXTAREA' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		var elements = obj.getElementsByTagName ( 'SELECT' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		var elements = obj.getElementsByTagName ( 'SPAN' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		var elements = obj.getElementsByTagName ( 'DIV' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		var elements = obj.getElementsByTagName ( 'TD' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		var elements = obj.getElementsByTagName ( 'LABEL' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		var elements = obj.getElementsByTagName ( 'IMG' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		var elements = obj.getElementsByTagName ( 'A' );
		for ( var i = 0; i < elements.length; i++ )
		{
			if ( this._hasRegisteredName ( elements[i] ) ) collection[collection.length] = elements[i];
		}
		return ( collection );
	}
	
	this._getChildsByClassName = function ( className, obj )
	{
		if ( !obj )
		{
			var obj = this._getViewObj();
		}
		var objs = new Array ();
		for ( var i = 0; i < obj.childNodes.length; i++ )
		{
			if ( obj.childNodes[i].className )
			{
				for ( var j=0; j < obj.childNodes[i].className.split (' ').length; j++ )
				{
					if ( obj.childNodes[i].className.split (' ')[j] == className )
					{
						objs[objs.length] = obj.childNodes[i];
						break;
					}
				}
			}
		}
		return ( objs );
	}
	
	this._getElementsByClassName = function ( className, obj )
	{
		var childs = new Array ();
		if ( !obj ) return;
		if ( obj.childNodes )
		{
			for ( var i = 0; i < obj.childNodes.length; i++ )
			{
				if ( obj.childNodes[i].className )
				{
					for ( var j=0; j < obj.childNodes[i].className.split (' ').length; j++ )
					{
						if ( obj.childNodes[i].className.split (' ')[j] == className )
						{
							childs[childs.length] = obj.childNodes[i];
							break;
						}
					}
				}
				if ( obj.childNodes[i].childNodes.length > 0 )
				{
					childChilds = this._getElementsByClassName ( className, obj.childNodes[i] );
					if ( childChilds.length > 0 )
					{
						for ( var j = 0; j < childChilds.length; j++ )
						{
							childs[childs.length] = childChilds[j];
						}
					}
				}
			}
		}
		return ( childs );
	}
	
	this.registerView = function ( viewName )
	{
		//window.alert ( viewName );
		this.views[this.views.length] = viewName;
		this.viewStyle[viewName] = this._getViewObj(viewName)[0].style.display;
	}
	
	this._registerName = function ( name )
	{
		this.names[this.names.length] = name;
	}
	
	this._registerNames = function ()
	{
		var inputs = this.getInputs();
		for ( var i = 0; i < inputs.length; i++ )
		{
			if ( inputs[i].name )
			{
				this._registerName ( inputs[i].name );
				if ( !this._hasRegisteredName ( inputs[i] ) )
				{
					inputs[i].className = inputs[i].className + ' ' + inputs[i].name; 
				}
			}
		}
	}
	
	this._hasRegisteredName = function ( obj )
	{
		if ( !obj.className ) return ( false );
		var className = obj.className.split(' ');
		for ( var i = 0; i < className.length; i++ )
		{
			for ( var j = 0; j < this.names.length; j++ )
			{
				if ( className[i] == this.names[j] ) return ( className[i] );
			}
		}
		return ( false );
	}
	
	this.showView = function ( viewName )
	{
		if ( this.currentView )
		{
			this._getViewObj( this.currentView )[0].style.display = 'none';
		}
		this.currentView = viewName;
		this._getViewObj( this.currentView )[0].style.display = this.viewStyle[viewName];
	}
	
	this.hideAll = function ()
	{
		for ( var i = 0; i < this.views.length; i++ )
		{
			this._getViewObj( this.views[i] )[0].style.display = 'none';
		}
	}
	
	this.fillField = function ( name, value )
	{	
		for ( var i = 0; i < this.views.length; i++ )
		{
			if ( this.dataHolders[this.views[i]][name] )
			{
				if ( this.dataHolders[this.views[i]][name].length && !this.dataHolders[this.views[i]][name].tagName )
				{
					for ( var j = 0; j < this.dataHolders[this.views[i]][name].length; j++ )
					{
						if ( this.dataHolders[this.views[i]][name][j].value == value )
						{
							this.dataHolders[this.views[i]][name][j].checked = true;
						}
						else
						{
							this.dataHolders[this.views[i]][name][j].checked = null;
						}
					}
				}
				else
				{
					switch ( this.dataHolders[this.views[i]][name].tagName )
					{
						case 'INPUT':
							switch ( this.dataHolders[this.views[i]][name].type )
							{
								case 'hidden':
								case 'text':
									this.dataHolders[this.views[i]][name].value = value;
									break;
								case 'checkbox':
									if ( this.dataHolders[this.views[i]][name].value == value )
									{
										this.dataHolders[this.views[i]][name].checked = true;
									}
									else
									{
										this.dataHolders[this.views[i]][name].checked = null;
									}
									break;
							}
							break;
						case 'TEXTAREA':
							this.dataHolders[this.views[i]][name].value = value;
							break;
						case 'SELECT':
							for ( var j = 0; j < this.dataHolders[this.views[i]][name].options.length; j++ )
							{
								if ( this.dataHolders[this.views[i]][name].options[j].text == value )
								{
									this.dataHolders[this.views[i]][name].selectedIndex = j;
								}
							}
							break;
						case 'SPAN':
						case 'DIV':
						case 'TD':
						case 'LABEL':
							this.dataHolders[this.views[i]][name].innerHTML = value;
							break;
						case 'IMG':
							this.dataHolders[this.views[i]][name].src = value;
							break;
						case 'A':
							this.dataHolders[this.views[i]][name].href = value;
							this.dataHolders[this.views[i]][name].innerHTML = value;
							break;
					}
				}
			}
		}
	}
	
	this.fillFromView = function ( viewName )
	{
		for ( var i = 0; i < this.names.length; i++ )
		{
			if ( this.dataHolders[viewName][this.names[i]] )
			{
				switch ( this.dataHolders[viewName][this.names[i]].tagName )
				{
					case 'INPUT':
						switch ( this.dataHolders[viewName][this.names[i]].type )
						{
							case 'hidden':
							case 'text':
								this.fillField ( this.names[i], this.dataHolders[viewName][this.names[i]].value );
								break;
							case 'checkbox':
								if ( this.dataHolders[viewName][this.names[i]].checked )
								{
									this.fillField ( this.names[i], this.dataHolders[viewName][this.names[i]].value );
								}
								break;
						}
						break;
					case 'TEXTAREA':
						this.fillField ( this.names[i], this.dataHolders[viewName][this.names[i]].value );
						break;
					case 'SELECT':
						this.fillField ( this.names[i], this.dataHolders[viewName][this.names[i]].options[this.dataHolders[viewName][this.names[i]].selectedIndex].text );
						break;
					case 'SPAN':
					case 'DIV':
					case 'TD':
					case 'LABEL':
						this.fillField ( this.names[i], this.dataHolders[viewName][this.names[i]].innerHTML );
						break;
					case 'IMG':
						this.fillField ( this.names[i], this.dataHolders[viewName][this.names[i]].src );
						break;
				}
			}
		}
	}
	
	this.clone = function ( coreMgr, elementToAppendOBJ, defaultView )
	{
		var newMgr = coreMgr.addManager ( this.reset ( this.wrapper.cloneNode ( true ) ) );
		newMgr.wrapper.removeAttribute('id');
		newMgr.views = this.views;
		newMgr.viewStyle = this.viewStyle;
		elementToAppendOBJ.appendChild ( newMgr.wrapper );
		return ( newMgr );
	}
	
	this.reset = function ( obj )
	{
		var elements = this._getDataHolders( obj );
		for ( var j = 0; j < elements.length; j++ )
		{
			switch ( elements[j].tagName )
			{
				case 'INPUT':
					switch ( elements[j].type )
					{
						case 'hidden':
							if ( elements[j].name != 'event' ) elements[j].value = '';
							break;
						case 'text':
						case 'password':
							elements[j].value = '';
							break;
						case 'checkbox':
							elements[j].checked = false;
							break;
						case 'radio':
							elements[j].checked = 'checked';
							break;	
					}
					break;
				case 'TEXTAREA':
					elements[j].value = '';
					break;
				case 'SELECT':
					elements[j].value = '';
					break;
				case 'SPAN':
				case 'DIV':
				case 'LABEL':
				case 'TD':
					elements[j].innerHTML = '';
					break;
			}
		}
		return ( obj );
	}
		
	this.fillAll = function ( dataARR )
	{
		for ( var i = 0; i < dataARR.length; i++ )
		{
			this.fillField ( dataARR[i]['name'], dataARR[i]['value'] );
		}
	}

	this.esc = function ( str )
	{
		if ( str )
		{
			str = str.toString().replace(/&/g, '%26');	
		}
		return ( str );
	}

	this.createQueryString = function ( viewName )
	{
		var queryString = '';
		var elements = this._getDataHolders ( this._getViewObj ( viewName )[0] );
		for ( var j = 0; j < elements.length; j++ )
		{
			switch ( elements[j].tagName )
			{
				case 'INPUT':
					switch ( elements[j].type )
					{
						case 'hidden':
						case 'text':
						case 'password':
							queryString += elements[j].name + '=' + this.esc(elements[j].value) + '&';
							break;
						case 'checkbox':
							if ( elements[j].checked == true )
							{
								queryString += elements[j].name + '=' + this.esc(elements[j].value) + '&';
							}
							break;
						case 'radio':
							if ( elements[j].checked == true )
							{
								queryString += elements[j].name + '=' + this.esc(elements[j].value) + '&';
							}
							break;	
					}	
					break;
				case 'TEXTAREA':
					queryString += elements[j].name + '=' + this.esc(elements[j].value) + '&';
					break;
				case 'SELECT':
					queryString += elements[j].name + '=' + this.esc(elements[j].value) + '&';
						break;
				case 'SPAN':
				case 'DIV':
				case 'LABEL':
				case 'TD':
					if ( this._hasRegisteredName ( elements[j] ) )
					{
						queryString += elements[j].name + '=' + this.esc(elements[j].innerHTML) + '&';
					}
					break;
			}
		}
		return ( queryString );
	}

	this._init();
}