/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.widget.Form");

dojo.require("dojo.widget.*");
dojo.require("dojo.widget.HtmlWidget");

dojo.widget.defineWidget("dojo.widget.Form", dojo.widget.HtmlWidget,
	{
		/*
		summary:
			Widget for easily moving data to/from form

			description:
				gets and sets data to and from js-object. With
				this it's easy to create forms to application.
				Just create empty form, then set it's values
				with this and after user pushes submit,
				getValues and send them as json-notation to
				server.

				Note: not all Form widgets are supported ATM

			usage:
				<form dojoType="Form" id="myForm">
					Name: <input type="text" name="name" />
				</form>
				myObj={name: "John Doe"};
				dojo.widget.byId('myForm').setValues(myObj);

				myObj=dojo.widget.byId('myForm').getValues();

		*/

		isContainer: true,
   		templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onSubmit:onSubmit'></form>",
		formElements: [],
		// ignoreNullValue:
		//	if true, then only fields that has data is set to form
		// 	if false, fields that does not have corresponding object, is set to empty
		ignoreNullValues: false,

		postCreate: function(args,frag){
			for (var key in args) {
				if (key == "dojotype") continue;
				var attr= document.createAttribute(key);
      				attr.nodeValue=args[key];
      				this.containerNode.setAttributeNode(attr);
    			}
  		},
		_createRepeaters: function (/*object*/obj, /*widget*/widget) {
			for(var i=0; i<widget.children.length; ++i) {
				  if (widget.children[i].widgetType == "RepeaterContainer") {
					var rIndex=widget.children[i].index;
					var rIndexPos=rIndex.indexOf("%{index}");
					rIndex=rIndex.substr(0,rIndexPos-1);
					var myObj = this._getObject(obj, rIndex);
					if (typeof(myObj) == "object" && myObj.length == 0) {
						myObj=new Array();
					}
					var rowCount = widget.children[i].getRowCount();
					for (var j=0,len=rowCount; j<len; ++j) {
						widget.children[i].deleteRow(0);
					}
					for (var j=0; j<myObj.length; j++) {
    					 	widget.children[i].addRow(false);
					}
				}
				if (widget.children[i].isContainer) {
					this._createRepeaters(obj, widget.children[i]);
				}
			}
		},

		_createFormElements: function() {
   			if(dojo.render.html.safari) {
				// bug in safari (not registering form-elements)
				this.formElements=[];
				var elems = ["INPUT", "SELECT", "TEXTAREA"];
				for (var k=0; k < elems.length; k++) {
					var list = this.containerNode.getElementsByTagName(elems[k]);
					for (var j=0,len2=list.length; j<len2; j++) {
						this.formElements.push(list[j]);
					}
				}
				// fixed in safari nightly
			} else {
				this.formElements=this.containerNode.elements;
			}
		},
		onSubmit: function(/*event*/e) {
    			e.preventDefault();
  		},

		submit: function() {
			this.containerNode.submit();
		},

		_getFormElement: function(/*form elements name*/name) {
			if(dojo.render.html.ie) {
				for(var i=0, len=this.formElements.length; i<len; i++) {
					var element = this.formElements[i];
					if (element.name == name) {
						return element;
					} // if
				} // for
			} else {
				var elem = this.formElements[name];
				if (typeof(elem) != "undefined") {
					return elem;
				}
			}
			return null;
		},

		_getObject: function(/*object*/obj, /*string*/searchString) {
			var namePath = [];
			namePath=searchString.split(".");
			var myObj=obj;
			var name=namePath[namePath.length-1];

			for(var j=0, len=namePath.length;j<len;++j) {
				var p=namePath[j];
				if (typeof(myObj[p]) == "undefined") {
					myObj[p]={};
				}
				myObj=myObj[p];
			}
			return myObj;
		},
		_setToContainers: function (/*object*/obj,/*widget*/widget) {
			for(var i=0, len=widget.children.length; i<len; ++i) {
				var currentWidget=widget.children[i];
				if (currentWidget.widgetType == "Repeater") {
        				for(var j=0,len=currentWidget.getRowCount(); j<len; ++j) {
          					currentWidget._initRow(j);
        				}
				}

				if (currentWidget.isContainer) {
					this._setToContainers (obj, currentWidget);
					continue;
				}

				switch(currentWidget.widgetType) {
					case "Checkbox":
						currentWidget.setValue(currentWidget.inputNode.checked);
						break;
					case "DropdownDatePicker":
						currentWidget.setValue(currentWidget.getValue());
						break;
					case "Select":
						//widget.children[i].setValue(myObj[name]);
						continue;
						break;
					case "ComboBox":
						//widget.children[i].setSelectedValue(myObj[name]);
						continue;
						break;
					default:
						break;
				}
			}
		},
		setValues: function(/*object*/obj) {
			this._createFormElements();
    			this._createRepeaters(obj,this);
			for(var i=0, len=this.formElements.length; i<len; i++) {
				var element = this.formElements[i];
				if (element.name == '') {continue};
				var namePath = new Array();
				namePath=element.name.split(".");
				var myObj=obj;
				var name=namePath[namePath.length-1];
				for(var j=1,len2=namePath.length;j<len2;++j) {
					var p=namePath[j - 1];
					if(typeof(myObj[p]) == "undefined") {
						myObj=undefined;
						break;
					};
					myObj=myObj[p];
				}

				if (typeof(myObj) == "undefined") {
					continue;
				}
				if (typeof(myObj[name]) == "undefined" && this.ignoreNullValues) {
					continue;
				}
				var type=element.type;
				if (type == "hidden" || type == "text" || type == "textarea" || type == "password") {
					type = "text";
				}
				switch(type) {
					case "checkbox":
						element.checked=false;
						if (typeof(myObj[name]) == 'undefined') continue;
						for (var j=0,len2=myObj[name].length; j<len2; ++j) {
							if(element.value == myObj[name][j]) {
								element.checked=true;
							}
						}
						break;
					case "radio":
						element.checked=false;
						if (typeof(myObj[name]) == 'undefined') {continue};
						if (myObj[name] == element.value) {
							element.checked=true;
						}
						break;
					case "select-multiple":
						element.selectedIndex=-1;
						for (var j=0,len2=element.options.length; j<len2; ++j) {
							for (var k=0,len3=myObj[name].length;k<len3;++k) {
								if (element.options[j].value == myObj[name][k]) {
									element.options[j].selected=true;
								}
							}
						}
						break;
					case "select-one":
						element.selectedIndex="0";
						for (var j=0,len2=element.options.length; j<len2; ++j) {
							if (element.options[j].value == myObj[name]) {
								element.options[j].selected=true;
							} else {
							//	element.options[j].selected=false;
							}
						}
						break;
					case "text":
						var value="";
						if (typeof(myObj[name]) != 'undefined') {
							value = myObj[name];
						}
						element.value=value;
						break;
					default:
						dojo.debug("Not supported type ("+type+")");
						break;
				}
      			}
			this._setToContainers(obj,this);
		},
		getValues: function() {
			this._createFormElements();
			var obj = { };

			for(var i=0,len=this.formElements.length; i<len; i++) {
				// FIXME: would be better to give it an attachPoint:
				var elm = this.formElements[i];
				var namePath = [];
				if (elm.name == '') { continue;}
				namePath=elm.name.split(".");
				var myObj=obj;
				var name=namePath[namePath.length-1];
				for(var j=1,len2=namePath.length;j<len2;++j) {
					var nameIndex = null;
					var p=namePath[j - 1];
					var nameA=p.split("[");
					if (nameA.length > 1) {
						if(typeof(myObj[nameA[0]]) == "undefined") {
							myObj[nameA[0]]=[ ];
						} // if
						nameIndex=parseInt(nameA[1]);
						if(typeof(myObj[nameA[0]][nameIndex]) == "undefined") {
							myObj[nameA[0]][nameIndex]={};
						}
					} else if(typeof(myObj[nameA[0]]) == "undefined") {
						myObj[nameA[0]]={}
					} // if

					if (nameA.length == 1) {
						myObj=myObj[nameA[0]];
					} else {
						myObj=myObj[nameA[0]][nameIndex];
					} // if
				} // for

				if ((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type=="radio" && elm.checked)) {
					if(name == name.split("[")[0]) {
						myObj[name]=elm.value;
					} else {
						// can not set value when there is no name
					}
				} else if (elm.type == "checkbox" && elm.checked) {
					if(typeof(myObj[name]) == 'undefined') {
						myObj[name]=[ ];
					}
					myObj[name].push(elm.value);
				} else if (elm.type == "select-multiple") {
					if(typeof(myObj[name]) == 'undefined') {
						myObj[name]=[ ];
					}
					for (var jdx=0,len3=elm.options.length; jdx<len3; ++jdx) {
						if (elm.options[jdx].selected) {
							myObj[name].push(elm.options[jdx].value);
						}
					}
				} // if
				name=undefined;
			} // for
		return obj;
	}
});
