
var cfForm = new Class({
  Implements: [Options, Events],
  
  options: {
    maxFileSize: 700000,        
    elDefs: [],    
    elRetMsg: null,    
    // ============================ functions
    'fnValidate': function( obj ) { return(true); },
    
    // ============================ events
    'onQueryabort': $empty,
    'onReturn': $empty          
  },

	initialize: function( elForm, action, options ) {    
    this.setOptions(options);    
    var to   = this.options;   
    var self = this;   
            
    var idAnsw = elForm.get('id') + '_answ';
        
    elForm.set('method','post');
    
    elForm.set('action', action);   
    elForm.set('target', idAnsw);
    elForm.addEvents({ 'submit': function() { return false; } });
    
    this.submitted = false;
    this.objTAs = [];
    this.nTab   = 0;
    this.elForm = elForm;    
    this.elAnsw = new Element( 'iframe', { 
      id: idAnsw, 
      name: idAnsw, 
      styles: {'display':'none'},
      events: { 'load': function() { 
          if (self.submitted) {
            var jris = null;
            var ris  = this.contentWindow.document.body.innerHTML;                       
            try { jris = JSON.decode( ris ); } catch(err) { self.showMsg( "Errore connessione al server" ); return; }                      
            if (jris.errnum == null) { self.showMsg( "Risposta server non riconosciuta" ); return; }
            if (jris.errnum != 0) { self.showMsg( jris.errdesc ); return; }
                        
            self.fireEvent( 'return', [self, jris.ris] );
          }  
        }
      }
    }).inject(elForm);
        
    for( var i = 0; i < to.elDefs.length; i++ ) {
      var o  = to.elDefs[i];      
      var el = $(o.id); 
      var tp = el.get('type'); 
      var ta = el.get('tag');
      
      el.set( 'name', o.id ); 
      el.set( 'tabindex', ++this.nTab ); 
      
      if (tp == 'check') el.value = 1;
      if (o.w) el.setStyle( 'width', o.w );
      if (o.h) el.setStyle( 'height', o.h );
      if (o.x) el.setStyle( 'width', o.x );
      if (o.y) el.setStyle( 'height', o.y );      
      el.setStyles( { 'font-family':'sans-serif', 'font-size':'12' } );  
      if (o.l && (tp == 'text')) el.set('maxlength', o.l);
      if (o.v) {
        if (tp == 'checkbox') { el.value = 1; el.checked = (o.v == 0 ? '' : 'checked' ); }
        else { el.value = o.v; }
      }      
      // Disabilitato per problema irrisolto con IE
      //if (o.focus) el.focus();
      
      if (tp == 'file') {
        this.elForm.set( 'enctype', 'multipart/form-data' );
        new Element( 'input', { 'type':'hidden', 'name':'MAX_FILE_SIZE', 'value': to.maxFileSize }).inject(elForm); 
      }  
      if (tp == 'submit') el.addEvent( 'click',  function() { 
        self.objTAs.each( function(o) { o.getValue(); } );
        self.submitForm(); 
        return false; 
      });       
      if (tp == 'reset')  el.addEvent( 'click',  function() { self.fireEvent( 'queryabort', self ); return false; } );
      if (tp == 'checkbox') el.set('value', '1');   
      
      if (o.toLow && (tp == 'text')) {
        el.addEvent( 'keyup', function() { this.value = this.value.toLowerCase(); return true; });      
      }
      if (o.toUp && (tp == 'text')) {
        el.addEvent( 'keyup', function() { this.value = this.value.toUpperCase(); return true; });      
      }
      if (o.toNum && (tp == 'text')) {
        var bOpt = { 'neg':false, 'dec':0 };
        if (o.neg) bOpt.neg = o.neg;
        if (o.dec) bOpt.dec = o.dec;
        el.store( 'opt', bOpt ); 
        
        el.addEvent( 'keypress', function() {
          var ele = event.target;          
	        var key = event.keyCode;
	        var kc  = String.fromCharCode( key );
	        var opt = ele.retrieve( 'opt' );
	  	  
	        if (key <= 13) return( true );
          if ((kc >= '0') && (kc <= '9')) return( true );
    	    
      	  if ((kc == '-') && opt.neg) {
            if (ele.value.length == 0) return( true );
            ele.value = ele.value.valueOf() * -1;   
            return( false );   
          }
      	  if ((kc == '.') && (opt.dec)) return( ele.value.indexOf('.') < 0 );
      
          return false;           
        });      
      }
      if (o.toHtml && (ta == 'textarea')) { 
        var n = this.objTAs.length; 
        this.objTAs[ n ] = new cfTextArea( el, { 
          'tbButtons': [ 'B', 'I', 'Ink', 'sep', 'NL', 'UL', 'sep', 
                         'JL', 'JC', 'JR', 'JF', 'sep', 'undo', 'redo' ],
          'defContUrl': ((o.defUrl != null) ? o.defUrl : '')          
        });     
        //$extend( el, this.objTAs[ n ] );     
      }            
    }    
  },

  // ---------------------------------------------------------------------------
  //  Form Submit
  submitForm: function() {        
    var self = this;
    var ris  = this.options.fnValidate( this );    
    if (ris) {
      this.elForm.submit();
      this.submitted = true; 
    }        
  },  
    
  // ---------------------------------------------------------------------------
  //  Show Message  
  showMsg:function( txt, msec ) {
    var el = this.options.elRetMsg;
    
    if (el == null) return;
    if (!msec) msec = 3000;     
    
    el.setStyle( 'opacity', 0. );
    el.set( 'html', txt );
    el.fade('in');
    (function(){ el.fade('out'); }).delay( msec, this );      
  }   
});

