﻿$engine JScript
$uname PreCommitHookRedmine
$dname Хук перед помещением в хранилище  
$addin stdlib
$addin stdcommands

// (c) Сосна Евгений <shenja@sosna.zp.ua>
// Зроблено в Україні. 

stdlib.require('TextWindow.js', SelfScript);
stdlib.require('ScriptForm.js', SelfScript);
stdlib.require('log4js.js', SelfScript);

global.connectGlobals(SelfScript);

var logger = Log4js.getLogger(SelfScript.uniqueName);
var appender = new Log4js.BrowserConsoleAppender();
appender.setLayout(new Log4js.PatternLayout(Log4js.PatternLayout.TTCC_CONVERSION_PATTERN));
logger.addAppender(appender);
logger.setLevel(Log4js.Level.ERROR);

SelfScript.self['macrosНастройка'] = function() {
    PreCommitHookRedmine = GetPreCommitHookRedmine();
    PreCommitHookRedmine.show();
}

SelfScript.self['macrosУстановитьТекст'] = function(){
    PreCommitHookRedmine = GetPreCommitHookRedmine();
    PreCommitHookRedmine.setText();
}


PreCommitHookRedmine = ScriptForm.extend({

    settingsRootPath : SelfScript.uniqueName,
    
    settings : {
        pflBase : {
            'usePreCommitHook': false,
            'redmineAddress' : "",
            'redmineQuery': "" ,
            'port':80,
            'settings_commit_ref_keywords': "refs"
        }
    },

    construct : function () {
        
        this._super(SelfScript.fullPath.replace(/.js$/, '.ssf')); //Загрузим форму с настройками, форма должна называться так же как и скрипт, только с расширением ssf
        this.loadSettings(); //Загрузим сохраненные настройки. 
        
        PreCommitHookRedmine._instance = this;
    }, 
    
    loadSettings: function(){
        this._super();

        if(this.form.usePreCommitHook){
            events.connect(windows, "onDoModal", this, "hookCfgStorWindow")
        }else {
            try{
                events.disconnect(windows, "onDoModal", this, "hookCfgStorWindow");
            } catch(e){
                //Message("Ошибка :"+e.description);
            }
        }

               
    },

    hookCfgStorWindow:function(dlgInfo){
        if(dlgInfo.stage == openModalWnd)
        {
            try{ //иногда вылетают странные исключения :( при работе с элементами форм
                //FIXME: добавить английский заголовок и других языков. 
                reCaptionCfgStore = /Помещение\sобъектов\sв\sхранилище\sконфигурации/ig
                if (reCaptionCfgStore.test(dlgInfo.Caption)){
                    ctr = dlgInfo.form.getControl("EnrollComment");
                    ctr.value = this.getText();
                }
            } catch(e){}

        }
    },

    getText:function(){
        
        var re = new RegExp("<entry>\\n\\s*<title>(.{1,}\\s#(\\d{1,})\\s\\(.*\\)):(.*)</title>", "gmi");

        var tempfile = ПолучитьИмяВременногоФайла();
        var text = "";
        try{

            var http = v8New("HTTPСоединение", this.form.redmineAddress, this.form.port);
            http.get(this.form.redmineQuery, tempfile);


            var TextDoc = v8New("TextDocument");
            TextDoc.Read(tempfile, "UTF-8");    
            textFull = TextDoc.GetText();
            logger.debug("full text:"+textFull);
            
            var matches;
            logger.debug("re:"+re);
            
        } catch(e){
            Message(""+e.description);
        }

        while ((matches = re.exec(textFull)) != null)
            {
                logger.debug(matches[0]);
                issue = matches[2];
                issueText = matches[3];

                text = text +"("+this.form.settings_commit_ref_keywords+" #"+issue+") :"+issueText + "\n";

            }
      return text;
    },

    setText : function(){
        text = this.getText();
        if (text.length > 0){
            var wnd = GetTextWindow();
            if (!wnd){
                Message(text);
            } else{

                wnd.SetText(text);
            }
        }
    },

    Ok_Click:function(Button){
        this.saveSettings();
        this.loadSettings();
        this.form.Close();
    }, 

    Close_Click:function(Button){
        this.form.Close();
    }

})


function GetPreCommitHookRedmine() {
    if (!PreCommitHookRedmine._instance)
        new PreCommitHookRedmine();
    
    return PreCommitHookRedmine._instance;
}

GetPreCommitHookRedmine();