/*
@Author: Anthony Cashaw of http://elmwoodstrip.org?u=enknot
@Name: TC Namespace 
@Version: 1.0 03/01/08
@Release: Unreleased
@Package: surebert
*/
var tc = {
	
	arrays : {},
	
	base : '../tony',
	
	forms : function(ele, config){
		
		//don't redo this
		if(sb.typeOf(ele) == 'tc.forms'){ 
		 return ele;
		}
		
		
		ele = sb.s$(ele);
		
		
		if(ele.nodeName && ele.nodeName == 'FORM'){			
			//start em up
			tc.importProperties(this, ele);	
			if(sb.typeOf(config) == 'object'){
				for(var i in config){
					if(ele.publicProps.inArray(i)){
						ele[i] = config[i];
					}
				}
			}
			return ele;
		}else{
			throw('The parameter passed as ele does not evaluate as a FORM object in tc.form');
		}
	},
	
	importProperties : function(from, toObj){
		from = from || {};
		for(var prop in from) { 						
			try{ toObj[prop] = from[prop];} catch(e){}
		}
		from = null;
		return toObj;
	},
	
	included : [],
	
	include : function(module){
		var mods = module.split('.');
		var path ='', file, unit=tc,m;
		
		for(m=0;m<mods.length;m++){
			
			if(m !==0 && m < mods.length && mods.length >1){
				path +='.';
			}
			path +=mods[m];
			
			try{
				unit = unit[mods[m]];
			} catch(e){
				
			}
		
			
			if(typeof unit == 'undefined'){
					
				this.included.push(path);
				file = path.replace(/\./g, "/");
				tc.load(tc.base+'/'+file+'.js');
			
			}
		}	
		
	},

	load : function(url){
			var evaled = 0;
	
			(function(){
				var load = new sb.ajax({
					url : url,
					async : 0,
					method : 'get',
					format : 'js',
					debug : 0,
					handler: function(r){
					//#######look into this 
						try{
							evaled=1;
						}catch(e){
								
							evaled=0;
							delete e.stack;
							sb.consol.error(sb.messages[13]+"\nURL: "+url+"\n"+sb.objects.dump(e));
							
						}
						load=null;
					}
				}).fetch();}());
			return evaled;
		},
	
	widget : {}
};


//forms prototype
tc.forms.prototype = {

	getFor : function(node){
		var attr = (sb.browser.agent == 'ie')?'htmlFor':'for';	
		return  $('label['+attr+'="'+node.id+'"]')[0];
	},
	
	noEmpties : function(args){
				
		var ret = { 
			hasEmpties : 0,
			add : [],
			remove : []
		};				
		var that = this;
		
		
		$(this, '.' + this.requiredClass).forEach(function(v,k,a){		
			
			//don't process lables
			if(v.nodeName == 'LABEL'){ return 0; }
			
			//get the lable for this element
			var lbl = that.getFor(v);	
			
			//if lables are required throw errors when they're not included	
			if((!lbl) && this.labelsRequired){
				throw( v.type + " input '" + v.id + "' is listed as '" + v.className + 
				"', but  the label for " + v.id + " does not exist");	
			}

				
			//push add or remove data for error handler
			if(v.value.trim() == ''){	
					ret.hasEmpties = 1;
					ret.add.push({
						id : v.id + '_err',
						message : lbl.innerHTML.replace(/(<([^>]+)>)/ig, '') + ' requires a value',
						node : v
					});
			}else{
				ret.remove.push(v.id + '_err');
			}
		
		});
	
	return ret;
	
	}, 
	
	requiredClass : 'required',
	
	labelsRequired : 1,
	
	serialize : function(){
		return sb.forms.serialize(this);
	},
		
	publicProps : ['requiredClass', 'labelsRequired']
};