1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Selectors.Cache = {

    getParam: function(items, separator, context, tag, id, classNames, attributes, pseudos){
        var tmp = '';
        if (separator){
            tmp += 'found = []; j = elements.length;';
            switch (separator){
                case ' ':
                    tmp += 'for (i = 0; i < j; i++) found.extend(elements[i].getElementsByTagName("'+tag+'"));';
                    break;
                case '>':
                    tmp += 'for (i = 0; i < j; i++){'
                        +'var children = elements[i].childNodes;'
                        +'for (var k = 0, l = children.length; k < l; k++){'
                        +'  if (Selectors.Filter.hasTag(children[k], "'+tag+'")) found.push(children[k]);'
                        +'}'
                    +'}';
                    break;
                default:
                    throw new Exception('not jet implemented');
                    tmp += '';
                    var all = (separator == '~');
                    for (i = 0; i < j; i++){
                        var next = items[i].nextSibling;
                        while (next){
                            if (Selectors.Filter.hasTag(next, tag)){
                                found.push(next);
                                if (!all) break;
                            }
                            next = next.nextSibling;
                        }
                    }
            }
            tmp += (id) ? 'elements = Elements.filterById(found, id, true);' : 'elements = found;';
        } else {
            if (id){
                console.log(tag);
                tmp += 'var el = context.getElementById("'+id+'");';
                tmp += 'if (!el || (("'+tag+'" != "*") && (el.tagName.toLowerCase() != "'+tag+'"))) return false;';
                tmp += 'elements = [el];';
            } else {
                tmp += 'elements = $A(context.getElementsByTagName("'+tag+'"));';
            }
        }
        for (i = classNames.length; i--; i) tmp += 'elements = Elements.filterByClass(elements, "'+classNames[i]+'", true);';
        for (i = attributes.length; i--; i){
            var bits = attributes[i];
            tmp += 'elements = Elements.filterByAttribute(elements, "'+bits[0]+'", "'+bits[1]+'","'+bits[2]+'", true);';
        }
//      for (i = pseudos.length; i--; i){
//          var pseudo = pseudos[i];
//          if (pseudo.parser && pseudo.parser.filter){
//              var temp = {}, xparser = pseudo.parser, argument = pseudo.argument;
//              items = items.filter(function(el, i, array){
//                  return xparser.filter(el, argument, i, array, temp);
//              });
//              temp = null;
//          } else {
//              items = Elements.filterByAttribute(items, pseudo.name, ($chk(pseudo.argument)) ? '=' : false, pseudo.argument, true);
//          }
//      }
        items.push(tmp);
        return items;
    },

    getItems: function(items, context, nocash){
        console.log('getItems');
        var fn = new Function('context', 'var elements=[],found,i,j;' + items.join('') + 'return elements;');
        console.log(fn.toSource());
        var elements = fn(context);
        return (nocash) ? elements : new Elements(elements);
    },

    hasTag: function(el, tag){
        return (el.nodeName && el.nodeType == 1 && (tag == '*' || el.tagName.toLowerCase() == tag));
    }

};

Selectors.Method = Selectors.Cache;