function getFE(name)
{
  return document.getElementsByName(name)[0];
}
Ext.namespace(
  'disptacher',
  'index',
  'user', 
  'article',
  'search',
  'mail',
  'tools',
  'ui'
);
Ext.onReady(function() 
{
  if(typeof result != 'undefined')
    Ext.dispatcher.dispatchResult(result);
  else
    Ext.tools.debugOut('result ist undefiniert')
  
  var a = Ext.select('input.textinput');
  Ext.each(a.elements, function(e)
  {
    e.onfocus = function()
    {
      this.select();
    };
    e.onblur = function()
    {
      //this.value = Ext.tools.formatter.moneyFormat(this.value);
    };
  });
  
  var a = Ext.select('input.number');
  Ext.each(a.elements, function(e)
  {
    e.elementtype = 'number';
    var cl = this.className.split(' ');
    var decimals = 2;
    for(var i = 0; i < cl.length; i++)
      if(cl[i].substr(0, 3) == 'dec')
        decimals = parseInt(cl[i].substr(3, 8));

    this.value = Ext.tools.formatter.moneyFormat(this.value, decimals);

    e.onfocus = function()
    {
      this.value = Ext.tools.formatter.moneyValue(this.value);
      this.select();
    };
    e.onblur = function()
    {
      this.value = Ext.tools.formatter.moneyFormat(this.value, decimals);
    };
  });
});
Ext.dispatcher = function()
{
  return {
    dispatchResult: function(r)
    {
      Ext.tools.debugOutDir(r);
      if(!r)
        return;
      
      if(r.success == false)
        alert(r.errormsg);

      eval('if(Ext.' + r.modul + ') Ext.' + r.modul + '.dispatch(r);');
    }
  };
}();
Ext.index = function()
{
  return {
    dispatch: function(r)
    {
    }
  };
}();

