Move busui to seperate repository
[bus.git] / jquery.jqote2.js
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
 * jQote2 - client-side Javascript templating engine
 * Copyright (C) 2010, aefxx
 * http://aefxx.com/
 *
 * Licensed under the DWTFYWT PUBLIC LICENSE v2
 * Copyright (C) 2004, Sam Hocevar
 *
 * Date: Sun, May 5th, 2010
 * Version: 0.9.2
 */
(function($) {
        var ARR = '[object Array]',
                FUNC = '[object Function]',
                STR = '[object String]';
 
    var n = 0,
                tag = '%',
            type_of = Object.prototype.toString;
 
    $.fn.extend({
                jqote: function(data, t) {
                        var data = type_of.call(data) === ARR ? data : [data],
                                dom = '';
 
                        this.each(function(i) {
                                var f = ( fn = $.jqotecache[this.jqote] ) ? fn : $.jqotec(this, t || tag);
 
                                for ( var j=0; j < data.length; j++ )
                                        dom += f.call(data[j], i, j, data, f);
                        });
 
                        return dom;
                },
 
                jqoteapp: function(elem, data, t) {
            var dom = $.jqote(elem, data, t);
 
                        return this.each(function() {
                                $(this).append(dom);
                        });
                },
 
                jqotepre: function(elem, data, t) {
            var dom = $.jqote(elem, data, t);
 
                        return this.each(function() {
                                $(this).prepend(dom);
                        });
                },
 
                jqotesub: function(elem, data, t) {
            var dom = $.jqote(elem, data, t);
 
                        return this.each(function() {
                                $(this).html(dom);
                        });
                }
        });
 
    $.extend({
        jqote: function(elem, data, t) {
            var dom = '', fn = [], t = t || tag, type = type_of.call(elem),
                data = type_of.call(data) === ARR ? data : [data];
 
            if ( type === FUNC )
                    fn = [elem];
 
            else if ( type === ARR )
                fn = type_of.call(elem[0]) === FUNC ?
                    elem : $.map(elem, function(e) { return $.jqotec(e, t); });
 
            else if ( type === STR )
                fn.push( elem.indexOf('<' + t) < 0 ?
                    $.jqotec($(elem), t) : $.jqotec(elem, t));
 
            else fn = $.map($(elem), function(e) { return $.jqotec(e, t); });
 
            for ( var i=0,l=fn.length; i < l; i++ )
                for ( var j=0; j < data.length; j++ )
                    dom += fn[i].call(data[j], i, j, data, fn[i]);
 
            return dom;
        },
 
        jqotec: function(elem, t) {
            var fn, str = '', t = t || tag,
                type = type_of.call(elem),
                tmpl = ( type === STR && elem.indexOf('<' + t) >= 0 ) ?
                            elem : ( elem = ( type === STR  || elem instanceof jQuery ) ?
                                $(elem)[0] : elem ).innerHTML;
 
            var arr = tmpl.replace(/\s*<!\[CDATA\[\s*|\s*\]\]>\s*|[\r\n\t]/g, '')
                        .split('<'+t).join(t+'>\x1b')
                            .split(t+'>');
 
            for ( var i=0,l=arr.length; i < l; i++ )
                str += arr[i].charAt(0) !== '\x1b' ?
                    "out+='" + arr[i].replace(/([^\\])?(["'])/g, '$1\\$2') + "'" : (arr[i].charAt(1) === '=' ?
                        '+' + arr[i].substr(2) + ';' : ';' + arr[i].substr(1));
 
            fn = new Function('i, j, data, fn', 'var out="";' + str + '; return out;');
 
            return type_of.call(elem) === STR ?
                fn : $.jqotecache[elem.jqote = elem.jqote || n++] = fn;
        },
 
        jqotefn: function(elem) {
            return $.jqotecache[$(elem)[0].jqote] || false;
        },
 
        jqotetag: function(str) {
            tag = str;
        },
 
        jqotecache: []
    });
})(jQuery);