1 if (!Array.prototype.forEach)
3 Array.prototype.forEach = function(fun /*, thisp*/)
6 if (typeof fun != "function")
9 var thisp = arguments[1];
10 for (var i = 0; i < len; i++)
13 fun.call(thisp, this[i], i, this);
18 Ext.define('Docs.SourceCodePanel', {
19 extend: 'Ext.panel.Panel',
25 activate: function(a,b,c) {
28 var url = req.baseDocURL + '/source/' + req.source,
29 idx = url.indexOf('#');
31 url = url.substr(0, idx);
36 url : url + '?plain=1',
38 success : function(response, opts) {
39 self.update('<pre class="prettyprint">' + response.responseText + '</pre>');
42 failure : function(response, opts) {
50 Ext.define('Docs.OverviewToolbar', {
51 extend: 'Ext.toolbar.Toolbar',
53 id: 'overview-toolbar',
59 initComponent: function() {
63 ['cfgs', 'Configs', 'configs', 'config'],
64 ['properties', 'Properties', 'properties', 'property'],
65 ['methods', 'Methods', 'methods', 'method'],
66 ['events', 'Events', 'events', 'event']
70 members.forEach(function(member) {
72 if (clsInfo[member[0]] && clsInfo[member[0]].length) {
75 for(var i=0; i< clsInfo[member[0]].length; i++) {
76 var memberName = clsInfo[member[0]][i];
77 menuItems.push({text: memberName, memberName: member[3] + '-' + memberName});
80 var butMenu = Ext.create('Ext.menu.Menu', {
84 click: function(menu, item) {
85 Ext.getCmp('doc-overview').scrollToEl("a[name=" + item.memberName + "]");
92 iconCls: 'icon-' + member[3],
94 text: member[1] + ' <span class="num">' + clsInfo[member[0]].length + '</span>',
97 Ext.getCmp('doc-overview').scrollToEl("a[name=" + member[2] + "]");
105 if (clsInfo.subclasses.length) {
107 for(var i=0; i< clsInfo.subclasses.length; i++) {
108 menuItems.push({text: clsInfo.subclasses[i], clsName: clsInfo.subclasses[i]});
111 var butMenu = Ext.create('Ext.menu.Menu', {
115 click: function(menu, item) {
116 getDocClass(item.clsName);
124 iconCls: 'icon-subclass',
125 text: 'Sub Classes <span class="num">' + clsInfo.subclasses.length + '</span>',
130 self.items = self.items.concat([
133 boxLabel: 'Hide inherited',
134 boxLabelAlign: 'before',
138 handler: function(el) {
139 Ext.query('.member.inherited').forEach(function(m) {
141 Ext.get(m).setStyle({display: 'none'});
143 Ext.get(m).setStyle({display: 'block'});
147 Ext.query('.member.f').forEach(function(m) {
148 Ext.get(m).removeCls('f');
151 ['cfgs', 'properties', 'methods', 'events'].forEach(function(m) {
152 // If the number of inherited members is the same as the total number of members...
153 if (Ext.query('.m-'+m+' .member').length == Ext.query('.m-'+m+' .member.inherited').length) {
154 var first = Ext.query('.m-'+m)[0];
157 Ext.get(Ext.query('.m-'+m)[0]).setStyle({display: 'none'});
159 Ext.get(Ext.query('.m-'+m)[0]).setStyle({display: 'block'});
163 var t = el.checked ? 'ni' : 'member';
164 var firstMemberEl = Ext.query('.m-'+m+' .member.' + t);
165 if (firstMemberEl.length > 0) {
166 Ext.get(firstMemberEl[0]).addCls('f');
173 iconCls: 'expandAllMembers',
174 handler: function() {
175 Ext.query('.member').forEach(function(el) {
176 Ext.get(el).addCls('open');
182 iconCls: 'collapseAllMembers',
183 handler: function() {
184 Ext.query('.member').forEach(function(el) {
185 Ext.get(el).removeCls('open');
191 this.callParent(arguments);
195 Ext.define('Docs.OverviewPanel', {
196 extend: 'Ext.panel.Panel',
199 cls: 'doc-tab iScroll',
203 scrollToEl: function(query) {
204 var el = Ext.get(Ext.query(query)[0]);
206 var scrollOffset = el.getY() - 150;
207 var docContent = Ext.get(Ext.query('#doc-overview .x-panel-body')[0]);
208 var currentScroll = docContent.getScroll()['top'];
209 docContent.scrollTo('top', currentScroll + scrollOffset, true);
211 var prnt = el.up('.member');
213 Ext.get(prnt).addCls('open');
219 afterrender: function(cmp) {
220 cmp.el.addListener('click', function(cmp, el) {
221 Ext.get(Ext.get(el).up('.member')).toggleCls('open');
223 preventDefault: true,
226 cmp.el.addListener('click', function(cmp, el) {
229 preventDefault: true,
230 delegate: '.docClass'
236 initComponent: function() {
238 Ext.create('Docs.OverviewToolbar')
241 if (Ext.get('doc-overview-content')) {
242 this.contentEl = 'doc-overview-content';
245 this.callParent(arguments);
250 Ext.define('Docs.classPanel', {
251 extend: 'Ext.tab.Panel',
254 renderTo: 'docContent',
256 style: 'border-color: #bfbfbf;',
259 // Remember tab scroll position on Webkit
261 beforetabchange: function(tabPanel, newCard, oldCard) {
262 oldCard.prevScroll = oldCard.body.getScroll()['top'];
264 tabchange: function(tabPanel, newCard, oldCard) {
265 if (newCard.prevScroll) {
266 newCard.body.scrollTo('top', newCard.prevScroll);
269 afterrender: function() {
274 initComponent: function() {
276 this.height = Ext.get('docContent').getHeight() - 55;
277 this.items = [ Ext.create('Docs.OverviewPanel') ];
279 if (!req.standAloneMode) {
280 this.items.push(Ext.create('Docs.SourceCodePanel'));
283 this.callParent(arguments);
288 var getDocClass = function(cls, noHistory) {
291 hashIdx = cls.indexOf('#');
294 member = cls.substr(hashIdx + 1);
295 cls = cls.substr(0, hashIdx);
298 if (req.standAloneMode) {
299 if (window.location.href.match(/api/)) {
300 window.location = cls + '.html';
301 } else if (window.location.href.match(/guide/)){
302 window.location = '../api/' + cls + '.html';
304 window.location = 'api/' + cls + '.html';
309 var fullUrl = req.baseDocURL + "/api/" + cls;
310 if (!noHistory && window.history && window.history.pushState) {
311 window.history.pushState({
317 var docTabPanel = Ext.getCmp('docTabPanel');
319 Ext.getCmp('docTabPanel').setActiveTab(0);
322 if(classCache[cls]) {
323 showClass(classCache[cls], member);
326 Ext.getCmp('doc-overview').setLoading(true);
329 Ext.data.JsonP.request({
330 callbackKey: 'docsCallback',
331 url : req.baseDocURL + '/api/' + cls + '/ajax',
333 success : function(response, opts) {
334 classCache[response.cls] = response;
335 showClass(response, member);
337 failure : function(response, opts) {
344 var showClass = function(resp, anchor) {
346 var docTabPanel = Ext.getCmp('docTabPanel');
348 clsInfo = resp.clsInfo;
349 req.docClass = resp.cls;
350 req.source = resp.source;
353 Ext.get('docContent').update('');
354 Ext.create('Docs.classPanel');
357 Ext.get('docTabPanel').show();
358 var pageContent = Ext.get('pageContent');
360 pageContent.setVisibilityMode(Ext.core.Element.DISPLAY).hide();
363 var docOverviewTab = Ext.getCmp('doc-overview');
365 docOverviewTab.update(resp.content);
366 docOverviewTab.removeDocked(Ext.getCmp('overview-toolbar'), true);
367 docOverviewTab.addDocked(Ext.create('Docs.OverviewToolbar'));
368 docOverviewTab.setLoading(false);
372 var historyItems = Ext.getCmp('historyItems');
375 var item = classPackagesStore.getById(resp.cls);
380 if (item.data.value.clsType) {
381 menuItem.iconCls = 'icon-'+item.data.value.clsType;
384 historyItems.insert(0, menuItem);
388 Ext.get('top-block').update(resp.title);
390 Ext.getCmp('doc-overview').scrollToEl("a[name=" + anchor + "]");
392 var docContent = Ext.get(Ext.query('#doc-overview .x-panel-body')[0]);
393 docContent.scrollTo('top', 0);
397 var showContent = function(title, html) {
398 Ext.getCmp('docTabPanel').hide();
399 Ext.get('pageContent').setVisibilityMode(Ext.core.Element.DISPLAY).show().update(html);
404 * History manager for compliant browsers
406 if (window.history && window.history.pushState && !req.standAloneMode) {
408 // window.addEventListener('hashchange', function(e) {
409 // // console.log('Hash changed')
412 var ignoreInitialHistory = true;
414 window.addEventListener('popstate', function(e) {
417 if (ignoreInitialHistory) {
418 ignoreInitialHistory = false;
422 if (e.state && e.state.docClass) {
423 getDocClass(e.state.docClass, true);
431 // Ext.onReady(function() {
433 // Ext.define('Docs.tabBar', {
434 // extend: 'Ext.tab.Panel',
438 // renderTo: Ext.getBody(),
441 // tabPosition: 'bottom',
442 // // minTabWidth: 50,
445 // afterrender: function() {
446 // this.alignTo('top-block', 'tr', [-500, -10])
450 // initComponent: function() {
454 // for(var i=0; i< 15; i++) {
457 // title: 'test ' + i
462 // this.callParent(arguments);
466 // Ext.create('Docs.tabBar')