Ext.user = function()
{
  passwordValid = function()
  {
    if(getFE('mode').value == 'myleaseshare')
    {
      if(getFE('customer[password]').value != '' &&
         getFE('customer[password]').value != getFE('password2').value)
      {
        alert('Passworteingabe stimmt nicht mit der Best�tigung �berein.');
        return false;
      }
    }
    return true;
  };
  
  return {
    dispatch: function(r)
    {
	  switch(r.action) 
	  {
	    case 'login':
          if(getFE('customer[username]'))
            getFE('customer[username]').focus();
          break;
      
	    case 'newpassword':
          getFE('customer[email]').focus();
          break;
      
	    case 'register':
          getFE('customer[salutation]').focus();
          break;
      }
    },
    
    editOffer: function(r)
    {
    	r.ondblclick();
      
    },
    
    loginFormIsValid: function()
    {
      var ret = (getFE('customer[username]').value == '' || Ext.get('login.password').getValue() == '');
      if(ret)
      {
        alert('Bitte füllen Sie Benutzername und Passwort aus.');
        getFE('customer[username]').focus();
      }

      return !ret;
    },
    doregister: function()
    {
      if(this.registerFormIsValid())
      {
        Ext.Ajax.request({
          callback: function(o, success, resp)
          {
            if(success)
            {
              try
              {
                var o = Ext.decode(resp.responseText);
                if(o.success)
                {
                  Ext.tools.redirect('/user/login?dealer=' + o.data.dealer);
                }
                else
                  Ext.tools.onAjaxFailure(o.msg);
              }
              catch(e)
              {
                
              }
            }
          },
          method:'post',
          url: '/ajax/registeruser/',
          params: Ext.tools.getFormSubmitParams(document.forms['registeruserform'])
       });
      }
    },
    registerFormIsValid: function()
    {
      var ret = (Ext.get('customer.salutation').getValue() == '' 
        || Ext.get('customer.username').getValue() == ''
        || Ext.get('customer.surname').getValue() == ''
        || Ext.get('customer.firstname').getValue() == ''
        || Ext.get('customer.street').getValue() == ''
        || Ext.get('customer.postcode').getValue() == ''
        || Ext.get('customer.city').getValue() == ''
        || Ext.get('customer.phone').getValue() == ''
        || Ext.get('customer.email').getValue() == '');

      if(Ext.get('chkAGB'))
        ret = (ret || !Ext.get('chkAGB').dom.checked);
      
      if(ret)
      {
        alert('Bitte füllen Sie alle mit Stern gekennzeichneten Felder aus.');
      }

      return !ret;
    },
    save: function()
    {
      if(this.registerFormIsValid() && passwordValid())
      {
        Ext.Ajax.request({
          callback: function(o, success, resp)
          {
            if(success)
            {
              try
              {
                var o = Ext.decode(resp.responseText);
                if(o.success)
                {
                  alert('Daten wurden gespeichert');
                  //Ext.tools.redirect('/user/myleas/');
                }
                else
                  Ext.tools.onAjaxFailure(o.msg);
              }
              catch(e)
              {
                
              }
            }
          },
          method:'post',
          url: '/ajax/saveuser/',
          params: Ext.tools.getFormSubmitParams(document.forms['registeruserform'])
       });
      }
    },
    submitNewpasswordForm: function()
    {
      if(!Ext.tools.isEmail(getFE('customer[email]').value))
      {
        alert('Bitte geben Sie eine gültige Email-Adresse ein.');
        return false;
      }
      Ext.Ajax.request({
        callback: function(o, success, resp)
        {
          if(success)
          {
          	alert('Wir haben Ihnen Ihr neues Password zugesendet. Bitte prüfen Sie Ihren Maileingang.');
            try
            {
              var o = Ext.decode(resp.responseText);
              if(o.success)
              {
                Ext.tools.redirect('/user/login/');
              }
              else
                Ext.tools.onAjaxFailure(o.msg);
            }
            catch(e)
            {
              
            }
          }
        },
        method:'post',
        url: '/ajax/newpassword/',
        params: Ext.tools.getFormSubmitParams(document.forms['newpasswordform'])
      });
      return false;
    }
  };
}();
Ext.search = function()
{
  return {
    dispatch: function(r)
    {
      if(r.action == 'start')
      {
        if(!r.success)
          Ext.get('norecords').setStyle('display', 'block');
        Ext.get('art').focus();
      }
    }
  };
}();
Ext.mail = function()
{
  return {
    dispatch: function(r)
    {
      if(r.action == 'login')
      {
        if(!r.success)
          Ext.get('login.novaliduser').setStyle('display', 'block');
        getFE('customer[username]').focus();
      }
    },
    mailFormIsValid: function()
    {
      
      if(Ext.get('mail.sender').getValue() == '' 
         || Ext.get('mail.subject').getValue() == ''
         || Ext.get('mail.message').getValue() == '')
      {
        alert('Bitte füllen Sie alle mit Stern gekennzeichneten Felder aus.');
        Ext.get('mail.sender').focus();

        return false;
      }
      
      var email = /^([\w\-]+)(\.[\w\-]+)*@([\w\-]+\.){1,5}([A-Za-z]){2,4}$/;
      if(!email.test(Ext.get('mail.sender').getValue()))
      {
        alert('Die Email-Adresse ist ungültig.');
        Ext.get('mail.sender').focus();
        Ext.getDom('mail.sender').select();
        
        return false;
      }

      return true;
    },
    sendMail: function(parm)
    {
    	if(Ext.mail.mailFormIsValid())
    	{
        Ext.Ajax.request({
          callback: function(o, success, resp)
          {
            if(success)
            {
              try
              {
                var o = Ext.decode(resp.responseText);
                if(o.success)
                {
                	alert(o.msg);
                }
                else
                  Ext.tools.onAjaxFailure(o.msg);
              }
              catch(e)
              {
                
              }
            }
          },
          method:'post',
          url: '/ajax/mail/',
          params: Ext.tools.getFormSubmitParams(document.forms['mailform'])
       });
    	}
    }
  };
}();
Ext.article = function()
{
  return {
    dispatch: function(r)
    {
      switch(r.action)
      {
        case 'index':
          var odd = Ext.select('tr.odd');
          if(odd.elements)
            Ext.each(odd.elements, function(e)
            {
              e.onmouseover = function(){colorizeRow(e, '#E8E8E8');};
              e.onmouseout = function(){colorizeRow(e, '#FFFFFF');};
              
            });
          var even = Ext.select('tr.even');
          if(even.elements)
            Ext.each(even.elements, function(e)
            {
              e.onmouseover = function(){colorizeRow(e, '#E8E8E8');};
              e.onmouseout = function(){colorizeRow(e, '#F8F8F8');};
              
            });
          
          break;
          
        case 'masc1':
          if(r.mode == 'edit')
          {
            Ext.getDom('vh_carbrand').disabled = true;
            Ext.getDom('vh_model').disabled = true;
            getFE('article[ls_offer_type]').disabled = true;
            getFE('article[vh_cartype]').disabled = true;
          }
          this.calcKwPs('ps', getFE('article[vh_kw]').value);
          this.setOfferType(getFE('article[ls_offer_type]').value);
          this.setCarType(getFE('article[vh_cartype]').value);
          break;
          
        case 'masc3':
          this.swapAgreementType(getFE('article[ls_agreement_type]').value);
          break;
      }
    },
    checkDealer: function()
    {
      if(!getFE('article[ls_offer_type]'))
        return;
      var dealer = (getFE('ko_customer').value == 4);
      var offertype = getFE('article[ls_offer_type]').value;
      
      if(Ext.getDom('trAngebotsart')) Ext.getDom('trAngebotsart').style.display = (dealer ? 'block' : 'none');
      if(Ext.getDom('trReg')) 
    	Ext.getDom('trReg').style.display = (dealer && getFE('article[vh_cartype]').value == 1 ? 'none' : 'block');
    },
    setOfferType: function(aa)
    {
    	
    	Ext.getDom('trCartype').style.display = (aa == 1 ? 'none' : 'block');
    	
    	if(aa == 1)
    	  getFE('article[vh_cartype]').value = 3;
   	  Ext.getDom('trReg').style.display = (getFE('article[vh_cartype]').value == 1 ? 'none' : 'block');
    	
    	this.checkInputfields();
    },
    setCarType: function(v)
    {
      if(Ext.getDom('trReg')) Ext.getDom('trReg').style.display = (v == 1 ? 'none' : 'block');
      //if(Ext.getDom('trHolders')) Ext.getDom('trHolders').style.display = (v == 1 ? 'none' : 'block');
      
      
      this.checkInputfields();
    },
    checkInputfields: function()
    {
      var cartype = getFE('article[vh_cartype]').value;
      var angtype = getFE('article[ls_offer_type]').value;
      
      if(angtype == 0) return;
      if(angtype == 1)
      {
        Ext.getDom('trHolders').style.display = 'block';
        Ext.get('lblHolders').dom.firstChild.nextSibling.innerHTML = '';
      }
      else
      {
      	if(cartype == 1)
      	  Ext.getDom('trHolders').style.display = 'none';
      	else
      	{
      	  Ext.getDom('trHolders').style.display = 'block';
      	  Ext.get('lblHolders').dom.firstChild.nextSibling.innerHTML = '&nbsp;*';
      	}
      }
      //alert('cartype ' + cartype + ', angtype ' + angtype);
    },
    calcMilesRemain: function()
    {
      if(getFE('article[ls_offer_type]').value == 2) return;
      var lfz = Ext.tools.formatter.moneyValue(getFE('article[ls_total_months]').value);
      var mpa = Ext.tools.formatter.moneyValue(getFE('article[ls_mileage_pa]').value);
      var km = Ext.tools.formatter.moneyValue(getFE('article[ls_mileage]').value);
      if(getFE('article[ls_offer_type]').value == 2)
        getFE('milesremain').value = Ext.tools.formatter.moneyFormat(lfz / 12 * mpa, 0);
      else
        getFE('milesremain').value = Ext.tools.formatter.moneyFormat(lfz / 12 * mpa - km, 0);
    },
    calcKwPs: function(dest, val)
    {
      if(typeof val == 'undefined' || val == '' || isNaN(val))
    	val = 0;
      else
    	  val = parseInt(val, 10);
      if(dest == 'ps')
        val = Math.round(val * 1.359622);
      else
        val = Math.round(val * 0.735499);
      getFE(dest).value = val; 
    },
    swapAgreementType: function(v)
    {
      Ext.getDom('trls_extmilecharge').style.display = (v == 1 ? 'none' : 'block');
      Ext.getDom('trls_minmilecharge').style.display = (v == 1 ? 'none' : 'block');
      Ext.getDom('trls_residualval').style.display = (v == 1 ? 'block' : 'none');
    },
    checkAnzImages: function()
    {
      var uploadctrl = getFE('uploadForm');
      if(!uploadctrl)
        return;
      //alert(getFE('article[opt_extrafotos]').checked + ' ' + anz_images);
      var maximages = 8;
      if(getFE('article[opt_extrafotos]'))
        maximages = (getFE('article[opt_extrafotos]').checked ? 8 : 4);
      //var dis = !((getFE('extrafotos').value == 1 && anz_images < 8) || (!getFE('extrafotos').value == 0 && anz_images < 4));
      uploadctrl.style.display = (anz_images >= maximages ? 'none' : 'block');
    },
    clickOptPhotos: function()
    {
      Ext.Ajax.request({
        callback: function(o, success, resp)
        {
          if(success)
          {
            try
            {
              var o = Ext.decode(resp.responseText);
              if(o.success)
                Ext.article.checkAnzImages();
              else
                Ext.tools.onAjaxFailure(o.msg);
            }
            catch(e)
            {
              
            }
          }
        },
        method:'post',
        url: '/ajax/savearticle/',
        params: Ext.tools.getFormSubmitParams(document.forms['masc2Form'])
      });
      //getFE('extrafotos').value=(this.checked ? 1 : 0);Ext.article.checkAnzImages(); 
    },
    preview: function(masc,nosave)
    {
			var backurl = encodeURIComponent('/article/' + masc + '?articleid=' + getFE('articleid').value + '&articleuid=' + getFE('articleuid').value + '&custuid=' + getFE('custuid').value +  "&mode=" + getFE('mode').value);
    	if(nosave==1)
    	{
	      Ext.tools.redirect('/article/load?id=' + getFE('articleid').value + '&backurl=' + backurl);
    	}
    	else
    	{
	      Ext.Ajax.request({
	        callback: function(o, success, resp)
	        {
	          if(success)
	          {
	            try
	            {
	              var o = Ext.decode(resp.responseText);
	              if(o.success)
	              {
//	                var backurl = encodeURIComponent('/article/' + masc + '?articleid=' + getFE('articleid').value + "&mode=" + getFE('mode').value);
	                Ext.tools.redirect('/article/load?id=' + getFE('articleid').value + '&backurl=' + backurl);
	              }
	              else
	                Ext.tools.onAjaxFailure(o.msg);
	            }
	            catch(e)
	            {
	              
	            }
	          }
	        },
	        method:'post',
	        url: '/ajax/savearticle/',
	        params: Ext.tools.getFormSubmitParams(document.forms[masc + 'Form'])
	      });
	     }
    },
    changeMasc: function(followMasc)
    {
      Ext.tools.redirect('/article/' + followMasc + '?articleid=' + getFE('articleid').value + '&mode=' + getFE('mode').value);
    },
    submitMasc: function(mascName, followMasc, forward)
    {
      var valid = true;
      if(forward)
        eval('valid = this.' + mascName + 'FormIsValid();');
      
      if(valid)
      {
        Ext.Ajax.request({
          callback: function(o, success, resp)
          {
            if(success)
            {
              try
              {
                var o = Ext.decode(resp.responseText);
                if(o.success)
                {
                  if(followMasc)
                    Ext.tools.redirect('/article/' + followMasc + '?articleid=' + getFE('articleid').value + '&articleuid=' + getFE('articleuid').value + '&custuid=' + getFE('custuid').value + '&mode=' + getFE('mode').value);
                  else
                    Ext.tools.redirect('/user/');
                }
                else
                  Ext.tools.onAjaxFailure(o.msg);
              }
              catch(e)
              {
                
              }
            }
          },
          method:'post',
          url: '/ajax/savearticle/',
          params: Ext.tools.getFormSubmitParams(document.forms[mascName + 'Form'])
        });
        //document.articleForm.action = '/article/' + followMasc;
        //document.articleForm.submit();
      }
    },
    masc1FormIsValid: function()
    {
      
      //debugger;
      var ret = (getFE('article[vh_carbrand]').value > 0 &&
                 getFE('article[vh_model]').value != '' &&
                 getFE('article[vh_ccm]').value > 0 &&
                 getFE('article[vh_extcolor]').value > 0 &&
                 getFE('article[vh_kw]').value > 0 &&
                 getFE('article[vh_transmission]').value > 0 &&
                 getFE('article[vh_fuel]').value > 0 &&
                 getFE('article[vh_location]').value != '' &&
                 (getFE('article[ls_offer_type]').value != 1 || 
                    getFE('article[vh_cartype]').value > 0));
      if(getFE('article[ls_offer_type]').value == 2)// Neuvertrag
      {
        if(getFE('article[vh_cartype]').value == 2 ||
          getFE('article[vh_cartype]').value == 3)
          ret = ret && (getFE('article[vh_reg_month]').value > 0 &&
                    getFE('article[vh_reg_year]').value > 0);
      }
      else
        ret = ret && (getFE('article[vh_reg_month]').value > 0 &&
            getFE('article[vh_reg_year]').value > 0);
      
      if(getFE('ko_customer').value == 4)
      {
        var cartype = getFE('article[vh_cartype]').value;
	    var angtype = getFE('article[ls_offer_type]').value;
	    if(angtype == 2 && cartype > 1)
          ret = ret && getFE('article[vh_holders]').value > 0;
      }
        
      if(!ret) alert('Bitte füllen Sie alle mit Stern gekennzeichneten Felder aus.');
      return ret;
    },
    masc2FormIsValid: function()
    {
      var ret = true;
      
      return ret;
    },
    masc3FormIsValid: function()
    {
      var ret = true;
      if(getFE('article[ls_offer_type]').value != 2)
        ret = (getFE('article[ls_leascompany]').value != '' &&
              Ext.tools.formatter.moneyValue(getFE('article[ls_remain_months]').value) > 0);
      
      if(getFE('article[vh_cartype]').value != 1)
        ret = (ret && Ext.tools.formatter.moneyValue(getFE('article[ls_mileage]').value) > 0);
        
      var ret = ret & (Ext.tools.formatter.moneyValue(getFE('article[ls_total_months]').value) > 0 &&
//              Ext.tools.formatter.moneyValue(getFE('article[ls_remain_months]').value) > 0 &&
                  Ext.tools.formatter.moneyValue(getFE('article[ls_mileage_pa]').value) > 0 &&
//                      Ext.tools.formatter.moneyValue(getFE('article[ls_mileage]').value) > 0 &&
                          Ext.tools.formatter.moneyValue(getFE('article[ls_monthly_rate]').value) > 0);
      if(getFE('article[ls_agreement_type]').value == 1)
        ret &= (Ext.tools.formatter.moneyValue(getFE('article[ls_residualval]').value) > 0);
      else
        ret &= (Ext.tools.formatter.moneyValue(getFE('article[ls_extmilecharge]').value) > 0 &&
            Ext.tools.formatter.moneyValue(getFE('article[ls_minmilecharge]').value) > 0);
      
      if(!ret) alert('Bitte füllen Sie alle mit Stern gekennzeichneten Felder aus.');
      return ret;
    },
    masc4FormIsValid: function()
    {
      var ret = true;
      
      return ret;
    },
    masc5FormIsValid: function()
    {
      var ret = true;
      
      return ret;
    },
    masc6FormIsValid: function()
    {
      var ret = Ext.getDom('chkAGB').checked;
      if(!ret)
        alert('Sie müssen den Allgemeinen Gewschäftsbedingungen zustimmen, um das Angebot einstellen zu können.');
      return ret;
    }
    
  };
}();

