/** * INVISION POWER BOARD v3 * * Topics View Javascript File * @author Matt Mecham, Brandon Farber, Josh Williams * @since 2008 */ /** * "ACP" Class. Designed for ... ACP User Agents Functions * @author (v.1.0.0) Matt Mecham */ function IPBUAgents() { /** * Template groups * * @var array */ this.uAgentsData = {}; /** * Group Data */ this.uAgentsGroupData = {}; /** * Agents by key */ this.agentsByKey = {}; /** * uagents Names * * @var hash */ this.cssNames = { 'uagentsRow' : 'uAgentsRow', 'uagentsHover' : 'uAgentsHover', 'uagentsGRow' : 'uAgentsGRow', 'uagentsGHover' : 'uAgentsGHover', 'uagentsGRRow' : 'uAgentsGRRow', 'uagentsGRHover' : 'uAgentsGRHover' }; /** * INIT User Agents List */ this.init = function() { /* Build uagents list */ this.buildUAgentsList(); }; /** * INIT User Agent Form */ this.groupFormInit = function() { /* Figure out which are already in the list */ /* Set up key based array */ Object.keys( this.uAgentsData['uagents'] ).each( function( i ) { IPB3UAgents.agentsByKey[ IPB3UAgents.uAgentsData['uagents'][i]['uagent_key'] ] = IPB3UAgents.uAgentsData['uagents'][i]; } ); /* Soft delete the ones in the group already */ Object.keys( this.uAgentsGroupData ).each( function( i ) { IPB3UAgents.uAgentsData['uagents'][ IPB3UAgents.agentsByKey[ IPB3UAgents.uAgentsGroupData[i]['uagent_key'] ]['uagent_id'] ]['_used'] = 1; } ); /* Build uagents list */ this.buildGroupAgentList(); /* Build uagents list that are already in the group */ this.buildGroupAgentsUsedList(); }; /** * Save uagents */ this.saveuAgent = function( uagent_id ) { /* Grab the JSON for the template bits for the current template group */ url = ipb.vars['base_url'] + "app=core&module=ajax&section=uagents&do=saveuAgent&&uagent_id=" + uagent_id + '&secure_key=' + ipb.vars['md5_hash']; /* Set up params */ var params = { 'uagent_key' : $F('tplate_keyBox_' + uagent_id ), 'uagent_name' : $F('tplate_titleBox_' + uagent_id ), 'uagent_regex' : $F('tplate_regexBox_' + uagent_id ), 'uagent_regex_capture' : $F('tplate_captureBox_' + uagent_id ), 'uagent_type' : $F('tplate_typeBox_' + uagent_id ), 'uagent_position' : $F('tplate_positionBox_' + uagent_id ), 'type' : ( uagent_id == 0 ) ? 'add' : 'edit' }; new Ajax.Request( url.replace( /&/g, '&' ), { method: 'POST', parameters: params, onSuccess: function (t ) { if ( t.responseText.match( /^(\s+?)?\{/ ) ) { eval( "var json = " + t.responseText ); if ( json['error'] ) { alert( json['error'] ); return; } else { IPB3UAgents.uAgentsData = json; IPB3UAgents.buildUAgentsList(); ipb.global.showInlineNotification( ipb.lang['useragent_saved'], { showClose: true } ); if ( json['errors'] ) { /* Something inline would be very nice here.. rather than this ugly alert */ alert("Error:: " + json['errors'] ); } else { alert("Error:: Saved!"); } } } else { alert( ipb.lang['oops'] + t.responseText ); } }, onException: function( f,e ){ alert( ipb.lang['oops'] + e ); }, onFailure: function( t ){ alert( ipb.lang['oops'] + t.responseText ); } } ); }; /** * Revert css */ this.removeuAgent = function( uagent_id ) { /* Make sure we're mean it... */ if ( ! confirm( ipb.lang['removeuseragent'] ) ) { return false; } /* Grab the JSON for the template bits for the current template group */ url = ipb.vars['base_url'] + "app=core&module=ajax&section=uagents&do=removeuAgent&uagent_id=" + uagent_id + '&secure_key=' + ipb.vars['md5_hash']; new Ajax.Request( url.replace( /&/g, '&' ), { method: 'GET', onSuccess: function (t ) { if ( t.responseText.match( /^(\s+?)?\{/ ) ) { eval( "var json = " + t.responseText ); if ( json['error'] ) { alert( json['error'] ); return; } else { IPB3UAgents.uAgentsData = json; IPB3UAgents.buildUAgentsList(); if ( json['errors'] ) { /* Something inline would be very nice here.. rather than this ugly alert */ alert("Error:: " + json['errors'] ); } } } else { alert( ipb.lang['oops'] + t.responseText ); } }, onException: function( f,e ){ alert( ipb.lang['oops'] + e ); }, onFailure: function( t ){ alert( ipb.lang['oops'] + t.responseText ); } } ); }; /** * Add uagents form */ this.adduAgentForm = function() { IPB3UAgents.showuAgentsEditor( 0 ); }; /** * Shows the template editor */ this.showuAgentsEditor = function( uagent_id ) { /* Close any open editors */ IPB3UAgents.canceluAgents(); var _tplate = new Template( $('tplate_uagentsEditor').innerHTML ); var _keys = Object.keys( IPB3UAgents.uAgentsData['uagents'] ); var _data = {}; /* Get replacement Data */ if ( uagent_id ) { _keys.each( function( i ) { if ( IPB3UAgents.uAgentsData['uagents'][ i ]['uagent_id'] == uagent_id ) { _data = IPB3UAgents.uAgentsData['uagents'][ i ]; } } ); } else { _data = { 'uagent_id' : 0 }; } var _div = new Element('div', { id: 'tplate_editorWrapper' } ); //_div.id = 'tplate_editorWrapper'; _div.update( _tplate.evaluate( _data ) ); document.body.appendChild( _div ); /* Adjust title */ if ( ! uagent_id ) { $('tplate_title_' + uagent_id ).update( ipb.lang['adduagenttitle'] ); } /* Select box type */ _box = $('tplate_typeBox_' + _data['uagent_id'] ); for( i = 0 ; i < _box.options.length ; i++ ) { if ( _box.options[i].value == _data['uagent_type'] ) { _box.selectedIndex = i; } } ipb.positionCenter( 'tplate_editor_' + uagent_id ); }; /** * Close the editor */ this.canceluAgents = function() { /*if ( ! confirm( "All unsaved changes will be lost!" ) ) { return false; }*/ try { $('tplate_editorWrapper').remove(); } catch(e) { } }; /** * Build a list of uagents groups (files) */ this.buildUAgentsList = function() { /* INIT */ var _output = ''; var _tplate = new Template( $('tplate_uagentsRow').innerHTML ); var json = IPB3UAgents.uAgentsData; var _groups = Object.keys( json['uagents'] ); /* Clear out any current listing */ $('tplate_uagentList').update(''); /* Format... */ _groups.each( function( i ) { json['uagents'][i]['_cssClass'] = IPB3UAgents.cssNames['uagentsRow']; json['uagents'][i]['uagent_name'] = json['uagents'][i]['uagent_name'].replace("%20", " "); _output += _tplate.evaluate( json['uagents'][i] ); } ); /* Write it out */ $('tplate_uagentList').update( _output ); /* Post process */ _groups.each( function( i ) { /* Image. Can't use #{...} inline as it parses as HTML entities. Most annoying */ $('tplate_img_' + json['uagents'][i]['uagent_id'] ).src += 'type_' + json['uagents'][i]['uagent_type'] + '.png'; } ); }; /** * Template Mouse Event */ this.mouseEvent = function( e ) { if ( _div = $( Event.element( e ) ).up( '.' + IPB3UAgents.cssNames['uagentsRow'] ) ) { var _uagent_id = _div.id.replace( 'tplate_uagentsRow_', '' ); if ( e.type == 'mouseover' ) { _div.addClassName( IPB3UAgents.cssNames['uagentsHover'] ); } else if ( e.type == 'mouseout' ) { _div.removeClassName( IPB3UAgents.cssNames['uagentsHover'] ); } else if ( e.type == 'click' ) { var _el = Event.findElement( e, 'div' ).id; if ( _el.endsWith('_remove' ) ) { IPB3UAgents.removeuAgent( _uagent_id ); } else { IPB3UAgents.showuAgentsEditor( _uagent_id ); } } } }; /** * Build a list of USED uagents */ this.buildGroupAgentsUsedList = function() { /* INIT */ var _output = ''; var _tplate = new Template( $('tplate_groupRow').innerHTML ); var json = IPB3UAgents.uAgentsGroupData; var _groups = Object.keys( json ); var _save = {}; /* Clear out any current listing */ $('tplate_groupList').update(''); /* Format... */ _groups.each( function( i ) { if ( ! IPB3UAgents.uAgentsGroupData[i]['_hide'] ) { _save[i] = IPB3UAgents.uAgentsGroupData[i]; json[i] = IPB3UAgents.uAgentsData['uagents'][ IPB3UAgents.agentsByKey[ IPB3UAgents.uAgentsGroupData[i]['uagent_key'] ]['uagent_id'] ]; json[i]['uagent_versions'] = _save[i]['uagent_versions']; json[i]['_cssClass'] = IPB3UAgents.cssNames['uagentsGRRow']; _output += _tplate.evaluate( json[i] ); } } ); /* Write it out */ $('tplate_groupList').update( _output ); /* Post process */ _groups.each( function( i ) { if ( ! IPB3UAgents.uAgentsGroupData[i]['_hide'] ) { /* Image. Can't use #{...} inline as it parses as HTML entities. Most annoying */ $('tplate_groupimg_' + json[i]['uagent_id'] ).src += 'type_' + json[i]['uagent_type'] + '.png'; /* Can we configure a version? */ var _data = IPB3UAgents.uAgentsData['uagents'][ IPB3UAgents.agentsByKey[ IPB3UAgents.uAgentsGroupData[i]['uagent_key'] ]['uagent_id'] ]; if ( _data['uagent_regex_capture'] > 0 ) { $('tplate_grouprow_' + _data['uagent_id'] + '_configure').show(); } } } ); /* Update hidden field */ $('uAgentsData').value = Object.toJSON( _save ); }; /** * Save user agent form */ this.saveGroupForm = function() { $('uAgentsForm').submit(); }; /** * Template Mouse Event */ this.groupUsedMouseEvent = function( e ) { if ( _div = $( Event.element( e ) ).up( '.' + IPB3UAgents.cssNames['uagentsGRRow'] ) ) { var _uagent_id = _div.id.replace( 'tplate_grouprow_', '' ); if ( e.type == 'mouseover' ) { _div.addClassName( IPB3UAgents.cssNames['uagentsGRHover'] ); } else if ( e.type == 'mouseout' ) { _div.removeClassName( IPB3UAgents.cssNames['uagentsGRHover'] ); } else if ( e.type == 'click' ) { var _el = Event.findElement( e, 'div' ).id; if ( _el.endsWith('_remove' ) ) { IPB3UAgents.groupRemoveFromList( _uagent_id ); } else if ( _el.endsWith( '_configure' ) ) { IPB3UAgents.showConfigureEditor( _uagent_id ); } } } }; /** * Close the editor */ this.cancelAgentVersion = function() { /*if ( ! confirm( "All unsaved changes will be lost!" ) ) { return false; }*/ try { $('tplate_versionsWrapper').remove(); } catch(e) { } }; /** * Shows the versions editor */ this.showConfigureEditor = function( uagent_id ) { /* Close any open editors */ IPB3UAgents.cancelAgentVersion(); var _tplate = new Template( $('tplate_versionsEditor').innerHTML ); var _keys = Object.keys( IPB3UAgents.uAgentsData['uagents'] ); var _data = {}; _keys.each( function( i ) { if ( IPB3UAgents.uAgentsData['uagents'][ i ]['uagent_id'] == uagent_id ) { _data = IPB3UAgents.uAgentsData['uagents'][ i ]; _data['uagent_versions'] = IPB3UAgents.uAgentsGroupData[ IPB3UAgents.uAgentsData['uagents'][ i ]['uagent_key'] ]['uagent_versions']; } } ); var _div = new Element('div', { id: 'tplate_versionsWrapper' } ); _div.update( _tplate.evaluate( _data ) ); document.body.appendChild( _div ); ipb.positionCenter( 'tplate_versions_' + uagent_id ); }; /** * Save agent version info */ this.saveAgentVersion = function( uagent_id ) { /* Update array */ IPB3UAgents.uAgentsGroupData[ IPB3UAgents.uAgentsData['uagents'][ uagent_id ]['uagent_key'] ]['uagent_versions'] = $F( 'tplate_versionsBox_' + uagent_id ); /* Update display */ IPB3UAgents.buildGroupAgentsUsedList(); /* Close any open editors */ IPB3UAgents.cancelAgentVersion(); }; /** * Add user agent to the list */ this.groupRemoveFromList = function( uagent_id ) { /* Soft delete */ IPB3UAgents.uAgentsData['uagents'][ uagent_id ]['_used'] = 0; /* Add to add to group array */ IPB3UAgents.uAgentsGroupData[ IPB3UAgents.uAgentsData['uagents'][ uagent_id ]['uagent_key'] ]['_hide'] = 1; /* Build uagents list */ IPB3UAgents.buildGroupAgentList(); /* Build uagents list that are already in the group */ IPB3UAgents.buildGroupAgentsUsedList(); }; /** * Add user agent to the list */ this.groupAddToList = function( uagent_id ) { /* Soft delete */ IPB3UAgents.uAgentsData['uagents'][ uagent_id ]['_used'] = 1; /* Add to add to group array */ IPB3UAgents.uAgentsGroupData[ IPB3UAgents.uAgentsData['uagents'][ uagent_id ]['uagent_key'] ] = IPB3UAgents.uAgentsData['uagents'][ uagent_id ]; IPB3UAgents.uAgentsGroupData[ IPB3UAgents.uAgentsData['uagents'][ uagent_id ]['uagent_key'] ]['_hide'] = 0; /* Build uagents list */ IPB3UAgents.buildGroupAgentList(); /* Build uagents list that are already in the group */ IPB3UAgents.buildGroupAgentsUsedList(); }; /** * Template Mouse Event */ this.groupMouseEvent = function( e ) { if ( _div = $( Event.element( e ) ).up( '.' + IPB3UAgents.cssNames['uagentsGRow'] ) ) { var _uagent_id = _div.id.replace( 'tplate_agentrow_', '' ); if ( e.type == 'mouseover' ) { _div.addClassName( IPB3UAgents.cssNames['uagentsGHover'] ); } else if ( e.type == 'mouseout' ) { _div.removeClassName( IPB3UAgents.cssNames['uagentsGHover'] ); } else if ( e.type == 'click' ) { IPB3UAgents.groupAddToList( _uagent_id ); } } }; /** * Build a list of uagents */ this.buildGroupAgentList = function() { /* INIT */ var _output = ''; var _tplate = new Template( $('tplate_agentRow').innerHTML ); var json = IPB3UAgents.uAgentsData; var _groups = Object.keys( json['uagents'] ); /* Clear out any current listing */ $('tplate_agentsList').update(''); /* Format... */ _groups.each( function( i ) { if ( ! json['uagents'][i]['_used'] ) { json['uagents'][i]['_cssClass'] = IPB3UAgents.cssNames['uagentsGRow']; _output += _tplate.evaluate( json['uagents'][i] ); } } ); /* Write it out */ $('tplate_agentsList').update( _output ); /* Post process */ _groups.each( function( i ) { if ( ! json['uagents'][i]['_used'] ) { /* Image. Can't use #{...} inline as it parses as HTML entities. Most annoying */ $('tplate_agentimg_' + json['uagents'][i]['uagent_id'] ).src += 'type_' + json['uagents'][i]['uagent_type'] + '.png'; } } ); }; }