Ext.namespace('TJ.Admin');


// Forms
TJ.Admin.FormLayout = Ext.extend(Ext.layout.FormLayout, 
{
	    renderItem : function(c, position, target){
        if(c && !c.rendered && c.isFormField && c.inputType != 'hidden'){
            var args = [
                   c.id, c.fieldLabel,
                   (c.labelStyle||this.labelStyle||''),
                   this.elementStyle||'',
                   typeof c.labelSeparator == 'undefined' ? this.labelSeparator : c.labelSeparator,
                   (c.itemCls||this.container.itemCls||'') + (c.hideLabel ? ' x-hide-label' : ''),
                   c.clearCls || 'x-form-clear-left' ,
				   c.desc||'',
				   c.narrative||'',
				   (c.narrative) ? ' border-bottom:1px dashed #00CC00; cursor:help;':'',
				   (c.subheading)? '<div class="FieldSubheading yui-cssbase">'+c.subheading + '</div>' :'',
				   (c.heading)? '<div class="FieldHeading">'+c.heading + '</div>' :''
            ];

            if(typeof position == 'number'){
                position = target.dom.childNodes[position] || null;
            }
            if(position){
                this.fieldTpl.insertBefore(position, args);
            }else{
                this.fieldTpl.append(target, args);
            }
            c.render('x-form-el-'+c.id);
        }else {
            Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);
        }
    },
	labelSeparator:'',
	fieldTpl: (function() {
            var t = new Ext.Template(
                '<div class="x-form-item {5}" tabIndex="-1">',
					'{11}',
					'{10}',
                    '<label for="{0}" style="{2}" class="x-form-item-label"><span style="{9}" title="{8}">{1}</span>{4}</label>',
                    '<div class="x-form-element" id="x-form-el-{0}" style="{3}">',
                    '</div><div class="FieldDesc" style="{3}">{7}</div><div class="{6}"></div>',
                '</div>'
            );
            t.disableFormats = true;
	        return t.compile();
    })()
 });
Ext.Container.LAYOUTS['tjadminform'] = TJ.Admin.FormLayout;

TJ.Admin.FieldSet = Ext.extend(Ext.form.FieldSet,{
    layout: 'tjadminform'
});

/*
TJ.StandardRequest= function(config) {
	Ext.apply(config,	{callback: function (options,success, response) {
		var res=TJ.Admin.ProcessJSONResponse(options,success, response);
	} });
	Ext.Ajax.request ( config);

};
*/

Ext.reg('tjfieldset',TJ.Admin.FieldSet);

	TJ.Admin.StatusPanelForm = Ext.extend(Ext.Panel, {
				errorIconCls : 'x-form-invalid-icon',
				validIconCls : 'x-status-valid',

		autoScroll: true,
		border: false,
		layout: 'fit',

		initComponent: function() {
//			this.formconfig.border=false;
//			console.log('formconfig',this.formconfig);
			this.items=  this.form = new TJ.Admin.Form( this.formconfig);

			this.bbar =  new Ext.StatusBar({
				iconCls: 'ready-icon'
//	            defaultText: 'Ready'
//				,				plugins: new Ext.ux.ValidationStatus({form: this.form.getId()})
			});
			TJ.Admin.StatusPanelForm.superclass.initComponent.call(this);
			this.doLayout();
			this.form.on('failed', function(message){
				this.getBottomToolbar().setStatus( {text: message, iconCls: 'x-status-error'});				

			},this);

			this.form.on('actioncomplete',function(form,action) {
				this.getBottomToolbar().clearStatus();
			},this);
		},
		render: function(ct,pos){
			Ext.get(ct).removeClass('x-mask-loading');
			div=Ext.get(ct).first();
			if(div)
				div.remove();

			TJ.Admin.StatusPanelForm.superclass.render.call(this,ct,pos);
		}
	});

Ext.reg('tjstatuspanelform',TJ.Admin.StatusPanelForm);

	TJ.Admin.Form = Ext.extend(Ext.FormPanel,{
		frame: true,
		layout: 'tjadminform',
		labelAlign: 'right',
		autoScroll: true,
		labelWidth: 145,
		fileUpload: false,
		notifyComponent: null,
		defaults: {	selectOnFocus: true,
		            msgTarget: 'side'
		  		  },
		render: function(ct,pos){
			TJ.Admin.Form.superclass.render.call(this,ct,pos);
			this.focusFirst();
		},
		initComponent:function() {
			if(this.buttons) {
				var i=0;
				while(this.buttons[i]) {
					this.buttons[i].handler=this.doSubmit;
					this.buttons[i].scope=this;
					if(i===0)
						this.buttons[i]['default']=true;
					i=i+1;
				}
			}
			else {
				this.buttons=[ { text: 'Save',
								 scope: this,
								 handler: this.doSubmit,
								 'default': true}];
								


			}


			for( i=0; i<this.items.length;i++){
				if (this.items[i].xtype=='tjuserfile')
				{
					console.log('File Upload');
					this.fileUpload=true;
					break;
				}
			}

			TJ.Admin.Form.superclass.initComponent.call(this);
			this.form.trackResetOnLoad=true;
			// Enable autosubmit from any field type.
			this.fieldArray={};
			this.items.each(function(f){
				f.on('dosubmit',this.doSubmit,this);
				this.fieldArray[f.getName()]=f.getId();
			},this);

			this.items.each(function(f){
				f.fieldArray=this.fieldArray;
			},this);

			this.on('actioncomplete', function(form,action){
				this.getEl().unmask();
				if(action.result)
					TJ.Admin.ProcessStandardResponse(action.result);
			});
			this.on('actionfailed', function(form,action){
				this.getEl().unmask();
				if(action.failureType == Ext.form.Action.SERVER_INVALID){
					if(action.result) {
						TJ.Admin.ProcessStandardResponse(action.result);

					if(action.result.errors)
						form.items.each(function(f){
									if(action.result.errors[f.name||f.getName()]) {	f.focus(true,true); return false;}
								});
						if(action.result.errors.__form__){
							this.fireEvent('failed',action.result.errors.__form__);

						}
					}
				} else
				if(action.failureType == Ext.form.Action.CLIENT_INVALID){
					this.focusInvalidField();
				} else {
					if(action.result) {
						TJ.Admin.ProcessStandardResponse(action.result);

					}
				}
			});
	    },
		doSubmit: function(field){
			if(tinyMCE) tinyMCE.triggerSave();
				this.getForm().submitValue = field.value || 'default';
				if(this.getForm().isValid()){
					this.getEl().mask('Processing...','x-mask-loading');
					this.getForm().doAction('tjsubmit',{params:{'_submit': this.getForm().submitValue}});
				}
				else
					this.focusInvalidField();

			},
		focusInvalidField: function(){
				this.items.each(function(f){ if(! f.isValid()) {f.focus(true,true); return false;}});

				this.fireEvent('failed','There are errors in your input');
			},
		focusFirst: function(){
				this.items.each(function(f){ if(!f.disabled) {f.focus(true,true); return false;}});
			}
	});

// Form Handling override for Submit to handle invalid JSON return value;

TJ.formSubmit=Ext.extend(Ext.form.Action.Submit,{
	handleResponse: function(response){
		try
		{
			return TJ.formSubmit.superclass.handleResponse.call(this,response);
		}
		catch (ex)
		{
			return { success: false,
					 errors : { __form__: "We were unable to process your form.  Please try again"},
					 alert: { title: 'Error',message: "We were unable to process your form.  Please try again"}
			};
		}
	}
});
Ext.form.Action.ACTION_TYPES.tjsubmit=TJ.formSubmit;


