define(function(require,exports,module){var ASTWalker=brackets.getModule("thirdparty/acorn/dist/walk"),EditorManager=brackets.getModule("editor/EditorManager"),Session=brackets.getModule("JSUtils/Session"),RefactoringUtils=require("RefactoringUtils"),Strings=brackets.getModule("strings"),InlineMenu=brackets.getModule("widgets/InlineMenu").InlineMenu,session=null;function extract(scopes,parentStatement,expns,text,insertPosition){var varType="var",varName=RefactoringUtils.getUniqueIdentifierName(scopes,"extracted"),varDeclaration="var "+varName+" = "+text+";\n",parentStatementStartPos=session.editor.posFromIndex(parentStatement.start),insertStartPos=insertPosition||parentStatementStartPos,selections=[],doc=session.editor.document,replaceExpnIndex=0,posToIndent,edits=[];"ExpressionStatement"===parentStatement.type&&RefactoringUtils.isEqual(parentStatement.expression,expns[0])&&insertStartPos.line===parentStatementStartPos.line&&insertStartPos.ch===parentStatementStartPos.ch&&(varDeclaration="var "+varName+" = ",replaceExpnIndex=1),posToIndent=doc.adjustPosForChange(insertStartPos,varDeclaration.split("\n"),insertStartPos,insertStartPos);for(var i=replaceExpnIndex;i1)editor.displayErrorMessageAtCursor(Strings.ERROR_EXTRACTTO_VARIABLE_MULTICURSORS);else{initializeSession(editor);var selection=editor.getSelection(),doc=editor.document,retObj=RefactoringUtils.normalizeText(editor.getSelectedText(),editor.indexFromPos(selection.start),editor.indexFromPos(selection.end),!0),text=retObj.text,start=retObj.start,end=retObj.end,ast,scopes,expns,inlineMenu;RefactoringUtils.getScopeData(session,editor.posFromIndex(start)).done(function(scope){if(ast=RefactoringUtils.getAST(doc.getText()),scopes=RefactoringUtils.getAllScopes(ast,scope,doc.getText()),editor.hasSelection())extractToVariable(ast,start,end,text,scopes);else{if((expns=getExpressions(ast,start,end)).forEach(function(expn,index){expn.value=doc.getText().substr(expn.start,expn.end-expn.start)}),expns.sort(function(a,b){return a.value.length-b.value.length}),!expns||!expns.length)return void session.editor.displayErrorMessageAtCursor(Strings.ERROR_EXTRACTTO_VARIABLE_NOT_VALID);var firstExpnLength=RefactoringUtils.numLines(expns[0].value);if((expns=expns.filter(function(expn){return RefactoringUtils.numLines(expn.value)===firstExpnLength})).forEach(function(expn,index){RefactoringUtils.numLines(expn.value)>1?expn.name=expn.value.substr(0,expn.value.indexOf("\n"))+"...":expn.name=expn.value}),1===expns.length)return void callExtractToVariable(expns[0].start,expns[0].end,expns[0].value);expns.forEach(function(expn,index){expn.id=index}),(inlineMenu=new InlineMenu(session.editor,Strings.EXTRACTTO_VARIABLE_SELECT_EXPRESSION)).onHover(function(expnId){editor.off("scroll.inlinemenu"),editor.isLineVisible(editor.posFromIndex(expns[expnId].end).line)||editor.on("scroll.inlinemenu",function(){editor.off("scroll.inlinemenu"),inlineMenu.openRemovedMenu()}),editor.setSelection(editor.posFromIndex(expns[expnId].start),editor.posFromIndex(expns[expnId].end))}),inlineMenu.open(expns),inlineMenu.onSelect(function(expnId){callExtractToVariable(expns[expnId].start,expns[expnId].end,expns[expnId].value),inlineMenu.close()}),inlineMenu.onClose(function(){inlineMenu.close()})}}).fail(function(){editor.displayErrorMessageAtCursor(Strings.ERROR_TERN_FAILED)})}function callExtractToVariable(startPos,endPos,value){RefactoringUtils.getScopeData(session,editor.posFromIndex(startPos)).done(function(expnscope){scopes=RefactoringUtils.getAllScopes(ast,expnscope,doc.getText()),extractToVariable(ast,startPos,endPos,value,scopes)}).fail(function(){editor.displayErrorMessageAtCursor(Strings.ERROR_TERN_FAILED)})}}function initializeSession(editor){session=new Session(editor)}exports.handleExtractToVariable=handleExtractToVariable});