{"action":"created","comment":{"url":"https://api.github.com/repos/modxcms/revolution/pulls/comments/34621226","id":34621226,"diff_hunk":"@@ -18,37 +18,651 @@ class modSearchProcessor extends modProcessor\n     public function process()\n     {\n         $this->query = $this->getProperty('query');\n+        \n         if (!empty($this->query)) {\n             if (strpos($this->query, ':') === 0) {\n-                // upcoming \"launch actions\"\n-                //$this->searchActions();\n+                // Advanced Search/Actions\n+                \n+                $query = explode(':',$this->query);\n+                $this->advancedSearch($query);\n+                \n             } else {\n-                // Search elements & resources\n-                $this->searchResources();\n-                if ($this->modx->hasPermission('view_chunk')) {\n-                    $this->searchChunks();\n+                // Default search only in resources\n+                $query = explode(':',$this->query);\n+                \n+                $query = ':r:*:'.$query[0] . ':'.$query[1];\n+                \n+                $query = explode(':',$query);\n+                $this->advancedSearch($query);\n+            }\n+        }\n+\n+        return $this->outputArray($this->results);\n+    }\n+\n+    public function advancedSearch($query){\n+        \n+        $this->modx->lexicon->load('core:topmenu','core:uberbar');\n+        \n+        $uberbar_mode = $this->modx->getOption('uberbar_mode');\n+        \n+        $elements = array();\n+        \n+        if(1==1){ // Sorry, I need the codefolding...\n+            /* Snippets */\n+            $elements['s'] = array (\n+                'label'        => '(s)nippet'\n+               ,'type'         => 'snippets'\n+               ,'class_key'    => 'modSnippet'\n+               ,'permission'   => $this->modx->hasPermission('view_snippet')\n+               ,'action'       => 'element/snippet/update'\n+               ,'fields'       =>  array (\n+                    'id','name','description','snippet'\n+                )\n+               ,'name'         => 'name'\n+               ,'description'  => 'description'\n+               ,'content'      => 'snippet'\n+               ,'icon'         => 'code'\n+            );\n+            /* Chunks */\n+            $elements['c'] = array (\n+                'label'        => '(c)hunk'\n+               ,'type'         => 'chunks'\n+               ,'class_key'    => 'modChunk'\n+               ,'permission'   => $this->modx->hasPermission('view_chunk')\n+               ,'action'       => 'element/chunk/update'\n+               ,'fields'       =>  array (\n+                    'id','name','description','snippet'\n+                )\n+               ,'name'         => 'name'\n+               ,'description'  => 'description'\n+               ,'content'      => 'snippet'\n+               ,'icon'         => 'th'\n+            );\n+            /* Templates */\n+            $elements['t'] = array (\n+                'label'        => '(t)emplate'\n+               ,'type'         => 'templates'\n+               ,'class_key'    => 'modTemplate'\n+               ,'permission'   => $this->modx->hasPermission('view_template')\n+               ,'action'       => 'element/template/update'\n+               ,'fields'       =>  array (\n+                    'id','templatename','description','content'\n+                )\n+               ,'name'         => 'templatename'\n+               ,'description'  => 'description'\n+               ,'content'      => 'content'\n+               ,'icon'         => 'columns'\n+            );\n+            /* Plugins */\n+            $elements['p'] = array (\n+                'label'        => '(p)lugin'\n+               ,'type'         => 'plugins'\n+               ,'class_key'    => 'modPlugin'\n+               ,'permission'   => $this->modx->hasPermission('view_plugin')\n+               ,'action'       => 'element/plugin/update'\n+               ,'fields'       =>  array (\n+                    'id','name','description','plugincode'\n+                )\n+               ,'name'         => 'name'\n+               ,'description'  => 'description'\n+               ,'content'      => 'plugincode'\n+               ,'icon'         => 'cogs'\n+            );\n+            /* Template variables */\n+            $elements['tv'] = array(\n+                'label'        => '(tv) templateVariable'\n+               ,'type'         => 'tvs'\n+               ,'class_key'    => 'modTemplateVar'\n+               ,'permission'   => $this->modx->hasPermission('view_tv')\n+               ,'action'       => 'element/tv/update'\n+               ,'fields'       =>  array (\n+                    'name','id','caption','description'\n+                )\n+               ,'name'         => 'name'\n+               ,'description'  => 'description'\n+               ,'content'      =>  false\n+               ,'icon'         => 'list-alt'\n+            );\n+            /* resources */\n+            $elements['r'] = array(\n+                'label'        => '(r)esource'\n+               ,'type'         => 'resources'\n+               ,'class_key'    => 'modResource'\n+               ,'permission'   => $this->modx->hasPermission('view_document')\n+               ,'action'       => 'resource/update'\n+               ,'fields'       =>  array (\n+                     'id','pagetitle','longtitle','description','introtext','content'\n+                    ,'template','alias','menutitle','link_attributes'\n+                    ,'hidemenu','published','deleted'\n+                    ,'parent','class_key','content_type','content_dispo'\n+                )\n+               ,'name'         => 'pagetitle'\n+               ,'description'  => 'longtitle'\n+               ,'content'      => 'content'\n+               ,'icon'         => 'file-o'\n+            );\n+            /* user */\n+            $elements['u'] = array(\n+                'label'        => '(u)ser'\n+               ,'type'         => 'users'\n+               ,'class_key'    => 'modUser'\n+               ,'permission'   => $this->modx->hasPermission('view_user')\n+               ,'action'       => 'security/user/update'\n+               ,'fields'       =>  array (\n+                   'username','fullname','email','blocked'\n+                  ,'username','fullname','dob','gender','photo'\n+                  ,'email','phone','mobilephone','fax','website'\n+                  ,'blocked','blockeduntil','blockedafter'    ,'failedlogincount','logincount','lastlogin','thislogin','sessionid'\n+                  ,'address','country','city','state','zip'\n+                  ,'comment','extended'\n+                )\n+               ,'name'         => 'username'\n+               ,'description'  => 'email'\n+               ,'content'      => 'extended'\n+               ,'icon'         => 'user'\n+            );\n+            /*  system settings :x:ss:site_start: \n+                2do: Doesn't really make sense before we can open system settings for a specific key...\n+            $elements['ss'] = array(\n+                 'label'       => '(ss) systemSetting'\n+                ,'type'        => ''\n+                ,'class_key'   => 'modSystemSetting'\n+                ,'permission'  => $this->modx->hasPermission('settings')\n+                ,'action'      => 'system/settings'\n+                ,'fields'      => array('key')\n+                ,'name'        => 'key'\n+                ,'description' => 'value'\n+                ,'content'     => 'value'\n+                ,'icon'        => 'gear'\n+                \n+            );\n+            */\n+            \n+        }     \n+        \n+        \n+        \n+\n+    /* Basic UI: Messages and validation */\n+        $valid = false;\n+        $step1 = $step2 = $step3 = $step4 = $step5 = false;\n+    \n+        /* What are we looking for? */\n+        $start      = isset($query[0]) AND  empty($query) ? true : false;\n+        $element    = isset($query[1]) ? $query[1] : false;\n+        $field      = isset($query[2]) ? $query[2] : false;\n+        $value      = isset($query[3]) ? $query[3] : false;\n+        $page       = isset($query[4]) ? $query[4] : false;\n+        \n+        $count = count($query);\n+        $result['count'] = $count;\n+\n+        $btn = \"x-btn x-btn-small x-btn-icon-small-left primary-button x-btn-noicon\";\n+        \n+        function validate_Uberbar($elements,$query){\n+            \n+            global $modx;\n+            \n+            $uberbar_mode = $modx->getOption('uberbar_mode');\n+            \n+            $count = count($query);\n+\n+            $element    = isset($query[1]) ? $query[1] : false;\n+            $field      = isset($query[2]) ? $query[2] : false;\n+            $value      = isset($query[3]) ? $query[3] : false;\n+            $page       = isset($query[4]) ? $query[4] : false;\n+            \n+            // Element related stuff...\n+            if($count > 2)\n+            {\n+                /* Validate elements */\n+                if( $element != '*' && !array_key_exists($element,$elements) )\n+                {\n+                    // Error: Unknown element\n+                        $result['header'] = $modx->lexicon('uberbar_error_onknown_element_header');\n+                        \n+                    // You are searching for an unknown element: <strong>{element}</strong>;\n+                        $s = array('{element}');\n+                        $r = array($element);\n+                        $result['msg'] = str_replace( $s , $r, $modx->lexicon('uberbar_error_onknown_element_msg') );\n+                    \n+                    $result['options'] = '';\n+                    return $result;\n+                }                        \n+                /* Validate permissions */\n+                elseif( $elements[$element]['permission'] !== true)\n+                {\n+                    // Error: Permission denied\n+                        $result['header'] = $modx->lexicon('uberbar_error_permission_denied_header');\n+                    \n+                    // You are searching in an element you are not allowed to view: <strong>{element}</strong>.\n+                        $s = array('{element}');\n+                        $r = array($element);\n+                        $result['msg'] = str_replace($s , $r , $modx->lexicon('uberbar_error_permission_denied_msg') );\n+                        $result['options'] = '';\n+                        \n+                    return $result;\n                 }\n-                if ($this->modx->hasPermission('view_template')) {\n-                    $this->searchTemplates();\n+            }\n+\n+            if($count > 3)\n+            {\n+                // Validate fieldnames...\n+                if($uberbar_mode == 'simple')\n+                {\n+                    $fields = $elements[$element]['fields'];\n                 }\n-                if ($this->modx->hasPermission('view_tv')) {\n-                    $this->searchTVs();\n+                else\n+                {\n+                    $fields = array_keys( $modx->getFields($elements[$element]['class_key']));    \n                 }\n-                if ($this->modx->hasPermission('view_snippet')) {\n-                    $this->searchSnippets();\n+\n+                \n+                if($field != '*' AND in_array($field, $fields) !== true )\n+                {\n+                \n+                    // Error: Unknown field\n+                    $result['header'] = $modx->lexicon('uberbar_error_unknown_field_header');\n+                    \n+                    // You are searching inside an unknown field: <strong>{field}</strong>. Please remove it from your search and try something else.\n+                    $s = array('{field}');\n+                    $r = array($field);\n+                    \n+                    $result['msg'] = str_replace($s , $r , $modx->lexicon('uberbar_error_unknown_field_msg') );\n+                    $result['options'] = '';\n+                    \n+                    return $result;\n                 }\n-                if ($this->modx->hasPermission('view_plugin')) {\n-                    $this->searchPlugins();\n+            }\n+            return true;\n+        }\n+\n+\n+    /* : */\n+        if($count == 2){\n+            $validate = validate_Uberbar($elements,$query);\n+            \n+            if($validate === true){\n+                // Return list of available resource types\n+\n+                \n+                $result['header'] = $this->modx->lexicon('uberbar_pick_element_header');\n+                \n+                $f = array('{uberbar_mode}');\n+                $r = array($uberbar_mode);                \n+                \n+                $result['msg'] = str_replace($f, $r , $this->modx->lexicon('uberbar_pick_element_msg'));\n+                r:\n+                $options = '';\n+                foreach($elements as $key => $val){\n+                    /* Only show elements you have permission to see. */\n+                    if($val['permission'] === true) {\n+                        $activeClass = ($key == $query[1]) ? 'active ' : '';\n+                        $options .= '<li><a data-value=\"'.$key.'\" class=\"'.$activeClass.$btn.'\">'.$val['label'].'</a></li>';\n+                    }\n+                }           \n+                $result['options'] = $options;\n+                \n+                $this->results[] = $result;\n+            }\n+            else{\n+                $this->results[] = $validate;\n+            }            \n+        }\n+        \n+    /* :r: */\n+        if($count == 3){\n+            $validate = validate_Uberbar($elements,$query);\n+            \n+            if($validate === true){\n+                // Return list of available fields that can be searched\n+    \n+                $result['header'] = $this->modx->lexicon('uberbar_pick_fieldname_header');\n+                \n+                $f = array('{uberbar_mode}');\n+                $r = array($uberbar_mode);\n+                \n+                $result['msg'] = str_replace($f , $r , $this->modx->lexicon('uberbar_pick_fieldname_msg') );\n+                \n+                $options = '';\n+                $options .= '<li><a data-value=\"*\" class=\"'.$btn.'\">All (*)</a></li>';\n+                \n+                if($uberbar_mode == 'simple')\n+                {\n+                    $fields = $elements[$element]['fields'];\n                 }\n-                if ($this->modx->hasPermission('view_user')) {\n-                    $this->searchUsers();\n+                else\n+                {\n+                    $fields = array_keys( $this->modx->getFields($elements[$element]['class_key']));\n                 }\n+                \n+                foreach($fields as $key => $value){\n+                    $activeClass = $value == $query[2] ? 'active ' : '';\n+                    $options .= '<li><a data-value=\"'.$value.'\" class=\"'.$activeClass.$btn.'\">'.$value.'</a></li>';\n+                }                \n+                $result['options'] = $options;\n+                \n+                $this->results[] = $result;\n+            }\n+            else{\n+                $this->results[] = $validate;\n             }\n         }\n-\n-        return $this->outputArray($this->results);\n+        \n+        \n+    /* :r:pagetitle: */\n+        if($count == 4){\n+            $validate = validate_Uberbar($elements,$query);\n+            \n+            if($validate === true)\n+            {\n+                $result['header'] = $this->modx->lexicon('uberbar_enter_searchstring_header');\n+                $result['msg'] =    $this->modx->lexicon('uberbar_enter_searchstring_msg');\n+                $result['options'] = '';\n+                \n+                $this->results[] = $result;\n+            }\n+            else{\n+                $this->results[] = $validate;\n+            }            \n+        }\n+             \n+    /* :r:pagetitle:*test*: */\n+        if($count == 5){\n+            $validate = validate_Uberbar($elements,$query);\n+\n+            if($validate === true){\n+                // Process search query, paginate on demand\n+                if(!empty($elements[$element]['class_key'])){\n+                    $this->queryElement($query,$elements,$uberbar_mode);\n+                }\n+                elseif($element == 'modx' && $field == 'config'){\n+                    // 2do\n+                }\n+                else{\n+                    return;\n+                }\n+                \n+            }\n+            else{\n+                $this->results[] = $validate;\n+            }            \n+        }        \n+\n+        if($count > 5){\n+            if($validate === true) {\n+                $validate = validate_Uberbar($elements,$query,$uberbar_mode);\n+            }\n+            else{\n+                $this->results[] = $validate;\n+            }            \n+        }\n+        \n+        \n     }\n+    \n+    public function queryElement($query,$elements,$uberbar_mode){\n+        \n+        $startTime = microtime(true);\n+        \n+        $maxResults = $this->maxResults;\n+        \n+        $btn = \"x-btn x-btn-small x-btn-icon-small-left primary-button x-btn-noicon\";\n+        \n+        $element = $query[1];\n+        $field   = $query[2];\n+        $search  = $query[3];\n+        \n+        $class_key = $elements[$element]['class_key'];\n+        $fields = $elements[$element]['fields'];\n+        \n+        /*\n+        if($element == 'modx' AND $field == 'config'){\n+            // 2do lookup system settings\n+        }\n+        else {\n+            \n+        }\n+        */\n+        \n+        // Prepare query\n+        $c = $this->modx->newQuery($class_key);\n+        \n+        // Some extra adjustments to search for users\n+        if($class_key == 'modUser'){\n+            if($field != 'username'){\n+                $field = 'Profile.'.$field;\n+            }                \n+            $c->select(array(\n+                $this->modx->getSelectColumns('modUser','modUser'),\n+                $this->modx->getSelectColumns('modUserProfile', 'Profile', ''),\n+            ));\n+            $c->leftJoin('modUserProfile', 'Profile');                    \n+        }\n+        elseif($class_key == 'modPlugin'){\n+            \n+            // 2do find plugins by event\n+            // :p:event:onDocFormChange\n+        }\n \n+        \n+        // Replace wildcards (*) with % if they are not preceeded by [ (2do: or `)\n+        $search = preg_replace( '/(?<!\\[)\\*/', '%', $search);\n+        \n+        //$search = str_replace('*','%',$search);\n+        \n+\n+        \n+        $where = array();\n+        \n+        /* Search inside a field */\n+        if(!empty($field) AND $field != '*'){\n+            $like = ($search != $query[3]) ? ':LIKE' : ':=';\n+\n+            $where = array( $field.$like => $search );\n+            $c->where($where);\n+        }\n+        /* Search inside all fields */\n+        else {\n+            // 2do I don't get why := for the else clause doesn't work...\n+            $like = ($search != $query[3]) ? ':LIKE' : ':LIKE';            \n+\n+            foreach($fields as $fieldname){\n+                $n++;\n+                if($class_key == 'modUser' AND $fieldname != 'username'){\n+                    if($n == 1)\n+                    {\n+                        $key = 'Profile.'.$fieldname.$like;                     \n+                    }\n+                    else\n+                    {\n+                        $key = 'OR:.Profile'.$fieldname.$like;","path":"core/model/modx/processors/search/search.class.php","position":479,"original_position":481,"commit_id":"0662df8b4d3f65169525d768de5efb6d7e93dfcc","original_commit_id":"f6e4863cd6fcee1c8104d0fd39b0c13176f736df","user":{"login":"Mark-H","id":312944,"avatar_url":"https://avatars.githubusercontent.com/u/312944?v=3","gravatar_id":"","url":"https://api.github.com/users/Mark-H","html_url":"https://github.com/Mark-H","followers_url":"https://api.github.com/users/Mark-H/followers","following_url":"https://api.github.com/users/Mark-H/following{/other_user}","gists_url":"https://api.github.com/users/Mark-H/gists{/gist_id}","starred_url":"https://api.github.com/users/Mark-H/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Mark-H/subscriptions","organizations_url":"https://api.github.com/users/Mark-H/orgs","repos_url":"https://api.github.com/users/Mark-H/repos","events_url":"https://api.github.com/users/Mark-H/events{/privacy}","received_events_url":"https://api.github.com/users/Mark-H/received_events","type":"User","site_admin":false},"body":"I'm guessing `'OR:.Profile'` should be `'OR:Profile.'`","created_at":"2015-07-14T21:21:33Z","updated_at":"2015-07-14T21:21:34Z","html_url":"https://github.com/modxcms/revolution/pull/12515#discussion_r34621226","pull_request_url":"https://api.github.com/repos/modxcms/revolution/pulls/12515","_links":{"self":{"href":"https://api.github.com/repos/modxcms/revolution/pulls/comments/34621226"},"html":{"href":"https://github.com/modxcms/revolution/pull/12515#discussion_r34621226"},"pull_request":{"href":"https://api.github.com/repos/modxcms/revolution/pulls/12515"}}},"pull_request":{"url":"https://api.github.com/repos/modxcms/revolution/pulls/12515","id":39960581,"html_url":"https://github.com/modxcms/revolution/pull/12515","diff_url":"https://github.com/modxcms/revolution/pull/12515.diff","patch_url":"https://github.com/modxcms/revolution/pull/12515.patch","issue_url":"https://api.github.com/repos/modxcms/revolution/issues/12515","number":12515,"state":"open","locked":false,"title":"New uberbar search","user":{"login":"pepebe","id":667315,"avatar_url":"https://avatars.githubusercontent.com/u/667315?v=3","gravatar_id":"","url":"https://api.github.com/users/pepebe","html_url":"https://github.com/pepebe","followers_url":"https://api.github.com/users/pepebe/followers","following_url":"https://api.github.com/users/pepebe/following{/other_user}","gists_url":"https://api.github.com/users/pepebe/gists{/gist_id}","starred_url":"https://api.github.com/users/pepebe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pepebe/subscriptions","organizations_url":"https://api.github.com/users/pepebe/orgs","repos_url":"https://api.github.com/users/pepebe/repos","events_url":"https://api.github.com/users/pepebe/events{/privacy}","received_events_url":"https://api.github.com/users/pepebe/received_events","type":"User","site_admin":false},"body":"New uberbar search with enhanced search functionality. The code still contains some legacy stuff that might be useful in the future.","created_at":"2015-07-14T20:46:50Z","updated_at":"2015-07-14T21:21:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"81e0f682ea476f1584a5ec53feececab9f963507","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/modxcms/revolution/pulls/12515/commits","review_comments_url":"https://api.github.com/repos/modxcms/revolution/pulls/12515/comments","review_comment_url":"https://api.github.com/repos/modxcms/revolution/pulls/comments{/number}","comments_url":"https://api.github.com/repos/modxcms/revolution/issues/12515/comments","statuses_url":"https://api.github.com/repos/modxcms/revolution/statuses/0662df8b4d3f65169525d768de5efb6d7e93dfcc","head":{"label":"pepebe:master","ref":"master","sha":"0662df8b4d3f65169525d768de5efb6d7e93dfcc","user":{"login":"pepebe","id":667315,"avatar_url":"https://avatars.githubusercontent.com/u/667315?v=3","gravatar_id":"","url":"https://api.github.com/users/pepebe","html_url":"https://github.com/pepebe","followers_url":"https://api.github.com/users/pepebe/followers","following_url":"https://api.github.com/users/pepebe/following{/other_user}","gists_url":"https://api.github.com/users/pepebe/gists{/gist_id}","starred_url":"https://api.github.com/users/pepebe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pepebe/subscriptions","organizations_url":"https://api.github.com/users/pepebe/orgs","repos_url":"https://api.github.com/users/pepebe/repos","events_url":"https://api.github.com/users/pepebe/events{/privacy}","received_events_url":"https://api.github.com/users/pepebe/received_events","type":"User","site_admin":false},"repo":{"id":38576393,"name":"revolution","full_name":"pepebe/revolution","owner":{"login":"pepebe","id":667315,"avatar_url":"https://avatars.githubusercontent.com/u/667315?v=3","gravatar_id":"","url":"https://api.github.com/users/pepebe","html_url":"https://github.com/pepebe","followers_url":"https://api.github.com/users/pepebe/followers","following_url":"https://api.github.com/users/pepebe/following{/other_user}","gists_url":"https://api.github.com/users/pepebe/gists{/gist_id}","starred_url":"https://api.github.com/users/pepebe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pepebe/subscriptions","organizations_url":"https://api.github.com/users/pepebe/orgs","repos_url":"https://api.github.com/users/pepebe/repos","events_url":"https://api.github.com/users/pepebe/events{/privacy}","received_events_url":"https://api.github.com/users/pepebe/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pepebe/revolution","description":"MODX Revolution - Content Application Platform","fork":true,"url":"https://api.github.com/repos/pepebe/revolution","forks_url":"https://api.github.com/repos/pepebe/revolution/forks","keys_url":"https://api.github.com/repos/pepebe/revolution/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pepebe/revolution/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pepebe/revolution/teams","hooks_url":"https://api.github.com/repos/pepebe/revolution/hooks","issue_events_url":"https://api.github.com/repos/pepebe/revolution/issues/events{/number}","events_url":"https://api.github.com/repos/pepebe/revolution/events","assignees_url":"https://api.github.com/repos/pepebe/revolution/assignees{/user}","branches_url":"https://api.github.com/repos/pepebe/revolution/branches{/branch}","tags_url":"https://api.github.com/repos/pepebe/revolution/tags","blobs_url":"https://api.github.com/repos/pepebe/revolution/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pepebe/revolution/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pepebe/revolution/git/refs{/sha}","trees_url":"https://api.github.com/repos/pepebe/revolution/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pepebe/revolution/statuses/{sha}","languages_url":"https://api.github.com/repos/pepebe/revolution/languages","stargazers_url":"https://api.github.com/repos/pepebe/revolution/stargazers","contributors_url":"https://api.github.com/repos/pepebe/revolution/contributors","subscribers_url":"https://api.github.com/repos/pepebe/revolution/subscribers","subscription_url":"https://api.github.com/repos/pepebe/revolution/subscription","commits_url":"https://api.github.com/repos/pepebe/revolution/commits{/sha}","git_commits_url":"https://api.github.com/repos/pepebe/revolution/git/commits{/sha}","comments_url":"https://api.github.com/repos/pepebe/revolution/comments{/number}","issue_comment_url":"https://api.github.com/repos/pepebe/revolution/issues/comments{/number}","contents_url":"https://api.github.com/repos/pepebe/revolution/contents/{+path}","compare_url":"https://api.github.com/repos/pepebe/revolution/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pepebe/revolution/merges","archive_url":"https://api.github.com/repos/pepebe/revolution/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pepebe/revolution/downloads","issues_url":"https://api.github.com/repos/pepebe/revolution/issues{/number}","pulls_url":"https://api.github.com/repos/pepebe/revolution/pulls{/number}","milestones_url":"https://api.github.com/repos/pepebe/revolution/milestones{/number}","notifications_url":"https://api.github.com/repos/pepebe/revolution/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pepebe/revolution/labels{/name}","releases_url":"https://api.github.com/repos/pepebe/revolution/releases{/id}","created_at":"2015-07-05T16:49:21Z","updated_at":"2015-07-05T16:49:30Z","pushed_at":"2015-07-14T21:20:03Z","git_url":"git://github.com/pepebe/revolution.git","ssh_url":"git@github.com:pepebe/revolution.git","clone_url":"https://github.com/pepebe/revolution.git","svn_url":"https://github.com/pepebe/revolution","homepage":"http://rtfm.modx.com/revolution/2.x/","size":45047,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"modxcms:master","ref":"master","sha":"9df6a1b6529ddfd14183a814366caa910653ba71","user":{"login":"modxcms","id":232723,"avatar_url":"https://avatars.githubusercontent.com/u/232723?v=3","gravatar_id":"","url":"https://api.github.com/users/modxcms","html_url":"https://github.com/modxcms","followers_url":"https://api.github.com/users/modxcms/followers","following_url":"https://api.github.com/users/modxcms/following{/other_user}","gists_url":"https://api.github.com/users/modxcms/gists{/gist_id}","starred_url":"https://api.github.com/users/modxcms/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/modxcms/subscriptions","organizations_url":"https://api.github.com/users/modxcms/orgs","repos_url":"https://api.github.com/users/modxcms/repos","events_url":"https://api.github.com/users/modxcms/events{/privacy}","received_events_url":"https://api.github.com/users/modxcms/received_events","type":"Organization","site_admin":false},"repo":{"id":806201,"name":"revolution","full_name":"modxcms/revolution","owner":{"login":"modxcms","id":232723,"avatar_url":"https://avatars.githubusercontent.com/u/232723?v=3","gravatar_id":"","url":"https://api.github.com/users/modxcms","html_url":"https://github.com/modxcms","followers_url":"https://api.github.com/users/modxcms/followers","following_url":"https://api.github.com/users/modxcms/following{/other_user}","gists_url":"https://api.github.com/users/modxcms/gists{/gist_id}","starred_url":"https://api.github.com/users/modxcms/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/modxcms/subscriptions","organizations_url":"https://api.github.com/users/modxcms/orgs","repos_url":"https://api.github.com/users/modxcms/repos","events_url":"https://api.github.com/users/modxcms/events{/privacy}","received_events_url":"https://api.github.com/users/modxcms/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/modxcms/revolution","description":"MODX Revolution - Content Application Platform","fork":false,"url":"https://api.github.com/repos/modxcms/revolution","forks_url":"https://api.github.com/repos/modxcms/revolution/forks","keys_url":"https://api.github.com/repos/modxcms/revolution/keys{/key_id}","collaborators_url":"https://api.github.com/repos/modxcms/revolution/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/modxcms/revolution/teams","hooks_url":"https://api.github.com/repos/modxcms/revolution/hooks","issue_events_url":"https://api.github.com/repos/modxcms/revolution/issues/events{/number}","events_url":"https://api.github.com/repos/modxcms/revolution/events","assignees_url":"https://api.github.com/repos/modxcms/revolution/assignees{/user}","branches_url":"https://api.github.com/repos/modxcms/revolution/branches{/branch}","tags_url":"https://api.github.com/repos/modxcms/revolution/tags","blobs_url":"https://api.github.com/repos/modxcms/revolution/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/modxcms/revolution/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/modxcms/revolution/git/refs{/sha}","trees_url":"https://api.github.com/repos/modxcms/revolution/git/trees{/sha}","statuses_url":"https://api.github.com/repos/modxcms/revolution/statuses/{sha}","languages_url":"https://api.github.com/repos/modxcms/revolution/languages","stargazers_url":"https://api.github.com/repos/modxcms/revolution/stargazers","contributors_url":"https://api.github.com/repos/modxcms/revolution/contributors","subscribers_url":"https://api.github.com/repos/modxcms/revolution/subscribers","subscription_url":"https://api.github.com/repos/modxcms/revolution/subscription","commits_url":"https://api.github.com/repos/modxcms/revolution/commits{/sha}","git_commits_url":"https://api.github.com/repos/modxcms/revolution/git/commits{/sha}","comments_url":"https://api.github.com/repos/modxcms/revolution/comments{/number}","issue_comment_url":"https://api.github.com/repos/modxcms/revolution/issues/comments{/number}","contents_url":"https://api.github.com/repos/modxcms/revolution/contents/{+path}","compare_url":"https://api.github.com/repos/modxcms/revolution/compare/{base}...{head}","merges_url":"https://api.github.com/repos/modxcms/revolution/merges","archive_url":"https://api.github.com/repos/modxcms/revolution/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/modxcms/revolution/downloads","issues_url":"https://api.github.com/repos/modxcms/revolution/issues{/number}","pulls_url":"https://api.github.com/repos/modxcms/revolution/pulls{/number}","milestones_url":"https://api.github.com/repos/modxcms/revolution/milestones{/number}","notifications_url":"https://api.github.com/repos/modxcms/revolution/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/modxcms/revolution/labels{/name}","releases_url":"https://api.github.com/repos/modxcms/revolution/releases{/id}","created_at":"2010-07-29T21:03:57Z","updated_at":"2015-07-06T15:27:25Z","pushed_at":"2015-07-14T21:20:04Z","git_url":"git://github.com/modxcms/revolution.git","ssh_url":"git@github.com:modxcms/revolution.git","clone_url":"https://github.com/modxcms/revolution.git","svn_url":"https://github.com/modxcms/revolution","homepage":"http://rtfm.modx.com/revolution/2.x/","size":81937,"stargazers_count":689,"watchers_count":689,"language":"PHP","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":350,"mirror_url":null,"open_issues_count":904,"forks":350,"open_issues":904,"watchers":689,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/modxcms/revolution/pulls/12515"},"html":{"href":"https://github.com/modxcms/revolution/pull/12515"},"issue":{"href":"https://api.github.com/repos/modxcms/revolution/issues/12515"},"comments":{"href":"https://api.github.com/repos/modxcms/revolution/issues/12515/comments"},"review_comments":{"href":"https://api.github.com/repos/modxcms/revolution/pulls/12515/comments"},"review_comment":{"href":"https://api.github.com/repos/modxcms/revolution/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/modxcms/revolution/pulls/12515/commits"},"statuses":{"href":"https://api.github.com/repos/modxcms/revolution/statuses/0662df8b4d3f65169525d768de5efb6d7e93dfcc"}}}}