  function _each(arr,callback,context){
	var iteration_error = false;
	for(var j=0;j<arr.length;j++){
		if(j in arr){
			callback.call(context||null,arr[j],j,arr);
		}else{
			iteration_error = true;
			break;
		}
	}
	iteration_error = iteration_error||j==0;
	if(iteration_error){
		callback.call(context||null,arr);
	}
	return arr;
  };
  

  function _map(arr,callback,context){
	var res = [];
	var iteration_error = false;
	for(var j=0;j<arr.length;j++){
		if(j in arr){
			res.push(callback.call(context||null,arr[j],j,arr));
		}else{
			iteration_error = true;
			break;
		}
	}
	iteration_error = iteration_error||j==0;
	if(iteration_error){
		res = callback.call(context||null,arr)
	}
	return res;
  }

  function _filter(arr,callback,context){
	var len = arr.length;
	if(typeof callback!="function")
		throw new TypeError();
	var res = [];
	for(var j=0; j<len;j++){
		if(j in arr){
			var val =arr[j];
			if(callback.call(context,val,j,arr))
				res.push(val);					
		}	
	}
	return res;
  }
  

  if(!('forEach' in Array.prototype)||(Array.prototype.forEach.length!=3)){
	Array.prototype.forEach = function(callback,context){
		_each(this,callback,context);
	}
  }
  
  if(!('map' in Array.prototype)||(Array.prototype.map.length!=3)){
	Array.prototype.map = function(callback,context){
		return _map(this,callback,context);
	}
  }
  
  if(!('filter' in Array.prototype)||(Array.prototype.filter.length!=3)){
	Array.prototype.filter = function(callback,context){
		return _filter(this,callback,context);
	}
  }

   plain_event = function(obj,event_name,func,apply_to,args){
	var event_name = 'on'+event_name;
	_each(obj,function(item){
		item[event_name] = function(e){return func.apply(apply_to||null,(args||[]).concat(e))};
	});
   }

  function has_class(cname,dom){
	return RegExp('(^|\\s)'.concat(cname,'(\\s|$)')).test(dom.className);
  }

  function add_class(cname,dom) {
	if(!has_class(cname,dom)) dom.className = dom.className.concat(' ',cname);
	return dom;
  }

  function del_class(cname,dom){
  	var re = RegExp('(^|\\s)'.concat(cname,'(\\s|$)'),'g');
	dom.className = dom.className.replace(re,' ');
	return dom;
  }
  
   function toggle_class(cname,dom){
	if(has_class(cname,dom))del_class(cname,dom)
	else add_class(cname,dom);
  }

