//Elementļ,
var Elements = new Native({

 initialize: function(elements, options){
  //ѡ,ṩĬֵ
  options = $extend({ddup: true, cash: true}, options);
  //ּ˫,Ĭֵŷʽ
  elements = elements || [];

  /*
  ƴд,Ĵ
  ddupӦǱʶǷظ
  cashӦǱʶǷElementչ
  */
  if (options.ddup || options.cash){
   var uniques = {}, returned = [];
   for (var i = 0, l = elements.length; i < l; i++){
    /*
    Elementչ
    $.elementĵڶβΪnocash,ȡ
    */
    var el = $.element(elements[i], !options.cash);
    //Ҫ󼯺ûظ
    if (options.ddup){
     //Elementuidж,uniques[el.uid]Ϊtrue˵Ѿ
     if (uniques[el.uid]) continue;
     uniques[el.uid] = true;
    }
    returned.push(el);
   }
   elements = returned;
  }
  //Ҫչ,Elements,򷵻elements(ȻҲпѾElements)
  return (options.cash) ? $extend(elements, this) : elements;
 }

});


Elements.implement({

 //ݱǩ˼е
 filter: function(filter, bind){
  if (!filter) return this;
  return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){
   return item.match(filter);
  } : filter, bind));
 }

});

/*
ǳ,ElementafterImplement,ʹElementķͬʱӦElements
element.addEvent('click', clickHandler)elements.addEvent('click' clickHandler);
*/
Elements.multi = function(property){
 //һհ,ҪΪӺִ
 return function(){
  var items = [];
  var elements = true;
  for (var i = 0, j = this.length; i < j; i++){
   //ִͬ,ͬĲ,ÿ߸оElementElementsĲ
   var returns = this[i][property].apply(this[i], arguments);
   items.push(returns);
   //ȷķзص
   if (elements) elements = ($type(returns) == 'element');
  }
  //,ԽչΪElements,ֻ
  return (elements) ? new Elements(items) : items;
 };
};