function colorizeRow(r, c)
{
  for(var i = 0; i < r.cells.length; i++)
    r.cells[i].style.backgroundColor = c;
}

Ext.tools = function()
{
  return {
    resoveLocation: function(plz)
    {
    
      Ext.Ajax.request({
        callback: function(o, success, resp)
        {
          if(success)
          {
            try
            {
              var o = Ext.decode(resp.responseText);
              if(o.success)
              {
                getFE('city').value = o.data;
              }
              else
                Ext.tools.onAjaxFailure(o.msg);
            }
            catch(e)
            {
              
            }
          }
        },
        method:'post',
        url: '/ajax/getlocation/',
        params: {plz:plz}
      });
    },
    isEmail: function(s)
    {
      var email = /^([\w\-]+)(\.[\w\-]+)*@([\w\-]+\.){1,5}([A-Za-z]){2,4}$/;
      return email.test(s);
    },
    getFormSubmitParams: function(f)
    {
      var ret = {};
      for(var i = 0; i <f.elements.length; i++)
        if(f.elements[i].tagName == 'INPUT' || f.elements[i].tagName == 'SELECT'
          || f.elements[i].tagName == 'TEXTAREA')
          if(f.elements[i].type && f.elements[i].type == 'checkbox')
            ret[f.elements[i].name] = f.elements[i].checked ? 1 : 0;
          else
          {
            if(f.elements[i].elementtype && f.elements[i].elementtype == 'number')
              ret[f.elements[i].name] = Ext.tools.formatter.moneyValue(f.elements[i].value);
            else
              ret[f.elements[i].name] = f.elements[i].value;
          }
      return ret;
    },
    onAjaxFailure: function(msg)
    {
      Ext.tools.debugOut('Ajax Failure: ' + msg);
      alert(msg);
      
    },
    redirect: function(url)
    {
      var d = new Date();
      d = d.getTime();
      if(url.indexOf('?') >= 0)
        url += '&' + d;
      else
        url += '?' + d;
      Ext.tools.debugOut('redirect to ' + url);
      document.location.href = url;
    },
    debugOut: function(s)
    {
    /*
      if(Ext.isGecko)
        console.log(s);
        */
    },
    debugOutDir: function(s)
    {
    /*
      if(Ext.isGecko)
        console.dir(s);
        */
    }
    
  };
}();

