﻿/*
	This note must stay intact.
	
	Author:
		Mattias Rundqvist, Webparts (www.webparts.se)
	License:
		Creative Commons Attribution-Share Alike 3.0 License
		http://creativecommons.org/licenses/by-sa/3.0/
*/

var wp_Form = function( mcfg ) {

	var self = this;
	var form_cache = null;
	
	var cfg = {
		id : mcfg.id ? mcfg.id : "",
		count : (typeof mcfg.count != "undefined" ? mcfg.count : null)
	};
	
	var placeholder = new Array();
	
	// -- debug
	try{var debug = new wp_Log();}catch(e){var debug = new Object();debug.log = function(){};};
	this._function = "wp_Form";
	this.debug = debug;
	// --
	
	if( !cfg.id && !cfg.count) {
		debug.log(self,"FATAL! id is missing");
	}
	
	this.init = function() {
	
		var obj = self.form();
	
		for( var count = 0; count < placeholder.length; count++ ) {
			if( obj[placeholder[count].name] ) {
				obj[placeholder[count].name].value = placeholder[count].text;
				
				obj[placeholder[count].name].onfocus = Function("if( this.value == '"+placeholder[count].text+"' ) {this.value = '';}");
				obj[placeholder[count].name].onblur = Function("if( this.value == '' ) {this.value = '"+placeholder[count].text+"';}");
			}
		}
	}
	
	if( document.addEventListener ) {
		window.addEventListener("load",self.init,true);
	} else if( document.attachEvent ) {
		window.attachEvent("onload",self.init);
	} else {
		window.onload = this.init;
	}
	
	this.addPlaceHolder = function(ph) {
		var tmp = {
			name : (ph.name || ph.field),
			text : (ph.text || ph.value )
		};
		placeholder.push_back(tmp);
	}
	
	function getField( name ) {
	    var tmpform = self.form();
	    var field = null;
	    if( !tmpform ) {
	        field = null;
	    }
	    if( tmpform[name] ) {
	        field = tmpform[name];
	    } else {
	        debug.log(self,"Hittar inte efterfrågat fält: "+name);
	        for( var i = 0; i < tmpform.length; i++ ) {
	            debug.log(self,"...letar, index: "+i+", namn: "+tmpform[i].name);
	            if( tmpform[i].name == name ) {
	                field = tmpform[i];
	            } 
	        }
	    }
	    return field;
	}
	
	// -- returnerar värdet av ett fält eller det kombinerade värdet av en en fältserie
	this.get = function( name ) {
	
	    if( !name )
	        return null;
	    
		var field = getField(name);
		var type;
		var value = null;
		
		debug.log(self,"getting value of: " + name  );
		
		if( field && field.length && field.length > 1 ) {
			// -- multipla input's (vanligen radio, checkbox etc..)
			
			var count = 0;
			type = field.type ? field.type : field[0].type;
			value = new Array();
			debug.log(self,"Multipel input, type: "+type);
			
			switch( type ) {
			
				case "checkbox" :
				case "radio" :
					for( count = 0; count < field.length; count++ ) {

						if( field[count].checked && field[count].value.length ) {
							value.push_back( field[count].value );
						}
					}
					break;
				
				case "hidden" :
				case "password" :
				case "text" :
				case "textarea" :
					for( count = 0; count < field.length; count++ ) {
						if( field[count].value.length ) {
							value.push_back( field[count].value );
						}
					}
					break;
				
				case "select" :
				case "select-one" :
					value.push_back( field.options[field.selectedIndex].value );
					break;
					
				case "select-multiple" :
					for( count = 0; count < field.length; count++ ) {
						if( field.options[count].selected && field.options[count].value.length ) {
							value.push_back( field.options[count].value );
						}
					}
					break;
			}
			
			
		} else if( field ) {
			// -- enkla inputs (vanligen text, textarea)
			type = field.type;
			debug.log(self,"Enkel input, type: "+type);
			
			switch( type ) {
			
				case "checkbox" :
				case "radio" :
					value = (field.checked) ? field.value : "";
					break;
				
				case "hidden" :
				case "password" :
				case "text" :
				case "textarea" :
					value = field.value;
					break;
				
				case "select" :
				case "select-one" :
				    try {
    				    value = field.options[field.selectedIndex].value;
    				} catch(e) {
    				    value = "";
    				}
					break;
					
				case "select-multiple" :
					value = field.options[0].selected ? field.options[0].value : "";
			}		
		}
		
		debug.log(self,"value of '"+(field.name?field.name:field[0].name)+"': "+value);
	
		return value;
	}
	
	this.selectAll = function( name ) {
	    self.setStatus( name, true );
	}
	
	this.unSelectAll = function( name ) {
	    self.setStatus( name, false );
	}
	
	this.setStatus = function( name, bool ) {
	
		var field = self.form()[name];
		var type;
	
	    if( field ) {
			// -- enkla inputs (vanligen text, textarea)
			type = field.type ? field.type : field[0].type;
		    
		    switch( type ) {
			
				case "checkbox" :
					if( !field.length ) {
						field.checked = true;
					} else {
						for( var count = 0; count < field.length; count++ ) {
							field[count].checked = bool;
						}
					}
					break;
					
				
				case "select-multiple" :					
					for( var count = 0; count < field.options.length; count++ ) {
						field.options[count].selected = bool;
					}
					break
					
			}		    	
		}
	}
	
	this.set = function( name, value ) {
	
		var field = self.form()[name];
		var type;
		
		if( typeof value == "string" ) {
			value = new Array(value);
		}
		
		if( field ) {
			// -- enkla inputs (vanligen text, textarea)
			type = field.type ? field.type : field[0].type;
			
			debug.log(self,"setting value of: " + name + " to: '" +value + "'" );
			
			switch( type ) {
			
				case "checkbox" :
				case "radio" :
					if( !field.length ) {
						field.checked = (value.find( field.value ) != -1) ? true : false;
					} else {
						for( var count = 0; count < field.length; count++ ) {
							field[count].checked = (value.find( field[count].value ) != -1) ? true : false;
						}
					}
					break;
				
				case "hidden" :
				case "password" :
				case "text" :
				case "textarea" :
					if( !field.length ) {
						field.value = value[0];
					} else {
						for( var count = 0; count < field.length; count++ ) {
							field[count].value = value[0];
						}
					}
					break;
				
				case "select" :
				case "select-one" :
				case "select-multiple" :					
					for( var count = 0; count < field.options.length; count++ ) {
						field.options[count].selected = (value.find( field.options[count].value ) != -1) ? true : false;
					}
					break
			}		
		}
	}
	// --
	
	this.disable = function( name ) {
	
		var elements = self.form().elements;
		
		if( typeof name != "undefined" ) {
			name = name.split(",");
			var tmp = new Array();
			for( var count = 0; count < elements.length; count++ ) {
				if( name.find(elements[count].name) != -1 ) {
					tmp.push_back(elements[count]);
				}
			}
			elements = tmp;
		}
		var length = elements.length;
		
		for( var count = 0; count < length; count++ ) {
			elements[count].disabled=true;
		}
	}
	
	this.enable = function( name ) {
	
		var elements = self.form().elements;
		
		if( typeof name != "undefined" ) {
			name = name.split(",");
			var tmp = new Array();
			for( var count = 0; count < elements.length; count++ ) {
				if( name.find(elements[count].name) != -1 ) {
					tmp.push_back(elements[count]);
				}
			}
			elements = tmp;
		}
		var length = elements.length;
		
		for( var count = 0; count < length; count++ ) {
			elements[count].disabled=false;
		}
	}
	
	this.submit = function() {
		self.form().submit();
	}
	this.reset = function() {
		self.form().reset();
	}
	
	this.form = function() {
	
	    if( form_cache ) {
	        return form_cache;
	    } else if( cfg.count != null ) {
	        form_cache = document.forms[cfg.count];
	    } else if( cfg.id ) {
			var forms = document.getElementsByTagName("form");
			var count = 0;
	    
			while( count < forms.length ) {
			    debug.log(self,"scanning forms, index: "+count);
				if( forms[count] == document.getElementById(cfg.id) ) {
			        debug.log(self,"found!"); 
					form_cache = forms[count];
					break;
				}
				count++;
			}
			
			if( !form_cache && cfg.name ) {
    			form_cache = document[cfg.name];
    		}
		}
		return form_cache;
	}
	
	this.collect = function( field ) {
	
		if( !document[cfg.id] ) {
			debug.log(self,"FATAL! form is missing");
		}
		
		var fields = self.form();
				
		var length = fields.length;
		var name = "";
		var value = {};
		var datafields = ["input","textarea","select"];
		
		var startswith = "";
		
		if( field && field.lastIndexOf("*") == field.length-1 ) {
		    startswith = field.substring(0,field.length-1);
		}
		
		debug.log(self,"form length: " +length);
		
		for( var count = 0; count < length; count++ ) {
			if( datafields.find( fields[count].tagName.toLowerCase() ) != -1 ) {
				name = fields[count].name ? fields[count].name : fields[count][0].name;
				if( name ) {
				    if( !field || field == name || (startswith && (name.indexOf(startswith) == 0)) ) {
				        if( typeof value[name] == "undefined" ) {
    					    value[name] = self.get(name);
    					    debug.log(self,"name: " +name +", value: "+value[name]);
    					} 
					}
				}
			}
		}
		return value;
	}
}
// --

