var seoPro = function(config) { config = config || {}; seoPro.superclass.constructor.call(this, config); }; Ext.extend(seoPro, Ext.Component, { page: {}, window: {}, grid: {}, tree: {}, panel: {}, combo: {}, config: {}, view: {}, initialize: function() { seoPro.config.loaded = true; seoPro.config.delimiter = MODx.isEmpty(MODx.config['seopro.delimiter']) ? '|' : MODx.config['seopro.delimiter']; seoPro.config.siteNameShow = !MODx.isEmpty(MODx.config['seopro.usesitename']); seoPro.config.searchEngine = MODx.isEmpty(MODx.config['seopro.searchengine']) ? 'google' : MODx.config['seopro.searchengine']; seoPro.config.titleFormat = MODx.isEmpty(MODx.config['seopro.title_format']) ? '' : MODx.config['seopro.title_format']; seoPro.addKeywords(); seoPro.addPanel(); Ext.each(seoPro.config.fields.split(','), function(field) { seoPro.addCounter(field); if (field !== 'alias' && field !== 'menutitle') { seoPro.changePrevBox(field); } }); Ext.getCmp('modx-panel-resource').on('success', function() { if(Ext.get('seopro-replace-alias')) { Ext.get('seopro-replace-alias').dom.innerHTML = this.record.alias; } }); }, addCounter: function(field) { var Field = Ext.getCmp('modx-resource-' + field); /* if (!Field && field === 'description') { field = 'introtext'; Field = Ext.getCmp('modx-resource-' + field); seoPro.config.chars[field] = "155"; }*/ if (Field) { seoPro.config.values[field] = Field.getValue(); Field.maxLength = Number(seoPro.config.chars[field]); Field.reset(); Field.on('keyup', function() { seoPro.config.values[field] = Field.getValue(); seoPro.count(field); seoPro.changePrevBox(field); }); Field.on('blur', function() { seoPro.config.values[field] = Field.getValue(); seoPro.changePrevBox(field); }); Ext.get('x-form-el-modx-resource-' + field).createChild({ tag: 'div', id: 'seopro-resource-' + field, class: 'seopro-counter', html: '' + _('seopro.keywords') + ':  0\ ' + _('seopro.characters') + ': 1/' + seoPro.config.chars[field] + '' }); seoPro.count(field); } }, addKeywords: function() { var fp = Ext.getCmp('modx-resource-main-left'); var field = new Ext.form.TextField({ xtype: 'textfield', name: 'keywords', id: 'seopro-keywords', fieldLabel: _('seopro.focuskeywords'), description: '[[+seoPro.keywords]]', value: seoPro.config.record, enableKeyEvents: true, anchor: '100%', listeners: { 'keyup': function() { MODx.fireResourceFormChange(); Ext.each(seoPro.config.fields.split(','), function(field) { var Field = Ext.getCmp('modx-resource-' + field); if (Field) { seoPro.count(field); } }); } } }); var fieldDesc = new Ext.form.Label({ forId: 'pagetitle', text: _('seopro.focuskeywords_desc'), cls: 'desc-under' }); fp.add(field); fp.add(fieldDesc); fp.doLayout(); }, addPanel: function() { var fp = Ext.getCmp('modx-resource-main-left'); fp.add({ xtype: 'panel', anchor: '100%', border: false, fieldLabel: (seoPro.config.searchEngine == 'yandex' ? _('seopro.prevbox_yandex') : _('seopro.prevbox')), layout: 'form', items: [{ columnWidth: .67, xtype: 'panel', baseCls: 'seopro-panel', cls: seoPro.config.searchEngine, bodyStyle: 'padding: 10px;', border: false, autoHeight: true, items: [{ xtype: 'box', id: 'seopro-google-title', style: 'background-color: #fbfbfb; background-image: url(https://www.google.com/s2/favicons?domain='+MODx.config.site_url+');', cls: seoPro.config.searchEngine, html: '', border: false }, { xtype: 'box', id: 'seopro-google-url', bodyStyle: 'background-color: #fbfbfb;', cls: seoPro.config.searchEngine, html: seoPro.config.url, border: false }, { xtype: 'box', id: 'seopro-google-description', bodyStyle: 'background-color: #fbfbfb;', cls: seoPro.config.searchEngine, html: '', border: false }] }] }); fp.doLayout(); }, count: function(field, overrideCount) { var Value = Ext.get('modx-resource-' + field).getValue(); var maxchars = Ext.get('seopro-counter-chars-' + field + '-allowed').dom.innerHTML; var charCount; if (overrideCount) { charCount = overrideCount; } else { charCount = Value.length; // console.log(Ext.get('seopro-google-title').length); // console.log(Ext.get('seopro-google-title').dom.innerHTML); if (seoPro.config.siteNameShow && (field === 'pagetitle' || field === 'longtitle')) { var extra = ' ' + seoPro.config.delimiter + ' ' + MODx.config.site_name; charCount = charCount + extra.length; } } var keywordCount = 0; Ext.each(Ext.get('seopro-keywords').getValue().split(','), function(keyword) { keyword = keyword.replace(/^\s+/, '').toLowerCase(); if (keyword) { var counter = Value.toLowerCase().match(new RegExp("(^|[ \s\n\r\t\.,'\(\"\+;!?:\-])" + keyword + "($|[ \s\n\r\t.,'\)\"\+!?:;\-])", 'gim')); // var counter = Value.toLowerCase().match(new RegExp('\\b' + keyword + '\\b', 'g')); if (counter) { keywordCount = keywordCount + counter.length; } } }); Ext.get('seopro-counter-chars-' + field + '-current').dom.innerHTML = charCount; Ext.get('seopro-counter-keywords-' + field + '-current').dom.innerHTML = keywordCount; var maxKeywords = MODx.isEmpty(MODx.config['seopro.max_keywords_title']) ? '4' : MODx.config['seopro.max_keywords_title']; if (field === 'description') { // use different limit for the description maxKeywords = MODx.isEmpty(MODx.config['seopro.max_keywords_description']) ? '8' : MODx.config['seopro.max_keywords_description']; } maxKeywords = parseInt(maxKeywords); if (keywordCount > 0 && keywordCount <= maxKeywords) { Ext.get('seopro-counter-keywords-' + field).removeClass('red').addClass('green'); } else { Ext.get('seopro-counter-keywords-' + field).removeClass('green').addClass('red'); } if (charCount > maxchars || charCount === 0) { Ext.get('seopro-counter-chars-' + field).removeClass('green').addClass('red'); } else { Ext.get('seopro-counter-chars-' + field).removeClass('red').addClass('green'); } }, changePrevBox: function(field) { switch (field) { case 'pagetitle': case 'longtitle': var title; var resourceId = MODx.request.id; var pagetitle = Ext.get('modx-resource-pagetitle').getValue(); var longtitle = Ext.get('modx-resource-longtitle').getValue(); if (seoPro.config.titleFormat && resourceId) { MODx.Ajax.request({ url: seoPro.config.connectorUrl ,params: { action: 'mgr/resource/parse', id: resourceId, pagetitle: pagetitle, longtitle: longtitle, html: seoPro.config.titleFormat, } ,listeners: { 'success':{fn:function(r) { title = r.results.output; Ext.get('seopro-google-title').dom.innerHTML = title; var count = title.length; seoPro.count(field, count); },scope:this} } }); } else { title = seoPro.config.values['pagetitle']; if (!MODx.isEmpty(seoPro.config.values['longtitle'])) { title = seoPro.config.values['longtitle']; } if (seoPro.config.siteNameShow) { title += ' ' + seoPro.config.delimiter + ' ' + MODx.config.site_name; } Ext.get('seopro-google-title').dom.innerHTML = title; } break; case 'description': case 'introtext': var description; if (MODx.isEmpty(seoPro.config.values['description'])) { var introCheck = Ext.getCmp('modx-resource-description'); if (!MODx.isEmpty(seoPro.config.values['introtext']) && !introCheck) { description = seoPro.config.values['introtext']; } else { description = _('seopro.emptymetadescription'); } } else { description = seoPro.config.values['description']; } Ext.get('seopro-google-description').dom.innerHTML = description; break; case 'alias': Ext.get('seopro-replace-alias').dom.innerHTML = seoPro.config.values['alias']; break; } } }); Ext.reg('seopro', seoPro); seoPro = new seoPro(); Ext.onReady(function() { if (!seoPro.config.loaded) { seoPro.initialize(); } });