Ext.tools.formatter = function()
{
  return {
    moneyFormat: function(val)
    {
      if(Ext.tools.formatter.moneyFormat.arguments.length > 1)
        stellen = Ext.tools.formatter.moneyFormat.arguments[1];
      else
        stellen = 2;
         
      val = String(val).replace(/\,/,".");
      
      if(val.substr(0, 1) == '-')
      {
        val = val.substr(1, val.length - 1);
        sVorzeichen = '-';
      }
      else
        sVorzeichen = '';
      
      if(isNaN(val))
        val = 0;
      else
        val = this.moneyValue(val) * Math.pow(10, stellen);
      if(stellen == 0)
        return parseInt(val);
        
      val = Math.round(val) / Math.pow(10, stellen);
      val = String(val);
      komma = val.indexOf(".");
      nachkomma = "";
      if(komma >= 0)
      {
        nachkomma = val.substr(komma + 1, val.length - komma + 1);
        val = val.substr(0, komma);
      }
      while(nachkomma.length < stellen)
        nachkomma += "0";

      //  tausender Seperatoren einfügen
      vorkomma = "";
      while(val.length > 3)
      {
        vorkomma = "." + val.substr(val.length - 3, 3) + vorkomma;
        val = val.substr(0, val.length - 3);
      }
      vorkomma = val + vorkomma;
      if(vorkomma == "")
        vorkomma = "0";

      return sVorzeichen + vorkomma + "," + nachkomma;
    },
    moneyValue: function(val)
    {
      if(val == "")
        return "0.00";
      if(!isNaN(val))
        return val;
      //val = ctrl.value;
      ret = "";
      kpos = -1;
      kanz = -1;
      for(i = 0; i < val.length; i++)
      {
        if(val.substr(i, 1) == "." || val.substr(i, 1) == ",")
        {
          kpos = i;
          kanz++;
        }
        else
          ret += val.substr(i, 1);
      }
      if(kpos == 0)
        ret = "0." + ret;
      else if(kpos > 0)
      {
        kpos -= kanz;
        ret = ret.substr(0, kpos) + "." + ret.substring(kpos, ret.length);
      }
      return parseFloat(ret);
    }
    
    
  }
}();
Ext.ui = function()
{
  var fixedRow = null;
  return {
	toggleFieldset: function(e)
	{
	  var container = Ext.getDom(e);
	  var open = container.style.display == 'none';
	  container.style.display = (open ? 'block' : 'none');
	  Ext.getDom('img' + e).src = '/media/leaseshare/fieldset_' + (open ? 'open' : 'closed') + '.png';
	},
	
	colorRow: function(r, color)
	{
	  if(r == fixedRow)
		return;
	  r.style.backgroundColor = color;
	},
	fixRow: function(r)
	{
	  if(fixedRow)
		fixedRow.style.backgroundColor = '#ffffff';
	  r.style.backgroundColor = '#e0e0e0';
	  fixedRow = r;
	  Ext.getDom('btn_editoffer').disabled = false; 
	},
	getFixedRow: function()
	{
	  return fixedRow;
	}
  };
  
}();
