Blame view

bitrix/templates/primary/lightbox/js/builder.js 4.63 KB
60c6f0893   root   init
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
  // script.aculo.us builder.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010
  
  // Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
  //
  // script.aculo.us is freely distributable under the terms of an MIT-style license.
  // For details, see the script.aculo.us web site: http://script.aculo.us/
  
  var Builder = {
    NODEMAP: {
      AREA: 'map',
      CAPTION: 'table',
      COL: 'table',
      COLGROUP: 'table',
      LEGEND: 'fieldset',
      OPTGROUP: 'select',
      OPTION: 'select',
      PARAM: 'object',
      TBODY: 'table',
      TD: 'table',
      TFOOT: 'table',
      TH: 'table',
      THEAD: 'table',
      TR: 'table'
    },
    // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
    //       due to a Firefox bug
    node: function(elementName) {
      elementName = elementName.toUpperCase();
  
      // try innerHTML approach
      var parentTag = this.NODEMAP[elementName] || 'div';
      var parentElement = document.createElement(parentTag);
      try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
        parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
      } catch(e) {}
      var element = parentElement.firstChild || null;
  
      // see if browser added wrapping tags
      if(element && (element.tagName.toUpperCase() != elementName))
        element = element.getElementsByTagName(elementName)[0];
  
      // fallback to createElement approach
      if(!element) element = document.createElement(elementName);
  
      // abort if nothing could be created
      if(!element) return;
  
      // attributes (or text)
      if(arguments[1])
        if(this._isStringOrNumber(arguments[1]) ||
          (arguments[1] instanceof Array) ||
          arguments[1].tagName) {
            this._children(element, arguments[1]);
          } else {
            var attrs = this._attributes(arguments[1]);
            if(attrs.length) {
              try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
                parentElement.innerHTML = "<" +elementName + " " +
                  attrs + "></" + elementName + ">";
              } catch(e) {}
              element = parentElement.firstChild || null;
              // workaround firefox 1.0.X bug
              if(!element) {
                element = document.createElement(elementName);
                for(attr in arguments[1])
                  element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
              }
              if(element.tagName.toUpperCase() != elementName)
                element = parentElement.getElementsByTagName(elementName)[0];
            }
          }
  
      // text, or array of children
      if(arguments[2])
        this._children(element, arguments[2]);
  
       return $(element);
    },
    _text: function(text) {
       return document.createTextNode(text);
    },
  
    ATTR_MAP: {
      'className': 'class',
      'htmlFor': 'for'
    },
  
    _attributes: function(attributes) {
      var attrs = [];
      for(attribute in attributes)
        attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
            '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
      return attrs.join(" ");
    },
    _children: function(element, children) {
      if(children.tagName) {
        element.appendChild(children);
        return;
      }
      if(typeof children=='object') { // array can hold nodes and text
        children.flatten().each( function(e) {
          if(typeof e=='object')
            element.appendChild(e);
          else
            if(Builder._isStringOrNumber(e))
              element.appendChild(Builder._text(e));
        });
      } else
        if(Builder._isStringOrNumber(children))
          element.appendChild(Builder._text(children));
    },
    _isStringOrNumber: function(param) {
      return(typeof param=='string' || typeof param=='number');
    },
    build: function(html) {
      var element = this.node('div');
      $(element).update(html.strip());
      return element.down();
    },
    dump: function(scope) {
      if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
  
      var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
        "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
        "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
        "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
        "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
        "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
  
      tags.each( function(tag){
        scope[tag] = function() {
          return Builder.node.apply(Builder, [tag].concat($A(arguments)));
        };
      });
    }
  };