var isTouchDevice = typeof document.ontouchend != 'undefined';

window.addEvent('domready',function(){

  $$('form').each(function(form,i){
    if(tmp = _formValidator(form))
    {
      form.validator = tmp.init();
      delete tmp;
    }
  });
  
  $$('.slider').each(function(el,i){
    if(tmp = __pager(el))
    {
      el.pager =   tmp.init();
      delete tmp;
    }
  });
  
  if($('navigation'))
  {
    selectbox = __generateMenuSelector.generate($('navigation'));
    if(selectbox.selector)
    {
      selectbox.selector.addClass('no-validation').addEvent('change',function(){ window.location.href = this.options[this.selectedIndex].value; }).inject($('top-menu'));
    }
  }
  
  if(isTouchDevice)
  {
    $$('body')[0].addEvent('touchstart',function(){
      if($('language-menu').hasClass('hover')) $('language-menu').removeClass('hover')
    });
    $('language-menu').addEvents({
      'touchstart' : function(e) {
        if(!this.hasClass('hover')) this.addClass('hover');
        else this.removeClass('hover');
      }
    });
  }
});


__generateMenuSelector = {
  menuitems : new Array(),
  selector : null,
  generate : function(el)
  {
    this.walklist(el);
    if(this.menuitems.length>0)
    {
      this.selector = new Element('select.menu-selector');
      this.menuitems.each(function(el){
        opt = new Element('option',{value:el.href,html:el.title});
        if(el.isactive) opt.set('selected','selected');
        opt.inject(this.selector);
      }.bind(this));
    }
    
    return this;
  },
  walklist : function(list,space)
  {
    if(space==undefined) space = '';
    if(typeOf(list)=='element')
    {
      if(list.nodeName.toLowerCase().indexOf('ul')<=-1)
      { 
        list.getChildren('ul').each(function(el){
          this.walklist(el,space);
        }.bind(this));
      }
      else
      {
        list.getChildren('li').each(function(el){
          if(link = el.getChildren('a')[0])
            this.menuitems.push({title:space+link.get('text'),href:link.get('href'),isactive:link.hasClass('rex-active')});

          if(el.getChildren('ul')[0])
            this.walklist(el.getChildren('ul')[0],space+'&nbsp;&nbsp;&nbsp;');
        }.bind(this))
      }
    }
  }
}


getObjectSize = function(obj)
{
  r = {x:0,y:0};
  if(obj)
  {
    r.x+=obj.getSize().x;
    for(var t in {'left':0,'right':0})
    {
      if(ml = obj.getStyle('magin-'+t))
      {
        if(ml.indexOf('em')) r.x+=ml.toInt()*10;
        else r.x+=ml.toInt();
      }
      if(ml = obj.getStyle('padding-'+t))
      {
        if(ml.indexOf('em')) r.x+=ml.toInt()*10;
        else r.x+=ml.toInt();
      }
    }

    r.y+=obj.getSize().y;
    for(var t in {'top':0,'bottom':0})
    {
      if(ml = obj.getStyle('magin-'+t))
      {
        if(ml.indexOf('em')) r.y+=ml.toInt()*10;
        else r.y+=ml.toInt();
      }
      if(ml = obj.getStyle('padding-'+t))
      {
        if(ml.indexOf('em')) r.y+=ml.toInt()*10;
        else r.y+=ml.toInt();
      }
    }
  }
  return r;
}

