//WARNING - 自動リサイズ対応へのカスタム済み

/**
 * formのタイトル要素へ記載された文字列をメモノートを設定するjsライブラリ
 * @charlie
 * use prototype.js
 * 
 * example)
Event.observe(window, 'load', function() {
  var s =  new formDefault(
    'updnWatermark','e'
  );
});
///==========================
<input type="text" id="f_address" class="updnWatermark" title="mail address" />
↓↓↓↓↓↓↓
<label for="f_address" class="e" style="position:absolute; left:5px; top:35px">mail address</label>
<input type="text" id="f_address" class="updnWatermark" title="mail address" />

 * 
 */

/**
 * formDefault class コンストラクタ
 * @param {string} className
 * @param {string} labelClassName
 * className 対象タグのクラス名
 * labelClassName ラベルへ付与するクラス
 */
 

function formDefault(className,labelClassName){
  this.targetObjects = [];
  this.targetElementClass = className;
  this.labelClassName = labelClassName;
  this.brName = this.getBrName();
  this.targetObjects = this.getElement();
  this.execute();
  this.obj = this.resizeAction.bindAsEventListener(this)
  
  Event.observe(window, 'resize', this.obj);
  var elements = this.targetObjects;
  for(var i=0; i<elements.length; i++){
    Event.observe(elements[i], 'focus',this.obj);
    Event.observe(elements[i], 'keydown', this.obj);
    Event.observe(elements[i], 'keyup', this.obj);
    Event.observe(elements[i], 'click', this.obj);
  }
}
formDefault.prototype.resizeAction = function(e){
  for(var i=0; i<this.targetObjects.length; i++){
    var element = Element.extend(this.targetObjects[i]);
    var label_id = element.id + "__label";
    var label = $(label_id);
    this.setPosition(element, label);
  }
}
formDefault.prototype.execute = function(){
  var elements = this.targetObjects;
  for(var i=0; i<elements.length; i++){
    this.oneElementAction(elements[i])
  }
}
formDefault.prototype.oneElementAction = function(e){
  if ($(e.id + "__label")) {
    Element.remove($(e.id + "__label"));
  }
  var element = Element.extend(e);
  var d = Element.getDimensions(e);
  var label = document.createElement("label");
  label.innerHTML = element.title;
  label.title = e.id;
  label.id = e.id + "__label";
  label.style.position = "absolute";
  label.className = this.labelClassName;
  label.style.width = d.width + "px";
  label.style.height = d.height + "px";
  this.setPosition(element,label);
  

  //textarea以外は有効
  var t  = e.tagName;
  if(t.match(/^INPUT$/i)){
    label.style.lineHeight = d.height + "px";
  }
  label.style.overflow = "hidden";
  if(e.value != ""){
    label.style.display = "none";
  }
  label.onclick = function(){
    $(label.title).focus();
  }
  Insertion.Before(e,label);
  e.onfocus = function(){
    var e_id = this.id + "__label";
    document.getElementById(e_id).style.display = "none";
  }
  e.onblur = function(){
    if(this.value == ""){
      var e_id = this.id + "__label";
      document.getElementById(e_id).style.display = "inline";
    }
  }
}

formDefault.prototype.setPosition = function(e , label){
  //コメント解除で一部ブラウザ高速化
  //var badBrowser=(/MSIE ((5\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32");
  //if (badBrowser) {
    var pos = e.cumulativeOffset();
  // else {
    //var pos = e.positionedOffset();
  //}
  if (label) {
   label.style.left = pos[0] + "px";
   label.style.top = pos[1] + "px";
  }
}

formDefault.prototype.getElement = function(){
  var ret = [];
  var e = document.getElementsByTagName("*");
  var ptn = new RegExp("(^|\\s)"+ this.targetElementClass +"(\\s|$)");
  for(var i=0; i<e.length; i++){
    if(e[i].className != ""){
      if(ptn.test(e[i].className)){
        if(e[i].title != "undefined" && e[i].title != ""){
          ret.push(e[i]);
        }
      }
    }
  }
  return ret;
}
formDefault.prototype.getBrName = function(){
  var strUA = "";
  strUA=navigator.userAgent.toLowerCase();
  if(strUA.indexOf("safari")!=-1){
    return "Safari";
  }else if(strUA.indexOf("firefox")!=-1){
    return "Firefox";
  }else if(strUA.indexOf("opera")!=-1){
    return "Opera";
  }else if(strUA.indexOf("netscape")!=-1){
    return "Netscape";
  }else if(strUA.indexOf("msie")!=-1){
    return "InternetExplorer";
  }else if(strUA.indexOf("mozilla/4")!=-1){
    return "InternetExplorer";
  }
}