/** efw v.1.0 **/

(function(window, undefined) {
  // Framework Objekt erstellen
  window.efw = {window: window, document: window.document, undefined: undefined}
  
  // Sizzle als CSS Selektor
  efw.dom = function(selector, context) {
    if(context == undefined) context = document;

    var selectors = selector.split(/\s+/);
    var resultArray = [];
    var currentSelector = null;
    var parts = null;
    var search = null;
    var tag = null;
    
    // Create Array By Matches
    for(var i = 0, max = selectors.length; i < max; i++) {
      currentSelector = selectors[i];
      if(currentSelector.match(/\#/g)) {
        search = currentSelector.replace(/\#/g, '');
        resultArray.push({type: 'id', search: search, tag: null});
      }
      else if(currentSelector.match(/\./g)) {
        parts = currentSelector.split('.');
        search = parts[1];
        tag = parts[0] == "" ? "*" : parts[0];
        resultArray.push({type: 'class', search: search, tag: tag});
      }
      else {
        resultArray.push({type: 'tag', search: currentSelector, tag: null});
      }
    }
    
    // Function get Elements By ClassName
    var getByClassName = function(tag, className, context) {
      var elements = context.getElementsByTagName(tag);
      var result = [];
      for(var i = 0, max = elements.length; i < max; i++) {
        if(elements[i].className == className) {
          result.push(elements[i]);
        }
      }
      return result;
    }
    
    var element = null;
    var contextElements = null;
    for(i = 0, max = resultArray.length; i < max; i++) {
      var resultObj = resultArray[i];
      // Get Element By Id
      if(resultObj.type == 'id') {
        context = context.getElementById(resultObj.search);
      }
      // Get Elements By ClassName
      else if(resultObj.type == 'class') {
        if(context[0] == undefined) {
          context = getByClassName(resultObj.tag, resultObj.search, context);
        }
        else {
          contextElements = [];
          for(var n = 0, n_max = context.length; n < n_max; n++) {
            element = getByClassName(resultObj.tag, resultObj.search, context[n]);
            if(element[0] != undefined) {
              contextElements.push(element[0]);
            }
          }
          context = contextElements;
        }
      }
      // Get Elements By TagName
      else if(resultObj.type == 'tag') {
        if(context[0] == undefined) {
          context = context.getElementsByTagName(resultObj.search);
        } 
        else {
          contextElements = [];
          for(var n = 0, n_max = context.length; n < n_max; n++) {
            element = context[n].getElementsByTagName(resultObj.search);
            if(element[0] != undefined) {
              contextElements.push(element[0]);
            }
          }
          context = contextElements;
        }
      }
    }
    return context;
  }
  
  // Foreach Funktion
  efw.foreach = function(obj, callback) {
    for(var k = 0; k < obj.length; k++) callback(k, obj[k]);
  }
  
  // Nächstes Objekt
  efw.nextObject = function(obj) {
    do obj = obj.nextSibling;
    while (obj && obj.nodeType != 1);
    return obj;
  }

  // Vorheriges Objekt
  efw.previousObject = function(obj) {
    do obj = obj.previousSibling;
    while (obj && obj.nodeType != 1);
    return obj;
  }

  // Event hinzufügen
  efw.addEvent = function(obj, type, fn) {
    if (obj.addEventListener) {
      obj.addEventListener(type, fn, false);
    } else if (obj.attachEvent) {
      obj["e"+type+fn] = fn;
      obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
      obj.attachEvent( "on"+type, obj[type+fn] );
    }
  }

  // Event entfernen
  efw.removeEvent = function(obj, type, fn) {
    if (obj.removeEventListener) {
      obj.removeEventListener(type, fn, false);
    } else if (obj.detachEvent) {
      obj.detachEvent( "on"+type, obj[type+fn] );
      obj[type+fn] = null;
      obj["e"+type+fn] = null;
    }
  }
})(window);
