var erfcmsScripts=new Object, erfcmsMobile=($(document.documentElement).hasClass('erfcms_mobile') ? true : false);

var domnotready=false;

function erfcmsPrint(id)
{
  while (id!=document.body)
  {
    id.getParent().getChildren().each( function(el) {
      el.addClass('erfcms_'+(el!=id ? 'no' : '')+'print');
    } );
    id=id.getParent();
  }
}

function erfcmsToHTML(string)
{
  return string.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
}

function erfcmsJsLoaded(name)
{
  var fn;
  erfcmsScripts[name].loaded=true;
  while (fn=erfcmsScripts[name].callbacks.pop()) fn();
}

function erfcmsIncludeOnce(name,js,fn,css)
{
  if (!erfcmsScripts[name]) 
  {
    Asset.javascript(js,{ 'charset':'UTF-8', 'onload': function() { erfcmsJsLoaded(name); } } );
    if (css) Asset.css(css);
    erfcmsScripts[name]={ callbacks : [fn], loaded : false };
  }
  else
  {
    erfcmsScripts[name].callbacks.push(fn);
    if (erfcmsScripts[name].loaded) erfcmsJsLoaded(name);
  }
}

function erfcmsMenu(ul)
{
  ul.getElements('li').each(
    function(li) {
      var ul=li.getElement('ul'), a=li.getElement('a'), s=self.location.href.replace(/#.*$/,'');
      if (ul)
      {
        li.addClass('erfcms_node').removeClass('erfcms_open').getElement('a').addEvent('click',function(e) { this.slide('toggle'); e.stop(); }.bind(ul));
        ul.get('slide').hide().addEvent('complete',function(e) { if (this.get('slide').open) { this.getParent('li').addClass('erfcms_open'); } else {  this.getParent('li').removeClass('erfcms_open'); } }.bind(ul));
      }
      else if (a)
      {
        var r=a.href.replace(/#.*$/,'');
        if (r==s || r==s+'index.php' || li.hasClass('erfcms_current'))
        {
          li.getParents('ul:not([data-erfcms-type="menu"])').slide('show').getParent('li').addClass('erfcms_open');
          li.addClass('erfcms_current').getParents('li').addClass('erfcms_current');
        }
      }
    }
  );
}

function erfcmsToggle(el)
{
  el.slide('hide');
  var options=JSON.decode(el.get('data-erfcms'));
  eval(options.toggler).addEvent('click',function(e) { this.slide('toggle'); e.stop(); }.bind(el));
}

function erfcmsCheckslide(options,firstrun)
{
  var open=eval(options.condition);
  this.getElements('input, select, textarea').set('disabled', (open ? '' : 'disabled'));
  if (firstrun) this.slide(open ? 'show' : 'hide');
  else this.slide(open ? 'in' : 'out');
}

function erfcmsSlide(el)
{
  var options=JSON.decode(el.get('data-erfcms'));
  erfcmsCheckslide.attempt([options,true],el);
  erfcmsCheckslide.periodical(500,el,[options,false]);
}

function erfcmsMediaError(media)
{
  media.getElement('embed').replaces(media);
}

function erfcmsDomready()
{
  if (document.body)
  {
  // LOCALE

  Locale.use(document.getElement('html').get('lang'));

  // Input without type => type=text

  $$('input:not([type])').set('type','text');

  // HTML Striped Table

  $$('table').each(function(table) {
    new HtmlTable(table, { classZebra: 'erfcms_odd', classEven: 'erfcms_even' } );
  });

  // Backwards compatibility start

  $$("a[rel=external]").addEvent('click',function(e) { if (window.open(this.getAttribute('href'),'_blank')) e.stop(); });

  if (!erfcmsMobile && $$("a[rel^=zoom]").length>0)
  {
    erfcmsIncludeOnce('zoom','/erfmodules/erfcms4/js/plugins/zoom.js',function() { $$("a[rel^=zoom]").addEvent('click',erfZoomClick); } );
  }

  // Backwards compatibility end

  $$("[data-erfcms-type]").each(function(el) { 
    switch (el.get('data-erfcms-type'))
    {
      case 'article': erfcmsIncludeOnce('article','/erfmodules/erfcms4/js/plugins/article.js', function() { erfcmsArticle(el); } ); break;
      case 'webform': erfcmsWebform(el); break;
      case 'zoom': if (!erfcmsMobile) { erfcmsIncludeOnce('zoom', '/erfmodules/erfcms4/js/plugins/zoom.js', function() { el.addEvent('click',erfZoomClick); } ); } break;
      case 'tabs': erfcmsIncludeOnce('tabs','/erfmodules/erfcms4/js/plugins/tabs.js', function() { new erfcmsTabs(el,JSON.decode(el.get('data-erfcms'))); } ); break;
      case 'menu': erfcmsMenu(el); break;
      case 'toggle': erfcmsToggle(el); break;
      case 'slide':  erfcmsSlide(el); break;
      case 'sortable': el.retrieve('HtmlTable').enableSort(); break;
      case 'alert': el.style.display='none'; alert (el.get('text'),JSON.decode(el.get('data-erfcms'))); break;
      case 'wysiwyg': if (!erfcmsMobile) { erfcmsIncludeOnce('tinymce','/erfmodules/erfcms4/js/plugins/tinymce/jscripts/tiny_mce/tiny_mce.js', function() { erfcmsIncludeOnce('wysiwyg','/erfmodules/erfcms4/js/plugins/wysiwyg.js', function() { erfcmsWysiwyg(el); } ); } ); } break;
    }
  } );

  if ($$("a[data-erfcms-type=lightbox]").length>0 || $$("a[rel^=lightbox]").length>0)
  {
    var lb=new Object;

    $$("a[data-erfcms-type=lightbox]").each( function(el) { var group=(el.get("data-erfcms") ? el.get("data-erfcms") : "nogroup"); if (!lb[group]) { lb[group]={ elements:[] }; }; lb[group].elements.push(el); } );
    $$("a[rel^=lightbox]").each( function(el) { var group=(el.get("rel")!='lightbox' ? el.get("rel") : "nogroup"); if (!lb[group]) { lb[group]={ elements:[] }; }; lb[group].elements.push(el); } );

    erfcmsIncludeOnce('cerabox','/erfmodules/erfcms4/js/plugins/cerabox/cerabox.js', function() { Object.each (lb,function(v,k) { v.elements.cerabox({ group: (k!='nogroup'), animation: 'ease', titleFormat: (v.elements.length>1 && k!='nogroup' ? '{number} / {total} - ' : '')+'{title}' }); } ); } , '/erfmodules/erfcms4/css/plugins/cerabox/style/cerabox.css');
  }

  $$('label[for]').addEvent('click',function(e) { }); // Weird Iphone Workaround

  if (!erfcmsMobile && !Modernizr.inputtypes['color'] && $$("input[type=color]").length>0)
  {
    erfcmsIncludeOnce('jscolor','/erfmodules/erfcms4/js/plugins/jscolor/jscolor.js', function() {
      $$("input[type=color]").each( function(el) {
        new jscolor.color(el, { hash: true });
      } );
    } );
  }

  if (!erfcmsMobile && !Modernizr.inputtypes['datetime-local'] && $$("input[type=datetime-local]").length>0)
  {
    erfcmsIncludeOnce('datepicker','/erfmodules/erfcms4/js/plugins/datepicker/datepicker.js', function() {
      new Picker.Date($$('input[type=datetime-local]'), {
        timePicker: true,
        startView: 'years',
        useFadeInOut: false,
        blockKeydown: false,
        format: '%Y-%m-%dT%H:%M:00'
      });
    }, '/erfmodules/erfcms4/css/plugins/datepicker/datepicker.css' );
  }

  if (!erfcmsMobile && !Modernizr.inputtypes['date'] && $$("input[type=date]").length>0)
  {
    erfcmsIncludeOnce('datepicker','/erfmodules/erfcms4/js/plugins/datepicker/datepicker.js', function() {
      new Picker.Date($$('input[type=date]'), {
        startView: 'years',
        useFadeInOut: false,
        blockKeydown: false,
        format: '%Y-%m-%d'
      });
    }, '/erfmodules/erfcms4/css/plugins/datepicker/datepicker.css' );
  }

  if (!erfcmsMobile && !Modernizr.inputtypes['time'] && $$("input[type=time]").length>0)
  {
    erfcmsIncludeOnce('datepicker','/erfmodules/erfcms4/js/plugins/datepicker/datepicker.js', function() {
      new Picker.Date($$('input[type=time]'), {
        pickOnly: 'time',
        useFadeInOut: false,
        blockKeydown: false,
        format: '%H:%M:00'
      });
    }, '/erfmodules/erfcms4/css/plugins/datepicker/datepicker.css' );
  }

  if (!erfcmsMobile && !Modernizr.inputtypes['year'] && $$("input[type=year]").length>0)
  {
    erfcmsIncludeOnce('datepicker','/erfmodules/erfcms4/js/plugins/datepicker/datepicker.js', function() {
      new Picker.Date($$('input[type=year]'), {
        pickOnly: 'years',
        useFadeInOut: false,
        blockKeydown: false,
        format: '%Y'
      });
    }, '/erfmodules/erfcms4/css/plugins/datepicker/datepicker.css' );
  }

  if (!erfcmsMobile && !Modernizr.input['list'] && $$("input[list]").length>0)
  {
    erfcmsIncludeOnce('autocomplete','/erfmodules/erfcms4/js/plugins/meio.autocomplete/Meio.Autocomplete.js', function() {
      $$("input[list]").each( function(input) {
        var dl=new Array();
        $(input.get('list')).getElements('option').each( function(option) {
          dl.push(option.get('value'));
        } );
        new Meio.Autocomplete(input,dl,
        {
          'minChars': 0
        } );
      } );
    } );
  }

  // Printing

  $$("[data-erfcms-type=print]").each( function(el) {
    erfcmsPrint(el);
  } );
  }
  else
  {
    domnotready=true;
  }
}

function erfcmsLoad()
{
  if (domnotready) erfcmsDomready();
  $$('[data-erfcms-type=lazy]').each( function(el) {
    var html="";
    Array.from(el.childNodes).each( function(c) {
      html+=c.nodeValue.trim();
    } )
    el.set('html',html);
  } );

  $$("[data-erfcms-type]").each(function(el) {
    switch (el.get('data-erfcms-type'))
    {
      case 'map': erfcmsIncludeOnce('map','/erfmodules/erfcms4/js/plugins/map.js?v=2', function() { erfcmsIncludeOnce('mapapi','http://maps.google.com/maps/api/js?sensor=false&callback=erfcmsMap', function() { } ); } ); break;
      case 'gmap': erfcmsIncludeOnce('gmap','/erfmodules/erfcms4/js/plugins/gmap.js', function() { erfcmsIncludeOnce('mapapi','http://maps.google.com/maps/api/js?sensor=false&callback=erfcmsMap', function() { } ); } ); break;
      case 'mooflow': erfcmsIncludeOnce('mooflow','/erfmodules/erfcms4/js/plugins/mooflow.js', function() { new MooFlow(el,JSON.decode(el.get('data-erfcms'))); } ); break;
      case 'slideshow': erfcmsIncludeOnce('slideshow','/erfmodules/erfcms4/js/plugins/slideshow.js', function() { erfcmsSlideshow(el); } ); break;
    }
  } );

  // AWStats 

  erfcmsIncludeOnce('awstats','/erfmodules/erfcms4/js/plugins/awstats.js', function() { erfcmsAWStats(); });
}

function erfcmsInit()
{
  ['article','abbr','aside','details','figcaption','figure','footer','header','hgroup','menu','nav','section','datalist'].each(function(el) { new Element(el); } );

  var mlink=$(document.documentElement).getElement("link[rel=alternate][media=handheld]");
  if (mlink && screen.width<=699) // Mobiler Browser, Mobilseite existiert
  {
    var refhost=document.referrer.split('/')[2];
    var myhost=window.location.href.split('/')[2];
    var mobilehost=mlink.href.split('/')[2];
    if (refhost!=myhost && refhost!=mobilehost && !window.location.href.match(/erfcms_mobile=no/)) // Besucher kommt neu auf die Seite (Bookmark oder Fremdseite)
    {
      window.location=mlink.href;
      return;
    }
  }

  HtmlTable = Class.refactor(HtmlTable, {
    options: {
      classEven:  'table-tr-even'
    },

    zebra: function(row, i){
      row[((i % 2) ? 'add' : 'remove')+'Class'](this.options.classEven);
      row[((i % 2) ? 'remove' : 'add')+'Class'](this.options.classZebra);
    }
  });

  if (!erfcmsMobile)
  {
    window.alert=function(msg,options) {
      if (options && options.type) options.icon='/erfmodules/erfcms4/css/plugins/message-class/images/'+options.type+'Medium.png';
      options=Object.merge({ title:'', centered:true, icon:'/erfmodules/erfcms4/css/plugins/message-class/images/cautionMedium.png', message:msg },options);
      erfcmsIncludeOnce('message','/erfmodules/erfcms4/js/plugins/message-class/message.js',function() {
        new Message(options).say();
      } );
    }
  }

  window.addEvents( { 'domready':erfcmsDomready, 'load': erfcmsLoad } );
}

Locale.define('de-CH', 'Number', {

    decimal: '.',
    group: '\'',

    currency: {
        prefix: 'Fr. '
    }

});

Locale.define('en-GB', 'Number', {

    decimal: '.',
    group: ',',

    currency: {
        prefix: '£ '
    }

});

Locale.define('en-IE').inherit('en-GB', 'Date');

Locale.define('en-IE', 'Number', {

    decimal: '.',
    group: ',',

    currency: {
        prefix: '€ '
    }

});

erfcmsInit();
Locale.define('de-DE', 'erfcmsForm', {
    required: 'Bitte f\u00FCllen Sie dieses Feld aus',
    required_email: 'Bitte geben Sie eine E-Mail-Adresse ein',
    required_url: 'Bitte geben Sie eine URL ein',
    required_file: 'Bitte w\u00E4hlen Sie eine Datei',
    required_checkbox: 'Bitte klicken Sie dieses K\u00E4stchen an',
    required_select: 'Bitte w\u00E4hlen Sie einen Eintrag'
});

Locale.define('en-US', 'erfcmsForm', {
    required: 'Please fill out this field',
    required_email: 'Please enter an email address',
    required_url: 'Please enter a URL',
    required_file: 'Please select a file',
    required_checkbox: 'Please check this box',
    required_select: 'Please select an item'
});

Locale.inherit('de-CH', 'de-DE', 'erfcmsForm');

function erfcmsWebform(form)
{
  Asset.image('/erfmodules/erfcms4/css/img/loading.gif');
  form.addEvent('submit',erfcmsWebformvalidate);
}

function erfcmsWebformvalidate(e)
{
  var r;

  if (!Array.from(this.elements).some(function(el)
  {
    var error='';

    if (el.getAttribute('required')!=null && !el.disabled) {
      if (el.type=='checkbox' && !el.checked) error=Locale.get('erfcmsForm.required_checkbox');
      else if (el.type=='radio' && !el.checked) error=Locale.get('erfcmsForm.required');
      else if (el.type=='select-one' && el.value.trim()=='') error=Locale.get('erfcmsForm.required_select');
      else if (el.type=='file' && el.value.trim()=='') error=Locale.get('erfcmsForm.required_file');
      else if (el.value.trim()=='') error=Locale.get('erfcmsForm.required');
    }

    if (el.getAttribute('type')=='email' && el.value.trim()!='' && !el.value.match(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i)) error=Locale.get('erfcmsForm.required_email');
    if (el.getAttribute('type')=='url' && el.value.trim()!='' && !el.value.match(/^http\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?$/i)) error=Locale.get('erfcmsForm.required_url');

    if (error!='')
    {
      $(el).highlight();
      el.focus();
      e.stop();
      alert (error,{type:'error'});
      return true;
    }
    return false;
  }))
  {
    var form=this;
    var formData = new FormData(this);
    var xhr = new XMLHttpRequest();
    xhr.open(this.method, this.action, true);

    xhr.onload=function(e) {
      document.open("text/html","replace");
      document.write(xhr.responseText);
      document.close();
    }

    xhr.upload.onprogress = function(e) {
      if (e.lengthComputable) {
        form.set('text',(e.loaded / e.total) * 100);
      }
    };
    xhr.send(formData);
    e.stop();
    // this.spin();
  }
}