__pager = function(el) {
  if(typeOf(el)=='element')
  {
    returnObj = {
      duration : 500,
      transition : Fx.Transitions.Sine.easeOut,
      container : el,
      items : null,
      viewsize : {x:0,y:0},
      completesize : {x:0,y:0},
      space : 20,
      
      navigation : null, // the element containing the navigation items,
      stage      : null, // the element where the sliding is done
      wrapper    : null, // the element containing the items - this one is sliding left and right
      
      prevButton : null,
      nextButton : null,
      pagerButtons : null,
      
      current : 0,
      upcoming : 0,
      ismoving : false,
      
      init : function()
      {
        this.items = this.container.getChildren().setStyles({'display':'block'});
        if(this.items.length > 1)
        {
          this.wrapper = new Element('div.wrapper');
          
          newitems = new Array();
          
          for(i=0; i<this.items.length; i++)
          {
            if(this.items[i].hasClass('active') && !this.current) this.current = i;
            
            newitems.push(this.items[i]
            .clone().cloneEvents(this.items[i])
            .setStyles({
              'position' : 'absolute',
              'top' : 0,
              'left' : this.completesize.x+'px',
              'width' : this.items[i].getSize().x
            })
            .inject(this.wrapper));

            this.completesize.x+= getObjectSize(this.items[i]).x + this.space;
            
            if(this.completesize.y < getObjectSize(this.items[i]).y) this.completesize.y = getObjectSize(this.items[i]).y
            this.viewsize.y = this.completesize.y;
          }
          
          this.completesize.x-=this.space;
          
          this.wrapper.setStyles({
            'position' : 'absolute',
            'top' : 0,
            'left' : 0,
            'display' : 'block',
            'width' : this.completesize.x+'px',
            'height' : this.completesize.y+'px'
          });
          
          this.stage = new Element('div.stage').setStyles({
            'position' : 'relative',
            'width' : '100%',
            'height' : this.viewsize.y+'px',
            'overflow' : 'hidden'
          });
          
          this.wrapper.inject(this.stage);
          
          this.navigation = new Element('div.navigation');
          this.insertButtons();
          
          this.container.empty();
          this.navigation.inject(this.container);
          this.stage.inject(this.container);

          this.items = newitems;
          
          this.container.addClass('pager');

          return this;
        }
        return null;
      },
      
      insertButtons : function(){
        if(!this.prevButton)
          this.prevButton = new Element('a.prev',{'href':'javascript:void(0)','html':'&lt;'}).addEvent('click',function(){ if(!this.prevButton.hasClass('inactive')) this.prev(); }.bind(this)).inject(this.navigation);
          
        if(!this.pagerButtons)
        {
          this.pagerButtons = new Array();
          for(i=0; i<this.items.length; i++)
          {
            l = new Element('a.page',{'href':'javascript:void(0)','html':i+1,'rel':i})
                .addEvent('click',function(){
                  this.show(this.rel);
                })
                .inject(this.navigation);
            l.show = function(num){
              this.show(num);
            }.bind(this);

            this.pagerButtons.push(l);
          }
        }

        if(!this.nextButton)
          this.nextButton = new Element('a.next',{'href':'javascript:void(0)','html':'&gt;'}).addEvent('click',function(){ if(!this.nextButton.hasClass('inactive')) this.next(); }.bind(this)).inject(this.navigation);
        
        if(this.current == 0) this.prevButton.addClass('inactive');
        else this.prevButton.removeClass('inactive');

        if(this.current >= this.items.length-1) this.nextButton.addClass('inactive');
        else this.nextButton.removeClass('inactive');
        
        this.pagerButtons.each(function(el){ el.removeClass('inactive').removeClass('current'); });
        this.pagerButtons[this.current].addClass('inactive').addClass('current');
        
      },
      
      prev : function() {
        if(this.current>0) this.show(this.current-1);
      },
      
      next : function() {
        if(this.current<this.items.length-1) this.show(this.current+1);
      },
      
      show : function(num) {
        if(num != this.current && !this.ismoving)
        {
          this.upcoming = num;
          tox = this.items[this.upcoming].getPosition(this.wrapper).x * -1;
          this.effect = new Fx.Morph(this.wrapper, {
            duration : this.duration,
            transition : this.transition,
            onComplete : function(){
              this.current = this.upcoming.toInt();

              this.insertButtons();
              this.ismoving = false;
            }.bind(this)
          })
          .start({
            'left' : tox+'px'
          });
        }
      }
      
    };
    return returnObj;
  }
  return null;
};


















var _translate = function(word,inserts) {
  word = typeOf(word)=='string' ? word : null;
  inserts = typeOf(inserts)=='array' ? inserts : [];
  
  if(word!=null && I18N!=null)
  {
    clang = CUR_CLANG;
    clang = clang==null ? 0 : clang.toInt();

    if(I18N[''+clang]!=null && typeOf(I18N[''+clang][word])=='string')
    {
      word = I18N[''+clang][word];
      
      for(wordi=0; wordi<inserts.length; wordi++)
        word = word.replace("{"+wordi+"}",inserts[wordi]);
      
      word = word.replace(/{([^}]*)}/g,'');
      return word;
    }
  }
  return '[translate:'+word+']';
};