var cfTextArea = new Class({ 
  Implements: [Options],
  
  options: {        
    'enableCod':false,
    'defContUrl': '',      
    'tbButtons': [ 'B', 'I', 'U', 'Ink', 'Bkg', 'sep', 
                   'NL', 'UL', 'sep', 
                   'JL', 'JC', 'JR', 'JF', 'sep', 
                   'copy', 'cut', 'paste', 'sep', 
                   'undo', 'redo' ],
    'colors': ['#000000', '#505050', '#808080', '#c0c0c0', '#ffffff', 
  	   		     '#003000', '#008000', '#808000', '#00AA00', '#00ff00',
  		  	     '#000080', '#0000ff', '#008080', '#30c0c0', '#00ffff',                  
               '#800000', '#ff00ff', '#ff0000', '#ffaa00', '#ffff00'				          
  			      ]                     
  },
  
  // ---------------------------------------------------------------------------
  //  Inizializza gli elementi 
  //             
	initialize: function( original, options ) {     
	  this.setOptions(options); 
	  var to   = this.options;
	  var self = this;
	  
	  if (original == null) return( null );
	    
	  var w = original.getStyle('width').toInt();	  	  
	  var h = original.getStyle('height').toInt();
	  original.setStyle( 'display', 'none' );

    this.elTA = original;
    
	  this.elBase = new Element('div', { 
      'class': 'cfTextAreaBase', 
      'styles': { width: w, height:h }
    }).wraps( original );
    
    this.elToolbar = new Element('div', {
      'class': 'cfTextAreaTB'      
    }).inject( this.elBase );    

    this.elFrame = new Element('iframe', { 
      'class': 'cfTextAreaIF', 
      'src': to.defContUrl,
      'frameBorder':0,
      'styles': {        
        'width' :w,
        'height':h - 23                            
      }
    }).inject( this.elBase );
    
    this.elTA.store( 'obj', this );
    
    
    if (to.defContUrl != '') {
      this.elFrame.addEvent('load', function() { self._activateFrame(); } );
    }   
    else {
      this._activateFrame();
    }       
  }, 
  
	getValue: function() {
	  return( this.elTA.value = this.elDoc.body.innerHTML );    
  },
    
	setValue: function( v ) {
	  this.elTA.value = v;
    this.elDoc.body.innerHTML = v;    
  },
      
  // ---------------------------------------------------------------------------
  //  Esegue un comando sul IFrame
  //
	execCmd: function( cmd, value ) {		 	
	  if (this.elDoc == null) return;
    
    if (window.ie) {
			if (this.lastSelection) this.lastSelection.select();			
		}	  
    		
		try {      		  
			this.elDoc.execCommand(cmd, false, value);			
		} catch (e) {		  
			alert("Impossibile eseguire il comando " + cmd + ". Motivo: " + e.message);
		}		
		this.elFrame.contentWindow.focus();    		
	}, 

  execColor: function( el, cmd ) {        
    var self = this;
    var tc   = this.options.colors;      
                     
    if (cmd == 'BackColor') {
      if (Browser.Engine.gecko || Browser.Engine.presto) cmd = 'HiliteColor';      
    }                     
  
    var cC = new Element('div', { 
      'class':'Colors',     
  		'styles': {'left': el.getCoordinates(self.elToolbar).left },
			'events': { 'mouseleave': function(){this.destroy();} }	
		});
				
		var y = 2;		
		for (n = 0, i = 0; n < 20; n++, i++) {
      if (i > 4) { i = 0; y += 16; }
      
      var cD = new Element('div', {   
          'class':'Color',       
					'styles': {'background-color': tc[n], 'top':y, 'left': 2 + (i * 16) },
          'events': {
            'click': function() {    
              var v = this.getStyle('background-color');
              this.getParent().destroy();           				  
              self.execCmd( cmd, v );      				
          	}          
          }
			}).inject( cC );			         
    }    
    cC.inject( self.elToolbar );
  },
  
  // ---------------------------------------------------------------------------
  //  Creazione dei button  
  //
  _buildToolbar: function() {
    var tb = this.options.tbButtons;    
    var self = this; 
      
    tb.each( function( bt ) {      
      switch (bt) {
        case 'sep': new Element('div', {'class': 'sep'} ).inject( self.elToolbar ); break;
        // ---------------------------------------------------------------------
        case 'B': self._addBtn('B','bold'); break;
        case 'I': self._addBtn( 'I',  'italic' ); break;
        case 'U': self._addBtn( 'U',  'underline' ); break;
        case 'NL': self._addBtn( 'NL', 'insertorderedlist' ); break;
        case 'UL': self._addBtn( 'UL', 'insertunorderedlist' ); break;      
        case 'JL': self._addBtn( 'JL', 'justifyLeft' ); break;
        case 'JC': self._addBtn( 'JC', 'justifyCenter' ); break;
        case 'JR': self._addBtn( 'JR', 'justifyRight' ); break;
        case 'JF': self._addBtn( 'JF', 'justifyFull' ); break;            
        case 'Ink': self._addBtn( 'Ink', 'ForeColor' ); break;
        case 'Bkg': self._addBtn( 'Bkg', 'BackColor' ); break;      
        // ---------------------------------------------------------------------       
        case 'copy': self._addBtn( 'Copy',  'copy' ); break;
        case 'cut': self._addBtn( 'Cut',   'cut' ); break;
        case 'paste': self._addBtn( 'Paste', 'paste' ); break;          
        case 'undo': self._addBtn( 'Undo',  'undo' ); break;
        case 'redo': self._addBtn( 'Redo',  'redo' ); break;              
        default:break;
      }       
    });
  },
  
  _addBtn: function( cls, cmd, value ) {
    var self = this;    
  
    var el = new Element('div', {
        'class': 'btn', 
        'events': { 
          'click': function() { 
             if ((cmd == 'ForeColor')||(cmd == 'BackColor')) { self.execColor( $(this), cmd ); }             
             else { self.execCmd( cmd, value ); }
             return false;
          } 
        }
    }).inject( self.elToolbar );

    new Element('p', { 'class': (cls ? ' cfTextArea_' + cls : '') }).inject( el );  
  },  	
    	
  // ---------------------------------------------------------------------------
  //  Attiviamo edit del browser
  //    
  _activateFrame: function() { 
    var to  = this.options;
    var fr  = this.elFrame;
    var doc = null;          
    
    if      (Browser.Engine.presto)  { doc = fr.contentWindow.document; }  // Opera
		else if (Browser.Engine.trident) { doc = fr.contentWindow.document; }  // IE
		else if (Browser.Engine.webkit)  { doc = fr.contentWindow.document; }  // Chrome Safari  
    else if (Browser.Engine.gecko)   { doc = fr.contentDocument; }         // Firefox    
                   		
    if (doc == null) {
			this.elToolbar.set('html', "Questo browser non supporta l'edit.");
			return;
 		}      
    doc.designMode = "on";
    doc.body.innerHTML = this.elTA.value;
    
    this.elDoc = doc;    
    this._buildToolbar();
  }	
});
