/* -------------------------------------
// 
// EventListenerUtil.js ver.0.0.1 2009/03/17
// 
// Copyright (c) 2009 mukairiku
// All rights reserved.
// http://www.mukairiku.net/
// 
// -----------------------------------*/


// 追加したイベントの記録用配列
var memorizedFunction = new Array();
memorizedFunction.length=0;

// エレメント（オブジェクト）にイベントを追加します。
function AppendListener(element, event, obj, method){
  if(typeof(event) == 'string'){
    event = event.toLowerCase();
  }else{
    return false;
  }
  
  var func;
  if(typeof(obj) == 'function'){
    func = obj;
    
  }else if(typeof(obj) == 'object' && typeof(method) == 'string'){
    func = obj[method];
    
  }else if(typeof(method) == 'function'){
    func = method;
    
  }else{
    return false;
  }
  
  var listener = function(){ return func.apply(element, arguments); };
  
  var res = undefined;
  if(element.addEventListener){
    if(event.match(/^on(.+)$/i)){
      event = RegExp.$1;
    }
    res = element.addEventListener(event, listener, false);
    
  }else if(element.attachEvent) {
    if(!event.match(/^on/i)){
      event = 'on'+event;
    }
    res = element.attachEvent(event, listener);
    
  }else{
    return false;
  }
  
  memorizedFunction[memorizedFunction.length]=[element, event, func, listener];
  if(res == undefined){
    res = true;
  }
  return res;
}


// エレメント（オブジェクト）からイベントを削除します。
function RemoveListener(element, event, obj, method){
  if(typeof(event) == 'string'){
    event = event.toLowerCase();
  }else{
    return false;
  }
  
  var func;
  if(typeof(obj) == 'function'){
    func = obj;
    
  }else if(typeof(obj) == 'object' && typeof(method) == 'string'){
    func = obj[method];
    
  }else if(typeof(method) == 'function'){
    func = method;
    
  }else{
    return false;
  }
  
  var res = undefined;
  if(element.removeEventListener){
    if(event.match(/^on(.+)$/i)){
      event = RegExp.$1;
    }
    
    var listener = RememberFunction(element, event, func);
    if(typeof(listener) != 'function'){
      return false;
    }
    
    res = element.removeEventListener(event, listener, false);
    
  }else if(element.detachEvent){
    if(!event.match(/^on/i)){
      event = 'on'+event;
    }
    
    var listener = RememberFunction(element, event, func);
    if(typeof(listener) != 'function'){
      return false;
    }
    
    res = element.detachEvent(event, listener);
    
  }else{
    return false;
  }
  
  if(res == undefined){
    res = true;
  }
  return res;
}

// 実際に追加された関数を検索します。
function RememberFunction(element, event, func){
  for(var i=0; i<memorizedFunction.length; i++){
    if( memorizedFunction[i][0]==element && memorizedFunction[i][1]==event && memorizedFunction[i][2]==func ){
      return memorizedFunction[i][3];
    }
  }
  return false;
}

