// Dieses JS ist abhängig von prototype und scriptaculous

/* Eingebunden werden kann es etwa so:
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript" src="js/scriptaculous/builder.js"></script>
<script type="text/javascript" src="js/scriptaculous/effects.js"></script>
<script type="text/javascript" src="js/form.js"></script>
*/

// Hilfsfunktionen


function trimLower(string) {
  if (string)
    return string.replace(/^\s+|\s+$/g,"").toLowerCase();
  return '';
}

function getOuterHTML(object) {
  if (!object) return null;  
  var element = document.createElement("div");
  var elementCopy = object.cloneNode(true); 
  $(elementCopy).hide();
  element.appendChild(elementCopy);
  return element.innerHTML;
}

/* Funktionen zum Setzen/Loeschen von Defaultwerten in einem Form 
Beispiel:
<input name="Standortbezeichnung" value="Standortbezeichnung" type="text" onfocus="clearDefault(this,'Standortbezeichnung');" onblur="setDefault(this,'Standortbezeichnung');"></td>
*/

function clearDefault(element,defVal) {
  if (element.value == defVal)
    element.value = '';
}

function setDefault(element,defVal) {
  if (element.value == '')
    element.value = defVal;
}


/* Funktion zum setzen von Select Options auf ein Array mit value/display Werten.
Beispiel:
<select id="hello"> </select>
<script type="text/javaScript"> 
setSelectOptions('hello',new Array( {value: 'a', display:'hello a'},{value: 'b', display:'hello b'}))); 
</script>
*/

function setSelectOptions(element,options) {
  var el = $(element); 
  var opts = $A(options); 
  el.options.length = 0;
  opts.each(function (opt,index){ el.options[index] = new Option(opt.display,opt.key); });
}




/* Funktion zum Setzen des aktuell ausgewählten Elements in einer <Select> box
Beispiel:
<select id="hello"> <option value="a">wert a</option> <option value="b">wert b</option></select>
<a href="#" onclick="setSelectValue('hello','b'); return false;">set b</a>
*/

function setSelectValue(element,value){
  if (!value)
  {
    el.selectedIndex = 0;
    return;
  }
  var el = $(element); 
  var val= trimLower(value);
  
  if (el.value == value)
    return;
  
  $A(el.options).each(
    function (opt,index){ 
      if (trimLower(opt.value) == val)
        el.selectedIndex=index;
    });
}



/* Funktion, zum vervielfältigen von HTML Elementen.
Dabei wird der HTML Source des Elements nach Vorkommen von nameReplacement 
durchsucht und der Wert von countElement angehängt.
Dann wird der Wert von countElement eins hoch gezählt.
Beispiel:
<form>
<input type="hidden" name="count" value="1">
<div id="toDuplicate_index_0">
<input type="text" name="a_index_0" value="xyz">
</div>
</form>
<a href="#" onclick="duplicateFormElements('toDuplicate_index_0','_index_0','count');">duplicate</a>
*/
function duplicateElement(toDuplicate,nameReplacement,countElement,insertBefore){
  var countEl = $(countElement);
  var duplicateEl = $(toDuplicate);
  var count = $(countEl);
  
  var re = new RegExp(nameReplacement,"g");
  
  var newName = nameReplacement+count.value;  
  count.value = parseInt(count.value) + 1;
  var newId = duplicateEl.id.replace(re,newName);
  new Insertion.Before($(insertBefore), getOuterHTML(duplicateEl).replace(re,newName));
  new Effect.BlindDown(newId);
  initlabels();
}

function dynamicLabel(editId, cssClass){
  var textarea=$(editId);
  var textColor = cssClass;
  
  var descriptionText=textarea.getAttribute('title')||textarea.value||'';
  
  
  var span=$(editId+'_textChange');
  if (!span){
    textarea.up().insert({top:unescape('%3Cspan class="'+textColor+' textChange" id="'+editId+'_textChange" %3E'+descriptionText.escapeHTML()+'%3C\/span%3E')});
    span=$(editId+'_textChange');
  }
  
  if (textarea.value==descriptionText)
    textarea.value='';
  
  function change(ev){
    var value;
    if (ev && ev.value)
      value=ev.value;
    else
      value=textarea.value;
    if (value=='')
      span.show();
    else
      span.hide();            
  }
  
  function focus(){
    span.addClassName('grey-txt');
    span.removeClassName(textColor);
    textarea.up().up().removeClassName('blue-txt');
    
  }
  function blur(){
    span.addClassName(textColor);
    span.removeClassName('grey-txt');
    
  }
  textarea.observe('click',change);
  textarea.observe('change',change);
  textarea.observe('paste',function(){change({value:'asds'});});
  textarea.observe('keyup',change);
  textarea.observe('blur',blur);
  textarea.observe('focus',focus);
  change();
}

function initlabels(cssClass){
  var tColor;
  if(cssClass) tColor=cssClass;
  else tColor="blue-txt";
  $$('.dynamicLabel').each(function(el){dynamicLabel(el.identify(), tColor)});
}
                           
                           
// ---------- Validation Box

var ValidationPopup = Class.create({
  initialize:function(element, options) {  
    this.element = $(element);
    this.element.setAttribute("autocomplete", "off");
    
    var defaultOptions = {
      url:'',
      fieldValParameter:'c',
      fieldNameParameter:'n',
      defVal:'',
      defParameter:'d',
      max:'0',
      maxParameter:'max',
      min:'0',
      minParameter:'min',
      regex:'',
      regexParameter:'r',
      refElName:'',
      refElParameter:'ref',
      delay:0.5,
      popUpId:'validationPopup',
      onShow:function(){},
      onHide:function(){},
      showEffect:function(el){
        $(el).show();
      },
      hideEffect:function(el){
        $(el).hide();
      }
    };
    
    this.options = Object.extend(defaultOptions, options || {});
    this.popupOpen = false;
    
    new Form.Element.DelayedObserver(this.element, this.options.delay, this.onFieldTextChanged.bindAsEventListener(this));
    //Event.observe(this.element, 'blur', this.onFieldTextChanged.bindAsEventListener(this));
  },
  onWindowKeyDown:function(ev){
    if (!this.popupOpen)
      return;
    switch (ev.keyCode) {
        case Event.KEY_ESC:
        this.hidePopup();
        Event.stop(ev);
        break;
    }
  },
  onFieldTextChanged:function(){
    var params={};
    if (!this.options.refElName.empty()) {
      params[this.options.refElParameter]=$(this.options.refElName).value;
    }
    params[this.options.fieldValParameter]=this.element.value;
    params[this.options.fieldNameParameter]=this.element.name;
    params[this.options.defParameter]=this.options.defVal;
    params[this.options.maxParameter]=this.options.max;
    params[this.options.minParameter]=this.options.min;
    params[this.options.regexParameter]=this.options.regex;
    
    new Ajax.Updater(this.options.popUpId, this.options.url, {
      parameters: params,
      evalScripts:true,
      onSuccess:this.showPopup.bindAsEventListener(this)
    });
    
  },
  showPopup:function(){
      if (!this.popupOpen){
      this.options.showEffect(this.options.popUpId);
    }
    this.popupOpen = true;
    this.options.onShow();
  },
  hidePopup:function(){
    if (this.popupOpen){
      this.options.hideEffect(this.options.popUpId);
    }
    this.popupOpen = false;
    this.options.onHide();    
    this.element.value='';
  }
});
