  
  var Datagrid = {
      




      DOM: YAHOO.util.Dom,
      EVT: YAHOO.util.Event,
      XHR: YAHOO.util.Connect,
      CAL: YAHOO.widget.Calendar,
      
      _cal: '',
      _last_obj: '',
      
      oAutoComp: null,
      oACDS: null,








      
      firebug: function(obj){

        if(typeof(console) == 'object'){
          
          if(typeof(obj) == 'string'){
          
            console.log(obj);
          
          } else if(typeof(obj) == 'object') {
            
            for(i in obj){
              console.log(i + ' - ' + obj[i]);
            }
            
          }
          
        }
      
      },









      url_transform: function(obj_href){
    
        var link_arr = [];
        var link_arg = [];
        var _href = obj_href.href;
        var first_parent = obj_href.parentNode.parentNode;
    
        var _arr = this.DOM.getElementsBy(
                              function(e){
                                if(e.type == 'text')
                                  return true;
                              },
                              'input',
                              first_parent,
                              function(e){
                                if(e.value != '')
                                  link_arr[e.name] = escape(e.value);
                              }
                            );
        
        var spl_href = _href.split("?");
        
        var spl_args = spl_href[1].split("&");
        
        for(var i = 0; i < spl_args.length; i++){
          var spl_subargs = spl_args[i].split("=");
          link_arg[spl_subargs[0]] = spl_subargs[1];
        }
        
        var final_arr = [];
        
        for(i in link_arr){
          if(i in link_arg){
            final_arr[i] = link_arg[i];
          } else {
            final_arr[i] = link_arr[i];
          }
        }
        
        for(i in link_arg){
          final_arr[i] = link_arg[i];
        }
        
        var final_args = "";
        
        for(i in final_arr){
          final_args += '&' + i + '=' + final_arr[i];
        }
        
        final_args = final_args.substr(1,final_args.length);
        
        var final_url = spl_href[0] + '?' + final_args;
        
        window.location = final_url;
    
      },














      intelli_search: function(_obj, obj_cat){

        var myInput = _obj;
        var myContainer = this.DOM.getNextSibling(_obj);

        this.fnCustomFormatter = function(oResultItem, sQuery){

            var sKey = oResultItem[0];
            var nQuantity = oResultItem[1];
            var sKeyQuery = sKey.substr(0, sQuery.length);
            var sKeyRemainder = sKey.substr(sQuery.length);
            var aMarkup = ["<div class=\'sample-result\'><div class=\'sample-quantity\'>",
                nQuantity,
                "</div><span class=\'sample-query\'>",
                sKeyQuery,
                "</span>",
                sKeyRemainder,
                "</div>"];
            return (aMarkup.join(""));

        };
        
        if(this.oACDS != null){
          this.oACDS = null;
        }
        
        this.oACDS = new YAHOO.widget.DS_XHR("datagrid.php", ["\n", "\t"]);
        this.oACDS.responseType = YAHOO.widget.DS_XHR.TYPE_FLAT;
        this.oACDS.maxCacheEntries = 0;
        this.oACDS.scriptQueryAppend = 'cat=' + escape(obj_cat) + '&datagrid=1&datagrid_type=intelli_search';
        this.oACDS.queryMatchSubset = true;
        
        if(this.oAutoComp != null){
          this.oAutoComp.destroy();
          this.oAutoComp = null;
        }
        
        this.oAutoComp = new YAHOO.widget.AutoComplete(myInput, myContainer, this.oACDS);
        this.oAutoComp.queryDelay = 0;
        this.oAutoComp.delimChar = "";
        this.oAutoComp.useIFrame = true;
        this.oAutoComp.formatResult = this.fnCustomFormatter;
        this.oAutoComp.allowBrowserAutocomplete = false;
        
      },
      
      
      
      
      
      
      
      xhr_request: function(xhr_file, xhr_params, xhr_type, xhr_success_call){

        var AjaxObject = {

        	handleSuccess: function(o){
        		if(typeof(xhr_success_call) == 'function')
  			       xhr_success_call(o.responseText);
        	},
        
        	handleFailure: function(o){
        	},
        
        	startRequest:function() {
        	  
        	  Datagrid.XHR.resetDefaultHeaders();
        	  Datagrid.XHR.initHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1');
        	  
            if(xhr_type == 'POST')
              Datagrid.XHR.asyncRequest('POST', xhr_file, callback, xhr_params);
            else if(xhr_type == 'GET')
              Datagrid.XHR.asyncRequest('GET', xhr_file + '?' + xhr_params, callback);

        	}
        
        };

        var callback =
        {
        	success:AjaxObject.handleSuccess,
        	failure:AjaxObject.handleFailure,
        	scope: AjaxObject
        };

        AjaxObject.startRequest();
 
      },
      
      
      
      
      
      
      type_date: function(_obj, _opt){

        var _me = this;
        
        function handleSelect(type,args,obj) {

      		var dates = args[0]; 
      		var date = dates[0];
      		var year = date[0], month = date[1], day = date[2];
      		
      		_obj.value = year + "-" + _me.format_number(month) + "-" + _me.format_number(day);
      		
          this.hide();
      		
      	}

        var _target = this.DOM.getNextSibling(_obj);

        if(typeof this._cal == 'object'){
          this._cal.hide();
        }
        
        this._cal = new this.CAL('',_target, {mindate:_opt.min_date, maxdate:_opt.max_date});
        this._cal.selectEvent.subscribe(handleSelect, this._cal, true);
        
        this._cal.cfg.setProperty("title","Escolha uma data");
        this._cal.cfg.setProperty("close",true);
        
        this._cal.cfg.setProperty("MONTHS_SHORT",   ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Dez"]);
        this._cal.cfg.setProperty("MONTHS_LONG",    ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"]);
        this._cal.cfg.setProperty("WEEKDAYS_1CHAR", ["D", "S", "T", "Q", "Q", "S", "S"]);
        this._cal.cfg.setProperty("WEEKDAYS_SHORT", ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sá"]);
        this._cal.cfg.setProperty("WEEKDAYS_MEDIUM",["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"]);
        this._cal.cfg.setProperty("WEEKDAYS_LONG",  ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]);
        
        this._cal.render();

        
        this._cal.show();

      },
      
      format_number: function(num){
      
        var displayNumber = num;
        
        if (displayNumber <= 9)
        displayNumber = "0" + displayNumber;
        
        return displayNumber;
        
      },
      
      
      check_field: function(_obj){

        if(typeof this._last_obj != 'string'){
        
          var _tr_obj      = this.DOM.getAncestorByTagName(_obj, 'tr');
          var _tr_last_obj = this.DOM.getAncestorByTagName(this._last_obj, 'tr');
          

            this.check_line(this._last_obj);

        
        }
        
        
      },
      
      check_line: function(_obj){

        var DOMobj  = _obj;
        var _par    = this.DOM.getAncestorByTagName(DOMobj, 'tr');
        var _fire   = this;
        var do_save = false;
        var _values = [];
        var _tbody  = this.DOM.getAncestorByTagName(_par, 'tbody');
        var _last   = this.DOM.getLastChild(_tbody);
        
        
        
        this.DOM.getElementsBy(
          
          function(e){

            if(e.type != 'hidden') _values.push(e.value);
            return true;
            
          },
          'input',
          _par
          
        );
        
        this.DOM.getElementsBy(
          
          function(e){

            _values.push(e.value);
            return true;
            
          },
          'select',
          _par
          
        );
        
        this.DOM.getElementsBy(
          
          function(e){
            _values.push(e.value);
            return true;
            
          },
          'textarea',
          _par
          
        );
        
        for(var i = 0; i <= _values.length; i++){
        
          if(_values[i] == '' || _values[i] == undefined){
            do_save = false;
          } else {
            do_save = true;
            break;
          }

        }

        if(_last == _par && do_save == false){
          return false;
        }
        
        this.DOM.getElementsBy(
          
          function(e){

            if(e.getAttribute('required') == 1 && e.value == ''){
              if(do_save != false) do_save = false;
              e.style.border = '1px solid #FFD2D3';
              //_fire.create_error_message(e, 'O campo é de preenchimento obrigatório.');
            }
            
            if(e.getAttribute('fieldtype') == 'number'){
              if(isNaN(e.value) || e.value == ''){
                if(do_save != false) do_save = false;
                e.style.border = '1px solid #FFD2D3';
                //_fire.create_error_message(e, 'O campo tem de ser numérico.');
              }
            } else if(e.getAttribute('fieldtype') == 'email'){
              
              var _email = e.value.replace(/^\s+|\s+$/, '');
              var emailFilter = /^[^@]+@[^@.]+\.[^@]*\w\w$/ ;
              
              if(!emailFilter.test(_email)){
                if(do_save != false) do_save = false;
                e.style.border = '1px solid #FFD2D3';
                //_fire.create_error_message(e, 'O e-mail não é válido.');
              }
              
            }

            return true;
            
          },
          'input',
          _par
          
        );
        
        this.DOM.getElementsBy(
          
          function(e){

            if(e.getAttribute('required') == 1 && e.value == ''){
              if(do_save != false) do_save = false;
              e.style.border = '1px solid #FFD2D3';
              //this.create_error_message(_obj, 'O campo é de preenchimento obrigatório.');
            }

            return true;
            
          },
          'select',
          _par
          
        );
        
        this.DOM.getElementsBy(
        
          function(e){

            if(e.getAttribute('required') == 1 && e.value == ''){
              if(do_save != false) do_save = false;
              e.style.border = '1px solid #FFD2D3';
              //this.create_error_message(_obj, 'O campo é de preenchimento obrigatório.');
            }

            return true;
            
          },
          'textarea',
          _par
          
        );

        if(do_save == true)
          this.save_data(DOMobj);
        
      },
      
      
      save_data: function(_obj){
        
        
        var _array_data = [];
        var _par = this.DOM.getAncestorByTagName(_obj, 'tr');
        var _fire = this;
        var _table = this.DOM.getAncestorByTagName(_par, 'tbody').getAttribute('data_table');
        
        this.DOM.getElementsBy(
          
          function(e){

            _array_data[e.name] = escape(e.value);
            return true;
            
          },
          'input',
          _par
          
        );
        
        
        this.DOM.getElementsBy(
          
          function(e){

            _array_data[e.name] = escape(e.value);
            return true;
            
          },
          'select',
          _par
          
        );
        
        this.DOM.getElementsBy(
          
          function(e){

            _array_data[e.name] = escape(e.value);
            return true;
            
          },
          'textarea',
          _par
          
        );
        
        var _tbody = _fire.DOM.getAncestorByTagName(_par, 'tbody');
        var _rows = _tbody.getAttribute('data_rows');
        var _dt = _tbody.getAttribute('data_table');
        document.getElementById(_dt).value = (parseInt(_rows) + 1);
        
        var xhr_params = '';
        
        for(i in _array_data){
          xhr_params += i+'='+encodeURIComponent(_array_data[i])+'&';
        }
        
        var params = xhr_params + 'save_table=' + _table + '&datagrid=1&datagrid_type=save_data';

        this.xhr_request('datagrid.php', params, 'POST',
          function(e){
            
            var _resarr = e.split('|');
            
            _fire.set_name(_resarr[0], _par);
            
            if(_resarr[1] == 'insert'){
              
              var _tbody = _fire.DOM.getAncestorByTagName(_par, 'tbody');
              var _rows = _tbody.getAttribute('data_rows');
              _tbody.setAttribute('data_rows', (parseInt(_rows) + 1));

            }
            
          }
        );
        
      },
      
      getRandomInt: function(min, max)
      {
        return Math.floor(Math.random() * (max - min + 1)) + min;
      },
      
      add_line: function(_obj){

        if(typeof this._cal == 'object'){
          this._cal.hide();
        }
        
        var _par = this.DOM.getAncestorByTagName(_obj, 'tr');
        
        var _copy = _par.cloneNode(true);

        var _fire = this;
        
        var _next = this.DOM.getNextSibling(_par);
        
        var _tbody = this.DOM.getAncestorByTagName(_par, 'tbody');

        if(_next == null){

          var _rows = _tbody.getAttribute('data_rows');
          
          var _dt = _tbody.getAttribute('data_table');
          document.getElementById(_dt).value = (parseInt(_rows));
          
          var _cnt = (_tbody.rows.length - parseInt(_rows));

          if(_cnt >= 2) return false;
          
          var new_tr = this.DOM.insertAfter(_copy, _par);

          this.DOM.getFirstChild(_par).innerHTML = '&nbsp;';
          this.set_name(0, new_tr);
          this.set_zindex(new_tr);
          
          this.DOM.getElementsBy(
          
            function(e){
  
              if(e.getAttribute('fieldtype') == 'date'){
                e.value = '0000-00-00';
              } else if(e.type != 'hidden') {
                e.value = '';
              }
              
              _fire.delete_error_message(e);
              
            },
            'input',
            new_tr
            
          );
          
          this.DOM.getElementsBy(
          
            function(e){
              
              e.value = '';
              _fire.delete_error_message(e);
  
            },
            'select',
            new_tr
            
          );
          
          this.DOM.getElementsBy(
          
            function(e){
              
              e.innerHTML = '';
              _fire.delete_error_message(e);
  
            },
            'textarea',
            new_tr
            
          );
           
        }
        
      },

      
      set_name: function(_val, _tr){
        
        var _fire = this;
        
        this.DOM.getElementsBy(
          
          function(e){

            var _spl1 = e.name.split('[');
            var _str = _spl1[0] + '[' + _val + '][' + _spl1[2];
            
            e.name = _str;
            
          },
          'input',
          _tr
          
        );
        
        this.DOM.getElementsBy(
          
          function(e){
            var _spl1 = e.name.split('[');
            var _str = _spl1[0] + '[' + _val + '][' + _spl1[2];
            
            e.name = _str;

          },
          'select',
          _tr
          
        );
        
        this.DOM.getElementsBy(
          
          function(e){
            var _spl1 = e.name.split('[');
            var _str = _spl1[0] + '[' + _val + '][' + _spl1[2];
            
            e.name = _str;

          },
          'textarea',
          _tr
          
        );
        
      },
      
      set_zindex: function(_tr){
        
        var _fire = this;
        
        this.DOM.getElementsBy(
          
          function(e){
          
            var _zindex = _fire.DOM.getStyle(e, 'z-index');
            
            if(!isNaN(_zindex)){
              var _int = parseInt(_zindex);
              
              _zindex -= 10;
              _fire.DOM.setStyle(e, 'z-index', _zindex);
            }
            
          },
          'div',
          _tr
          
        );
        
      },
      
      
      key_action: function(_evt, _obj){
        
        if(_evt.keyCode == 46){ // DELETE
          if(confirm('Deseja mesmo apagar esta linha?')){
            this.delete_db_line(_obj);
          }
        } else if(_evt.keyCode == 27){ // ESC
        
          var _spl1 = _obj.name.split('[');
          var _spl2 = _spl1[1].split(']');

          if(_spl2[0] == 0)
            this.delete_dom_line(_obj);
          
        }
        
      },
      
      


      delete_dom_line: function(_obj){
        
        var _par = this.DOM.getAncestorByTagName(_obj, 'tr');
        var _last = this.DOM.getLastChild(_par.parentNode);
        if(_last != _par){
	
			    var _tbody = this.DOM.getAncestorByTagName(_par, 'tbody');
          
          var _rows = _tbody.getAttribute('data_rows');
          
          var _spl1 = _obj.name.split('[');
          var _spl2 = _spl1[1].split(']');


          if(_spl2[0] != 0){
            _tbody.setAttribute('data_rows', (parseInt(_rows) - 1));
            
            var _dt = _tbody.getAttribute('data_table');
            document.getElementById(_dt).value = (parseInt(_rows) - 1);
          }
          
          _par.parentNode.removeChild(_par);
          this._last_obj = '';

        }
        
      },
      
      
      
      delete_db_line: function(_obj){
        
        var _me = this;
        
        var _par = this.DOM.getAncestorByTagName(_obj, 'tr');
        var _table = this.DOM.getAncestorByTagName(_par, 'tbody').getAttribute('data_table');
        
        var xhr_params = _obj.name + '=' + escape(_obj.value) + '&delete_table=' + _table + '&datagrid=1&datagrid_type=delete_db_line';
        
        this.xhr_request('datagrid.php', xhr_params, 'POST', function(o){_me.delete_dom_line(_obj)});
        
      },
      
      
      create_error_message: function(_obj, _msg){
        
        var _td =  this.DOM.getAncestorByTagName(_obj, 'td');
        
        var _error_obj = document.createElement('div');
        
        _error_obj.className = 'datagrid_error';
        
        _error_obj.innerHTML = _msg;
        
        _td.appendChild(_error_obj);
        
      },
      
      
      delete_error_message: function(_obj){
        
        _obj.style.border = '';
        
        var _fire = this;
        
        var _td =  this.DOM.getAncestorByTagName(_obj, 'td');
        
        if(_td){

          this.DOM.getElementsByClassName('datagrid_error', 'div', _td,
            function(e){
              _td.removeChild(e);
            }
          );
        
        }
        
      }
      
      




  };
  
