/*
  Requires scriptaculous 1.8.x and prototype 1.6.x
*/

TopazApp = {
  applicationuri: '',
  watchedforms: [],
  _callbacks: [],
  translations: {},
  
  colors: {
    bg: '#ffffff',
    success: '#00cc33',
    notice: '#008000',
    warning: '#ff9900',
    error: '#cc3300',
    
    unsaved: '#ffff99',
    readonly: '#eeeeee'
  },
  
  _init: function() {
    this.extendObject();
    this.registerAjaxResponder();
    this.registerFormFieldClear();
    this.registerFormChangeVisualizer();
    if (Object.isFunction(this.init)) {
      this.init();
    }
    this._runCallbacks();
    
    this._initTabs();
    
    this._runCallbacks(true);

    $('container').show();
    
    this.loaded = true;
  },
  
  _initTabs: function() {
    var tabContainer = $('pageTabNav');
    
    $$('fieldset.pageTab').each(function(n) {
      var legend = n.down('legend');
      if (legend) {
        if (!tabContainer) {
          $('content').insert({top: '<div id="pageTabNav"></div>'});
          tabContainer = $('pageTabNav');
        }
      
        var divid = n.identify() + '_triggerDiv';
        var tab = new Element('div', {'id': divid, 'class': 'pageTab clicklink'});
        $('pageTabNav').insert(tab.update(legend.innerHTML));
        tab.observe('click', TopazApp.showTab);
        tab.observe('tpz:click', TopazApp.showTab);
        legend.remove();
        n.hide();
      }
    });
    if (tabContainer) {
      var cookie = TopazApp.getCookie('activeTab--' + encodeURIComponent(location.href));

      if (cookie && $(cookie)) {
        $(cookie).fire('tpz:click');
      } else {
        tabContainer.down('.pageTab').fire('tpz:click');
      }
    }
  },

  showTab: function(evt) {
    var tab = evt.element();
    $$('fieldset.pageTab').invoke('hide');
    $$('#pageTabNav .pageTab').invoke('removeClassName', 'activeTab');
    $(tab.addClassName('activeTab').identify().replace(/_triggerDiv/, '')).show();
    $('pageTabNav').fire('tpz:tabNavChanged');
    var d = new Date();
    d.setDate(d.getDate() + 1);
    TopazApp.setCookie('activeTab--' + encodeURIComponent(location.href), tab.identify(), d);
  },
  
  t: function(s) {
    return this.translations[s] ? this.translations[s] : s;
  },
  
  extendObject: function() {
    if (!Object.isFunction(Object.isObject)) {
      Object.extend(Object, {
        isObject: function(o) {return o && (typeof(o)=="object")}
      });
    }
  },
  
  registerAjaxResponder: function() {
    if ($('ajaxLoad')) {
      Ajax.Responders.register({
        onCreate: function() {
          Element.show('ajaxLoad');
        },
        onComplete: function() {
          if (Ajax.activeRequestCount < 1) {
            Element.hide('ajaxLoad');
          }
        }
      });
    }
  },
  
  registerFormChangeVisualizer: function() {
    var listener = TopazApp.markRow.bindAsEventListener(TopazApp);
    this.watchedforms.each(function(f) {
      Form.getElements(f).each(function(i) {
        i.observe('change', listener);
      });
    });
  },
  
  registerFormFieldClear: function() {
    $$('input.clear').invoke('observe', 'focus', this.formFieldClear).invoke('observe', 'blur', this.formFieldReset);
  },
  
  formFieldClear: function(evt) {
    var n = evt.element();
    if (n && n.value == n.defaultValue) {
      n.value = '';
    }
  },
  
  formFieldReset: function(evt) {
    var n = evt.element();
    if (n && n.value == '') {
      n.value = n.defaultValue;
    }
  },
  
  setCookie: function(name, value, expire, path) {
    value = value ? value.replace(/;/g, '') : value;
    if (expire) {
      expire = expire.toGMTString ? expire.toGMTString() : expire;
    } else {
      expire = new Date();
      expire.setFullYear(expire.getFullYear() + 1);
      expire = expire.toGMTString();
    }
    path = path ? path : '/';
    document.cookie = name + "=" + value + "; expires=" + expire + "; path=" + path;
  },

  getCookie: function(name) {
    var parts = document.cookie.split(';');
    var c = parts.find(function(p) {
      return p.strip().startsWith(name + '=');
    });
    if (c) {
      return c.sub(name + '=', '', 1).strip();
    }
  },

  removeCookie: function(name) {
    var d = new Date();
    d.setYear(1970);
    TopazApp.setCookie(name, '', d);
  },
  
  addCalendar: function(element) {
    var e = $(element);
    e = Object.isElement(e) ? e : $$('input[name=' + element + ']')[0];
    
    var f = function(cal) {
      var input = $(cal.params.inputField);
      var hidden = input ? input.previous('input') : null;
      if (hidden) {
        hidden.value = cal.date.print('%U');
      }
    }

    var options = Object.extend({
      ifFormat   : "%d.%m.%Y %H:%M",
      showsTime  : true,
      timeFormat : "24",
      onUpdate   : Prototype.K
    }, arguments[1] || { });

    options.onUpdate = options.onUpdate.wrap(
      function(proceed, cal) {
        proceed(cal);
        f(cal);
      }
    );
    options.inputField = e.identify();
    Calendar.setup(options);
  },
  
  addFCKeditor: function(textareaId) {
    if ($(textareaId)) {
      var editor = new FCKeditor( textareaId ) ;
      editor.BasePath = this.applicationuri + "js/fckeditor/";
      editor.Config["CustomConfigurationsPath"] = this.applicationuri + "js/topazfckconfig.js";
      editor.ToolbarSet = 'tpzToolbar' ;
      editor.Config.LinkBrowserURL = this.applicationuri + 'fckhtml/sitemap';
      editor.ReplaceTextarea();
    }
  },
  
  markRow: function(evt, color) {
    var e = Object.isElement(evt) ? evt : evt.element();
    e = e.up('.formRow').down('label');
    if (e) {
      color = color ? color : this.colors.unsaved;
      e.setStyle({backgroundColor: color});
    }
  },

  _runCallbacks: function(delayed) {
    this._callbacks = this._callbacks.reject(function(c) {
      if (delayed || !c[2]) {
        try {
          if (Object.isFunction(c[0])) {
            c[0](c[1], c[2]);
          } else if (Object.isObject(c[0]) && Object.isFunction(c[0].init)) {
            c[0].init(c[1], c[2]);
          }
        } catch(e) {}
        return true;
      }
      return false;
    })
  },
  
  /**
   * Führt callback aus, wenn TopazApp geladen wird (idR also onDomLoaded, evtl aber auch onload).
   * Ist TopazApp bereits geladen, dann wird callback sofort ausgeführt
   * Ist callback ein Objekt, so wird versucht darauf die init-Methode aufzurufen
   * BEISPIEL:
   * foo = {init: function() {alert('foo')}}
   * TopazApp.onload(foo)
   **/
  onload: function(callback, params, delay) {
    var cb = [callback, params, delay];
    if (this.loaded) {
      this._callbacks = [cb];
      this._runCallbacks(true);
    } else {
      this._callbacks.push(cb);
    }
  },
  
  assertMandatory: function(tag) {
    var t = TopazApp;
    if (!tag || tag.stop) {
      r = t.assertMandatory('select').concat(
        t.assertMandatory('input')).concat(
          t.assertMandatory('textarea'));
      if (tag && r.size() > 0) {
        tag.stop();
        MessageArea.error(TopazApp.t('Please fill out all mandatory fields.'), true);
      }
      return r;
    }

    var ret = [];
    $$('.mandatoryFormField ' + tag).each(function(n) {
      if (n.getAttribute('type') != 'checkbox') {
        var r = $F(n);
        if (Object.isArray(r)) {
          r = r.compact().size() > 0
        }
        if (r) {
          n.removeClassName('missingValue');
        } else {
          n.addClassName('missingValue');
          ret.push(n);
        }
      }
    });
    return ret;
  }
  
};

document.observe('dom:loaded',  TopazApp._init.bindAsEventListener(TopazApp));