	/**
	 * Note: Form method Map
	 *   1  -> Text input
	 * 	 2  -> Text area
	 * 	 3  -> Drop down box
	 * 	 4  -> Drop down box (multi select)
	 * 	 5  -> Radio
	 * 	 6  -> Checkbox
	 * 	 7  -> Yes|No
	 * 	 8  -> Editor
	 * 	 9  -> File browse
	 * 	 10 -> File browse (Multi mode)
	 */


var SNSForm = {
	inst      : {},
	resStatus : { button      : 0,
				  editor      : 0,
				  dropBox     : 0,
				  mLib        : 0,
				  uploader    : 0,
				  datePicker  : 0,
				  colorPicker : 0 },
	reInit    : { button      : new Array(),
		          editor      : new Array(),
		          dropBox     : new Array(),
		          mLib        : new Array(),
		          uploader    : new Array(),
		          colorPicker : new Array(),
		          datePicker  : new Array() },
	createInstance : function(data)
	{
		SNSForm.inst[data.id] = {};
		
		if( sns.chkVal(data.width) )
		{
			var suffix = ( (data.width + '').indexOf('%') == -1 ? 'px' : '%' );
			
			data.width = parseInt(data.width);
			
			if( ! isNaN(data.width) && data.width > 0 )
			{
				data.width = data.width + suffix;
			}
			else
			{
				data.width = false;
			}
		}
		else
		{
			data.width = false;
		}
		
		if( data.width == false )
		{
			data.width = '250px';
		}	
						
		if( data.type == 1 )
		{
			SNSForm.inst[data.id].obj = sns.createElement('input', { type  : data.isPass ? 'password' : 'text',
																	 id    : data.id,
																	 value : sns.chkVal(data.value) ? data.value : '',
																	 className : 'default' }, { width : data.width } );
			
			if( sns.chkVal(data.name) )
			{
				SNSForm.inst[data.id].obj.name = data.name;
			}
			
			if( ! data.isPass && ! data.skipVNTyper )
			{				
				VUni.initTyper(SNSForm.inst[data.id].obj);
			}
		}
		else if( data.type == 2 )
		{
			SNSForm.inst[data.id].obj = sns.createElement('textarea', { id : data.id,
																		value : sns.chkVal(data.value) ? data.value : '',
																		className : 'default' }, { width : data.width, height : '75px' } );
			
			if( sns.chkVal(data.name) )
			{
				SNSForm.inst[data.id].obj.name = data.name;
			}
			
			if( ! data.skipVNTyper )
			{
				VUni.initTyper(SNSForm.inst[data.id].obj);
			}
		}
		else if( data.type > 2 && data.type < 7 )
		{			
			var chkKey = new Array();
			
			if( data.type == 4 || data.type == 6 )
			{
				if( typeof data.value == 'object' )
				{
					for( var i = 0; i < data.value.length; i ++ )
					{
						chkKey[data.value[i]] = 1;
					}
				}
			}
		    else
		    {
		    	if( sns.chkVal(data.value) )
		    	{
		    		chkKey[data.value] = 1;
		    	}
		    }
			
			data.value = chkKey;
			
			if( data.type == 5 )
		    {
				SNSForm.inst[data.id].obj = sns.createElement('div', { id : data.id } );
				
		        var form = new Array();

		        for( var i = 0; i < data.data.length; i ++ )
		        {
		            form.push(sns.createElement('input', { type    : 'radio',
	                                                       id      : data.id + '.' + i,
	                                                       onclick : function(){ SNSForm.setVal(data.id, { mode : 'idx', data : this.id.replace(/.+\.(\d+)$/i, '$1' ) } ); },
		                                                   value   : data.data[i][0],
		                                                   checked : data.value[data.data[i][0]] }, {}, SNSForm.inst[data.id].obj ) );

		            if( sns.chkVal(data.name) )
		            {
		            	form[form.length-1].name = data.name;
		            }
		            
		            if( sns.chkVal(data.data[i][1]) )
		            {
			            sns.createElement('label', { innerHTML : data.data[i][1], htmlFor : data.id + '.' + i }, {}, SNSForm.inst[data.id].obj );
			            sns.createElement('br', {}, {}, SNSForm.inst[data.id].obj );
		            }
		        }
		    }
		    else if( data.type == 6 )
		    {
		        SNSForm.inst[data.id].obj = sns.createElement('div', { id : data.id } );

		        for( var i = 0; i < data.data.length; i ++ )
		        {
		            var f = sns.createElement('input', { type    : 'checkbox',
		                                                 id      : data.id + '.' + i,
		                                                 value   : data.data[i][0],
		                                                 checked : data.value[data.data[i][0]] == 1 }, {}, SNSForm.inst[data.id].obj );
		            
		            if( sns.chkVal(data.name) )
		            {
		            	f.name = data.name + '[]';
		            }
		            
		            if( typeof data.data[i][2] == 'object' )
		            {
		            	if( typeof data.data[i][2].attrs == 'object' )
			    		{
			    			for( var x in data.data[i][2].attrs )
			    			{
			    				f[x] = data.data[i][2].attrs[x];
			    			}
			    		}
		            }
		            
		            if( sns.chkVal(data.data[i][1]) )
		            {
			            sns.createElement('label', { innerHTML : data.data[i][1], htmlFor : data.id + '.' + i }, {}, SNSForm.inst[data.id].obj );
			            sns.createElement('br', {}, {}, SNSForm.inst[data.id].obj );
		            }
		        }
		    }
		    else
		    {
		    	SNSForm.inst[data.id].obj = sns.createElement('select', { id : data.id }, { width : data.width } );

		    	if( data.type == 4 )
			    {
					SNSForm.inst[data.id].obj.multiple = true;
					SNSForm.inst[data.id].obj.size     = 5;
			    }

		    	for( var i = 0; i < data.data.length; i ++ )
			    {
					SNSForm.inst[data.id].obj.options.add(new Option(data.data[i][1], data.data[i][0], null, data.value[data.data[i][0]] == 1 ) );
			    }    	
				
				if( sns.chkVal(data.name) )
				{
					SNSForm.inst[data.id].obj.name = data.name + ( data.type == 4 ? '[]' : '' );
				}
		    }
		}
		else if( data.type == 7 )
		{
		    var checker = sns.chkVal(data.value) && data.value != false ? true : false;

		    SNSForm.inst[data.id].obj = sns.createElement('div', { id : data.id, className : 'formYesNoWrapper' } );

			var yesWrapper = sns.createElement('div', { className : 'formYesNoYes' }, {}, SNSForm.inst[data.id].obj );
			var noWrapper  = sns.createElement('div', { className : 'formYesNoNo'  }, {}, SNSForm.inst[data.id].obj );

			sns.createElement('input', { type     : 'radio',
										 onclick  : function(){ if( this.disabled ){  this.checked = ! this.checked; return false; } sns.get_obj(this.id.replace(/\.yes$/i, '' ) + '.no').checked = ! this.checked; return true; },
										 checked  : checker,
										 disabled : data.disabled,
										 value    : 1,
										 id       : data.id + '.yes' }, { position : 'relative', top : '2px' }, yesWrapper );

			sns.createElement('input', { type        : 'radio',
										 onclick     : function(){ if( this.disabled ){ this.checked = ! this.checked; return false; } sns.get_obj(this.id.replace(/\.no$/i, '' ) + '.yes').checked = ! this.checked; return true; },
										 checked     : ! checker,
										 disabled    : data.disabled,
										 value       : 0,
										 id          : data.id + '.no' }, { position : 'relative', top : '2px' }, noWrapper );

			sns.createElement('label', { innerHTML : ' &nbsp;Yes', htmlFor : data.id + '.yes' }, { position : 'relative', top : '3px' }, yesWrapper );			
			sns.createElement('label', { innerHTML : ' &nbsp;No', htmlFor : data.id + '.no' }, { position : 'relative', top : '3px' }, noWrapper );
			
			if( sns.chkVal(data.name) )
			{
				noWrapper.firstChild.name  = data.name;
				yesWrapper.firstChild.name = data.name;
			}
		}

		if( data.originValue )
		{
		    SNSForm.inst[data.id].obj.originValue = data.originValue;
		}

		if( data.attrs )
		{
			for( var x in data.attrs )
			{
				SNSForm.inst[data.id].obj[x] = data.attrs[x];
			}
		}

		if( data.tip )
		{
			sns.tooltip.init(SNSForm.inst[data.id].obj, data.tip.content, data.tip.options );
		}
		
		for( var x in data )
		{
			SNSForm.inst[data.id][x] = data[x];
		}

		return SNSForm.inst[data.id].obj;
	},
	
	chkInst : function(id)
	{
		return sns.chkVal(SNSForm.inst[id]);
	},
	
	getVal : function(id, validFunc )
	{
		var val = false;
		
		if( SNSForm.chkInst(id) !== false )
		{			
			switch(parseInt(SNSForm.inst[id].type))
			{
				case 1:
				case 2:
					SNSForm.inst[id].obj.value = sns.trim(SNSForm.inst[id].obj.value);
					
					val = SNSForm.inst[id].obj.value;
					
					break;
				case 3:
					if( SNSForm.inst[id].obj.options.length > 0 )
					{
						val = SNSForm.inst[id].obj.options[SNSForm.inst[id].obj.selectedIndex].value;
					}
					break;
				case 4:
					val = new Array();
					
					for( var x = 0; x < SNSForm.inst[id].obj.options.length; x ++ )
					{
						if( SNSForm.inst[id].obj.options[x].selected )
						{
							val.push(SNSForm.inst[id].obj.options[x].value);
						}
					}
					
					if( val.length < 1 )
					{
						val = false;
					}
					
					break;
				case 5:
					var val = false;
					
					for( var i = 0; i < SNSForm.inst[id].data.length; i ++ )
			        {
						if( sns.get_obj(id + '.' + i ).checked )
						{
							val = SNSForm.inst[id].data[i][0];
							break;
						}
			        }
					
					break;
				case 6:
					val = [];
					
					for( var i = 0; i < SNSForm.inst[id].data.length; i ++ )
			        {
						if( sns.get_obj(id + '.' + i ).checked )
						{
							val.push(SNSForm.inst[id].data[i][0]);
						}
			        }
					
					if( val.length < 1 )
					{
						val = false;
					}
					
					break;
				case 7:
					if( sns.get_obj(id + '.yes' ).checked )
					{
						val = 1;
					}
					else if( sns.get_obj(id + '.no' ).checked )
					{
						val = 0;
					}
					
					break;
			}
		}
		
		if( val !== false && typeof validFunc == 'function' )
		{
			if( ! validFunc(val) )
			{
				val = false;
			}
		}
		
		return val;
	},
	
	setVal : function(id, data )
	{				
		if( SNSForm.chkInst(id) !== false )
		{			
			switch(parseInt(SNSForm.inst[id].type))
			{
				case 1:
				case 2:
					if( ! sns.chkVal(data) )
					{
						data = '';
					}
					
					SNSForm.inst[id].obj.value = data;					
					break;
				case 3:
				case 4:
					if( ! sns.chkVal(data) )
					{
						data = { data : [], mode : 'key' };
					}
					
					var chkKey = new Array();
					
					if( typeof data.data == 'object' )
					{
						for( var i = 0; i < data.data.length; i ++ )
						{
							chkKey[data.data[i]] = 1;
						}
					}
					else
					{
						chkKey[data.data] = 1;
					}
					
					var k = data.mode == 'key' ? 0 : 1;

			        for( var i = 0; i < SNSForm.inst[id].obj.options.length; i ++ )
			        {
			        	SNSForm.inst[id].obj.options[i].selected = chkKey[SNSForm.inst[id].data[i][k]] == 1;
			        }
					break;	
				case 5:		
					if( ! sns.chkVal(data) )
					{
						data = { data : '', mode : 'key' };
					}
										
					var k = data.mode == 'key' ? 0 : 1;
					
					var setted = false;
					
					for( var i = 0; i < SNSForm.inst[id].data.length; i ++ )
			        {
						var obj = sns.get_obj(id + '.' + i );
						
			            obj.checked = ! setted && ( data.mode == 'idx' ? data.data == i : SNSForm.inst[id].data[i][k] == data.data );
			            
			            if( obj.checked )
			            {
			            	setted = true;
			            }
			        }		
					break;
				case 6:
					if( ! sns.chkVal(data) )
					{
						data = { data : '', mode : 'key' };
					}
					
					var chkKey = new Array();
					
					if( typeof data.data == 'object' )
					{
						for( var i = 0; i < data.data.length; i ++ )
						{
							chkKey[data.data[i]] = 1;
						}
					}
										
					var k = data.mode == 'key' ? 0 : 1;

			        for( var i = 0; i < SNSForm.inst[id].data.length; i ++ )
			        {
			            sns.get_obj(id + '.' + i ).checked = chkKey[SNSForm.inst[id].data[i][k]] == 1;
			        }		
					break;
				case 7:
					var checker = sns.chkVal(data) && data !== false && data != 0 ? true : false;

					sns.get_obj(id + '.yes' ).checked = checker;
					sns.get_obj(id + '.no' ).checked = ! checker;
					
					break;
			}
		}
	},
	
	setState : function(id, state, errMess )
	{
		if( SNSForm.chkInst(id) !== false )
		{			
			var className = '';
			
			if( state == 3 )
			{
				className = 'incorrect';
			}
			else if( state == 2 )
			{
				className = 'correct';
			}
			else
			{
				className = 'default';
			}
			
			switch(parseInt(SNSForm.inst[id].type))
			{
				case 1:
					SNSForm.inst[id].obj.className = className;					
					break;
				case 2:
					SNSForm.inst[id].obj.className = className;					
					break;
				case 3:
					break;
				case 4:					
					break;
				case 5:					
					break;
				case 6:
					break;
				case 7:
					SNSForm.inst[id].obj.className = SNSForm.inst[id].obj.className + ' ' + className;	
					break;
				default:
					return;
			}
			
			if( errMess )
			{
				var options = {};
				
				if( SNSForm.inst[id].tip )
				{
					for( var x in SNSForm.inst[id].tip.options )
					{
						options[x] = SNSForm.inst[id].tip.options[x];
					}
					
					errMess = '<div class="frmErrMess2">' + errMess + '</div>' + SNSForm.inst[id].tip.content;				
				}
				else
				{
					errMess = '<div class="frmErrMess1">' + errMess + '</div>';
				}
				
				sns.tooltip.init(SNSForm.inst[id].obj, errMess, options );
			}
			else if( SNSForm.inst[id].tip )
			{
				sns.tooltip.init(SNSForm.inst[id].obj, SNSForm.inst[id].tip.content, SNSForm.inst[id].tip.options );				
			}
			else
			{
				try{ SNSToolTip.destroy(SNSForm.inst[id].obj.id); }catch(e){}
			}
		}
	},
	
	setVisible : function(id, state )
	{
		if( SNSForm.chkInst(id) !== false )
		{
			SNSForm.inst[id].obj.style.display = state ? '' : 'none';
		}
	},
		
	destroy : function(id)
	{
		if( SNSForm.chkInst(id) !== false )
		{			
			if( SNSForm.inst[id].tip )
			{	
				SNSForm.rmvTooltip(id);
			}
			
			SNSForm.inst[id].obj.parentNode.removeChild(SNSForm.inst[id].obj);
						
			SNSForm.inst[id] = null;
		}
	},
	
	rmvTooltip : function(id)
	{
		if( typeof SNSToolTip == 'undefined' || typeof SNSToolTip.inst[id] == 'undefined' )
		{
			setTimeout(function(){ SNSForm.rmvTooltip(id); }, 100 );
			return;
		}
		
		SNSToolTip.destroy(id);
	},
	
	initUploader : function(config)
	{
		if( SNSForm.resStatus.uploader != 2 )
		{
			SNSForm.reInit.uploader[SNSForm.reInit.uploader.length] = config;
			
			if( SNSForm.resStatus.uploader == 0 )
			{				
				SNSForm.resStatus.uploader = 1;
				
				sns.importJS(sns.res_root_server + '/js/global/form/uploader.sns.js');
			}
			
			return false;
		}
		
		SNSFormUploader.createInstance(config);
		
		return true;
	},
	
	initEditor : function(config)
	{
		if( SNSForm.resStatus.editor != 2 )
		{
			SNSForm.reInit.editor[SNSForm.reInit.editor.length] = config;
			
			if( SNSForm.resStatus.editor == 0 )
			{				
				SNSForm.resStatus.editor = 1;
				
				sns.importJS(sns.res_root_server + '/js/global/form/editor.sns.js');
			}
			
			return false;
		}
		
		SNSFormEditor.createInstance(config);
		
		return true;
	},
	
	initDropBox : function(config)
	{
		if( SNSForm.resStatus.dropBox != 2 )
		{
			SNSForm.reInit.dropBox.push(config);
			
			if( SNSForm.resStatus.dropBox == 0 )
			{				
				SNSForm.resStatus.dropBox = 1;
				
				sns.importJS(sns.res_root_server + '/js/global/form/dropBox.sns.js');
			}
			
			return false;
		}
		
		SNSFormDropBox.createInstance(config);
		
		return true;
	},
	
	initDatePicker : function(config)
	{
		if( SNSForm.resStatus.datePicker != 2 )
		{
			SNSForm.reInit.datePicker.push(config);
			
			if( SNSForm.resStatus.datePicker == 0 )
			{				
				SNSForm.resStatus.datePicker = 1;
				
				sns.importJS(sns.res_root_server + '/js/global/form/datePicker.sns.js');
			}
			
			return false;
		}
		
		SNSFormDatePicker.createInstance(config);
		
		return true;
	},
	
	initColorPicker : function(config)
	{
		if( SNSForm.resStatus.colorPicker != 2 )
		{
			SNSForm.reInit.colorPicker[SNSForm.reInit.colorPicker.length] = config;
			
			if( SNSForm.resStatus.colorPicker == 0 )
			{				
				SNSForm.resStatus.colorPicker = 1;
				
				sns.importJS(sns.res_root_server + '/js/global/form/colorPicker.sns.js');
			}
			
			return false;
		}
		
		SNSFormColorPicker.createInstance(config);
		
		return true;
	}
};