var _formValidator = function(form){
  if(typeOf(form)=='element' && form.nodeName.toLowerCase()=='form')
  {
    returnobj = {
      strings : {
        'empty_field' : 'Bitte geben Sie einen '
      },
      form : form,
      items : form.getElements('input').combine(form.getElements('select')).combine(form.getElements('textarea')),
      required : null,
      patterns : {
        email : '',
        plz   : ''
      },
      init : function()
      {
        this.items.each(function(el)
        {
          if((el.get('type')=='text' || el.get('type').indexOf('select')>-1 || el.get('type')=='textarea' || el.get('type')=='password')
             && (thelabel = $$('label[for='+el.get('id')+']')[0])
             && !el.hasClass('no-validation')
            )
          { 
            el.set('title',thelabel.get('text'));

            if(el.get('type')=='password')
            {
              el.addClass('password');
              try{
                if(el.get('value')==el.get('title') || el.get('value')=='') el.set('type','text');
                else el.set('type','password');
              } catch(e) {};
            }
            thelabel.destroy();
          }

         
          if(el.nodeName.toLowerCase().indexOf('select')>-1)
          {
            if(el.getElement('option[value=]'))
            {
              
              el.getElement('option[value=]').set('text',el.get('title'));
            }
          }
          else
          {
            try {
              if(el.get('value')=='')
                el.set('value',el.get('title'));
            }
            catch(e) {} 
          }



          el.getTheValue = function() {
            return this.nodeName.toLowerCase()=='select' ? this.options[this.selectedIndex].value : this.get('value');
          };
          el.updateClasses = function() {
            if(!this.isEmpty()) el.addClass('notempty'); else el.removeClass('notempty');
            if(this.hasClass('required'))
            {
              if(this.validate()) this.getWrapper(el).removeClass('warning');
              else this.getWrapper(el).addClass('warning');
            }
          };
          el.validate = function() {
            if(this.isEmpty()) return false;
            else if(this.getTheValue()!='')
            {
              if(this.hasClass('email') && !this.getTheValue().match(/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/)) return false;
              else if(this.hasClass('plz') && !this.getTheValue().match(/\d{5}/)) return false;
            }
            return true;
          };
          el.getWrapper = function()
          {
            if(this.getParent('span')) return this.getParent('span');
            else if(this.getParent('li')) return this.getParent('li');
            else return this;
          };
          el.isEmpty = function()
          {
            if(this.getTheValue().trim()=='' || this.getTheValue()==this.get('title')) return true;
            return false;
          };


           
          if(el.hasClass('required'))
          {
            if(!this.required) this.required = new Array();
            this.required.push(el);
          }
        

          if(!el.isEmpty()) el.addClass('notempty');
          

          el.addEvents({

            'blur' : function(){
              this.updateClasses();
              if(this.get('value')=='') this.set('value',this.get('title'));
            },
            'change' : el.updateClasses,
            'keyup' : function() {
              if(this.hasClass('password'))
              {
                try {
                  if(this.get('value')==this.get('title') || this.get('value')=='') this.set('type','text');
                  else this.set('type','password');
                } catch(e) {};
              }
              
              if(this.nodeName.toLowerCase()!='select')
              {
                if(!this.isEmpty()) this.updateClasses();
                if(!this.isEmpty()) this.addClass('notempty');
              }
            },
            'focus' : function(){
              if(this.isEmpty() && typeOf(this.select)=='function') this.select();
              else if(!Browser.ie && this.nodeName.toLowerCase()=='select') this.addClass('notempty');
            }

          });
        }.bind(this));
        
        this.form.addEvent('submit',function(){
          if(this.required)
          {
            field_to_focus = null;
            
            for(i=0; i<this.required.length; i++)
            {
              el = this.required[i];
              el.getWrapper(el).removeClass('warning');
              
              if(!el.validate())
              {
                if(!field_to_focus)
                {
                  field_to_focus = el;
                  if(el.hasClass('email'))
                    alert(_translate('this_is_not_a_valid_email',[el.get('title')]));
                  else
                    alert(_translate('please_fill_out_field',[el.get('title')]));
                }
                
                el.getWrapper(el).addClass('warning');
              }
            }
            
            if(field_to_focus)
            {
              if(typeOf(field_to_focus.select)=='function') field_to_focus.select();
              field_to_focus.focus();
              $$('body')[0].scrollTo($$('body')[0].getScroll().x, field_to_focus.getPosition($$('body')[0]).y);
              return false;
            }
          }
        }.bind(this));
        
        return this;
      }
    }
    
    return returnobj;
  }
  return null;
};
