/* ------------------------------------------------------------------------------------
Public Function list
	addField - Adds a new item to the form
		name  -  Name of the input
                type  -  type of input(text, password, radio, checkbox, dropdown, multiselect, list, button)
                value -  value of input
                foptions  -  input options.  events and validation functions
	onComplete(msg) - function called after the form is submited. is passed the message returned by the processing page.

Parameters
	Name - Form Name
	destination_div - div name for the destination of the form
	proc_page - File used by the ajax call to post the data.
	options - defines the operations of the grid
		option:value
Examples
    var form = formClass( frm, Parent, 'processform.php', {'Title':'Test Form'});
    form.addField('User', 'Text', 'Please enter user', {'label':'User:'});
    form.addField('Password', 'Password', '', {'label':'Password:'});
    form.addField('email', 'Text', 'enter valid email address', {'label':'Email:', 'validation':function(){validateEmail(this.value};});
    form.addField('Submit', 'Button', 'Submit', {'label':'User:'});
*/

function formClass(  name, destination_div, proc_page, options)
{	
	this.addField = function(name, type, value, foptions)
	{
                foptions = foptions || {};
		var row = this.tbl.addRow();
                foptions.label = foptions.label || name;
		var flabel = row.addCell(foptions.label);
                var fField = row.addCell();

                switch(type.toLowerCase())
                {
                    case "hidden":
                        fField.appendChild(this.addHidden(name, value, foptions));
                        row.hide();
                        break;
                    case "text":
                        fField.appendChild(this.addText(name, value, foptions));
                        break;
                    case "calender":
                        foption.iscalender = true;
                        fField.appendChild(this.addText(name, value, foptions));
                        break;
                    case "textarea":
                        fField.appendChild(this.addTextArea(name, value, foptions));
                        break;
                    case "password":
                        fField.appendChild(this.addPassword(name, value, foptions));
                        break;
                    case "radio":
                        fField.appendChild(this.addRadio(name, value, foptions));
                        break;

                    case "checkbox":
                        fField.appendChild(this.addCheckBox(name, value, foptions));
                        break;
                    case "dropdown":
                        fField.appendChild(this.addDropDown(name, value, foptions));
                        break;
                    case "multiselect":
                        fField.appendChild(this.addMultiSelect(name, value, foptions));
                        break;
                    case "list":
                        fField.appendChild(this.addList(name, value, foptions));
                        break;
                    case "button":
                        fField.appendChild(this.addButton(name, value, foptions));
                        flabel.hide();
                        break;
                    default:
                        break;
                }

		return row;
	};
	
//Private functions
// Add Different Fields
        this.processOptions = function(tBox, opt)
        {
            if(opt.enabled) tbox.enable();
            if(opt.onChange) addEvent(tBox, "change", opt.onChange);
            if(opt.onClick) addEvent(tBox, "click", opt.onClick);
            if(opt.onKeyUp) addEvent(tBox, "keyup", opt.onKeyUp);
            if(opt.onKeyPress) addEvent(tBox, "keypress", opt.onKeyPress);
            if(opt.onMouseOver) addEvent(tBox, "mouseover", opt.onMouseOver);
            if(opt.onMouseDown) addEvent(tBox, "mousedown", opt.onMouseDown);
            if(opt.onMouseOut) addEvent(tBox, "mouseout", opt.onMouseOut);
            if(opt.validation) tBox.validation = opt.validation;
        }

	this.addText = function(name, value, opt)
	{
            var tBox = document.createElement('input');
            tBox.setAttribute('type', 'text');
            tBox.name = name;
            tBox.value = value || "Please enter text";
            Element.extend(tBox);
            this.processOptions(tBox, opt);
            if(opt.disable){tBox.disable();}
            if(opt.iscalender){tBox.isCalender();}
            return tBox;
	};

	this.addTextArea = function(name, value, opt)
	{
                opt.rows = opt.rows || 5;
                opt.cols = opt.cols || 50;
		var tBox = document.createElement('textarea');
                tBox.setAttribute('rows', opt.rows);
                tBox.setAttribute('cols', opt.rows);
		tBox.name = name;
		tBox.value = value || "Please enter text";
		Element.extend(tBox);
                this.processOptions(tBox, opt);
		return tBox;
	};

	this.addHidden = function(name, value)
	{
		var tBox = document.createElement('input');
		tBox.setAttribute('type', 'hidden');
		tBox.name = name;
		tBox.value = value || '';
		Element.extend(tBox);
		return tBox;
	};
	
	this.addPassword = function(name, value, opt)
	{
		var tBox = document.createElement('input');
		tBox.setAttribute('type', 'password');
		tBox.name = name;
		tBox.value = value || "";
		Element.extend(tBox);
                this.processOptions(tBox, opt);
		
		return tBox;
	};

	this.addRadio = function(name, values, opt)
	{
            var tbl = document.createElement('table');
            Element.extend(tbl);
            tbl.addBody();
            var row;

            for(var i = 0; i < values.length; i++)
            {
                row = tbl.addRow();
                row.addCell(values[i]);
		var tBox = document.createElement('input');
		tBox.setAttribute('type', 'radio');
		tBox.setAttribute('value', values[i]);
                tBox.setAttribute('name', name);
		Element.extend(tBox);
                this.processOptions(tBox, opt);
                row.addCell().appendChild(tBox);
            }
            return tbl;
	};

	this.addCheckBox = function(name, values, opt)
	{
            var tbl = document.createElement('table');
            Element.extend(tbl);
            tbl.addBody();
            var row;

            for(var i = 0; i < values.length; i++)
            {
                row = tbl.addRow();
                row.addCell(values[i]);
		var tBox = document.createElement('input');
		tBox.setAttribute('type', 'checkbox');
		tBox.setAttribute('value', values[i]);
                tBox.setAttribute('name', name);
		Element.extend(tBox);
                this.processOptions(tBox, opt);
                row.addCell().appendChild(tBox);
            }
            return tbl;
	};
	
	this.addDropDown = function(name, values, opt)
	{
		var tBox = document.createElement('select');
		tBox.setAttribute("name", name);
		for(var i = 0; i < values.length; i++)
		{
			tBox.appendChild(document.createElement('option'));
			tBox.lastChild.innerHTML = values[i][0];
                        tBox.lastChild.setAttribute('value', values[i][1]);
		}

		this.processOptions(tBox, opt);
		return tBox;
	};

	this.addMultiSelect = function(name, values, opt)
	{
		var tBox = document.createElement('select');
                var size = opt.size || "5";
		tBox.setAttribute("name", name);
                tBox.setAttribute("multiple", 'true');
		tbox.tBox.setAttribute("size", size);
		for(var i = 0; i < values.length; i++)
		{
			tBox.appendChild(document.createElement('option'));
			tBox.lastChild.innerHTML = values[i][0];
                        tBox.lastChild.setAttribute('value', values[i][1]);
		}
		this.processOptions(tBox, opt);
		return tBox;
	};

	this.addList = function(name, values, opt)
	{
		var tBox = document.createElement('select');
                var size = opt.size || "5";
		tBox.setAttribute("name", name);
		tbox.tBox.setAttribute("size", size);
		for(var i = 0; i < values.length; i++)
		{
			tBox.appendChild(document.createElement('option'));
			tBox.lastChild.innerHTML = values[i][0];
                        tBox.lastChild.setAttribute('value', values[i][1]);
		}
		this.processOptions(tBox, opt);
		return tBox;
	};

	this.addButton = function(name, label, opt)
	{
            var btn = document.createElement('div');
            btn.innerHTML = label;
            btn.id = name;
            btn.className = opt.className || 'button';
            this.processOptions(btn, opt);
            return btn;
	};

        this.hideField = function(el)
        {
            var rtn = false;
            var Form = this.form;
            for(i = 0; i < Form.elements.length; i++){
                if (Form.elements[i].name == el){
                    Form.elements[i].value = '';
                    var p = Form.elements[i].parentNode.parentNode;
                    if(p.visible()){
                        p.hide();
                        rtn = true;
                    }
                }
            }
            return rtn;
        };

        this.fieldExists = function(el)
        {
            var rtn = false;
            var Form = this.form;
            for(i = 0; i < Form.elements.length; i++){
                if (Form.elements[i].name == el){
                    rtn = true;
                }
            }
            return rtn;
        };

        this.showField = function(el)
        {
            var rtn = false;
            var Form = this.form;
            for(i = 0; i < Form.elements.length; i++){
                if (Form.elements[i].name == el){
                    Form.elements[i].value = '';
                    var p = Form.elements[i].parentNode.parentNode;
                    if(!p.visible()){
                        p.show();
                        rtn = true;
                    }
                }
            }
            return rtn;
        };

        this.submit = function(fnc)
        {
            fnc = fnc || function(){};
            this.onSubmit(fnc);
        }

        this.onSubmit = function(fnc)
        {
            fnc = fnc || function(){};
            var self = this;
            var Form = this.form;
            var a = new sack();
            a.requestFile = this.procPage;

            for(i = 0; i < Form.elements.length; i++){
                if(Form.elements[i].validation())
                {
                    if (Form.elements[i].type=="select-one"){
                        for(j=Form.elements[i].options.length-1; j>=0; j--)
                        {
                            selectedValue = Form.elements[i].options[j].value;
                            selectedText = Form.elements[i].options[j].text;
                            if(Form.elements[i].options[j].selected){
                                if(selectedValue == "") selectedValue = selectedText;
                                a.setVar(Form.elements[i].name, selectedValue);
                            }
                        }
                    } else if(Form.elements[i].type=="select-multiple"){
                        tval = "";
                        for(j=Form.elements[i].options.length-1; j>=0; j--)
                        {
                            selectedValue = Form.elements[i].options[j].value;
                            selectedText = Form.elements[i].options[j].text;
                            if(Form.elements[i].options[j].selected){
                                tval = tval+selectedValue.trim() +"^";
                            }
                        }
                        a.setVar(Form.elements[i].name, tval);
                    } else if(Form.elements[i].type=="radio") {
                        var x = Form.elements[i].getCheckedValue();
                        if(x != '') a.setVar(Form.elements[i].name, x);
                    } else {
                        if(Form.elements[i].type === 'password'){
                            var x = MD5(document.iForm.elements[i].value);
                            a.setVar(Form.elements[i].name, x);
                        } else if(Form.elements[i].type === 'checkbox'){
                            if(Form.elements[i].checked === true){
                                a.setVar(Form.elements[i].name, Form.elements[i].value);
                            }
                        } else {
                            a.setVar(Form.elements[i].name, Form.elements[i].value);
                        }
                    }
                } else {
                    return false;
                }
            }

             a.onCompletion = function(){
                self.onComplete(a.response);
                a = null;
            };
            a.onError = function(msg) {
                alert("postForm "+msg, "High", "jsclass_Navigator");
            };
            a.runAJAX();
            return true;
        }

        this.onComplete = function(msg){};
	
	var self = this;
        this.options = options || {'holder':'holder'};
	this.div = document.getElementById(destination_div);
        this.options.enctype = this.options.enctype || "";
        this.options.target = this.options.target || "";
        this.options.method = this.options.method || "post";
        this.validation = new Array();

	this.form = document.createElement('form');
        
        this.form.action = proc_page;
        this.form.enctype = this.options.enctype;
        this.form.target= this.options.target;
        this.form.method= this.options.method;
        this.form.onsubmit = function(){self.submit();return false;}

        this.tbl = document.createElement("table");
        Element.extend(this.tbl);
	this.tbl.addBody();
        this.form.appendChild(this.tbl);
	this.procPage = proc_page;

        this.div.appendChild(this.form);
	
	if(this.options.Title)
	{
            row = this.tbl.addRow();
            var th = row.addHeader();
            th.setAttribute('cspan', 2);

            var titleWords = document.createElement('h1');
            titleWords.innerHTML = this.options.Title;
            th.appendChild(titleWords);
	}
}

