var fso = WScript.CreateObject("Scripting.FileSystemObject");
var args = WScript.Arguments;
var env = WScript.CreateObject("WScript.Shell").Environment;

var folder_from, folder_to;
var attributes = 0;
var regexps = new Array();
var use_regexp = 0;

function setup()
{
    if(env.item("FXFROMDIR")) {
        folder_from = env.item("FXFROMDIR");
    }
    
    if(env.item("FXTODIR")) {
        folder_to = env.item("FXTODIR");
    }

    if(args.count() > 0) {
        if(args.item(0).length > 2) {
            folder_from = args.item(0);
        } else {
            WScript.Echo("Invalid folder: " + args.item(0));
            WScript.Quit(4);
        }
    }

    if(args.count() > 1) {
        if(args.item(1).length > 2) {
            folder_to = args.item(1);
        } else {
            WScript.Echo("Invalid folder: " + args.item(1));
            WScript.Quit(4);
        }
    }
    
    if(!folder_from) {
        WScript.Echo("You haven't entered folder, from which your files will be copied!");
        WScript.Quit(8);
    }
    
    if(!folder_to) {
        WScript.Echo("You haven't entered folder, to which your files will be copied!");
        WScript.Quit(8);
    }

    if(!fso.FolderExists(folder_from)) {
        WScript.Echo("Folder doesn't exists: " + folder_from);
        WScript.Quit(1);
    }
    
    if(!fso.FolderExists(folder_to)) {
        fso.CreateFolder(folder_to);
    }
    
    for(var i = 2; i < args.count(); ++i)
    {
        if(args.item(i) == "--help") {
            WScript.Echo("Read the readme.txt file!");
            WScript.Quit(0);
        } else if(args.item(i) == "-h") {
            attributes += 2;
        } else if(args.item(i) == "-a") {
            attributes += 32;
        } else if(args.item(i) == "-r") {
            attributes += 1;
        } else if(args.item(i) == "-s") {
            attributes += 4;
        } else if(args.item(i) == "--regexp") {
            use_regexp = 1;
        } else {
            regexps = regexps.concat(args.item(i));
            //WScript.Echo("Invalid parameter! Use --help!");
            //WScript.Quit(2);
        }
    }
    
    if(!use_regexp) {
        for(var i = 0; i < regexps.length; ++i)
        {
            regexps[i] = regexps[i].replace(/\\/g, "\\\\");
            regexps[i] = regexps[i].replace(/\^/g, "\\\^");
            regexps[i] = regexps[i].replace(/\//g, "\\\/");
            regexps[i] = regexps[i].replace(/\$/g, "\\\$");
            regexps[i] = regexps[i].replace(/\./g, "\\\.");
            regexps[i] = regexps[i].replace(/\[/g, "\\\[");
            regexps[i] = regexps[i].replace(/\]/g, "\\\]");
            regexps[i] = regexps[i].replace(/\|/g, "\\\|");
            regexps[i] = regexps[i].replace(/\(/g, "\\\(");
            regexps[i] = regexps[i].replace(/\)/g, "\\\)");
            regexps[i] = regexps[i].replace(/\+/g, "\\\+");
            regexps[i] = regexps[i].replace(/\{/g, "\\\{");
            regexps[i] = regexps[i].replace(/\}/g, "\\\}");
            regexps[i] = regexps[i].replace(/\-/g, "\\\-");
            regexps[i] = regexps[i].replace(/\+/g, "\\\+");
            regexps[i] = regexps[i].replace(/\*/g, ".*");
            regexps[i] = regexps[i].replace(/\?/g, "\.");
        }
    }
    
    if(!regexps.length) {
        WScript.Echo("Enter masks of files, like \"*.bmp *.bak *.tmp\". Use --help parameter for more!");
        WScript.Quit(8);
    }
}

function read_folder(folder_from, folder_to)
{
    var fld = fso.GetFolder(folder_from);
    var folders = new Enumerator(fld.subFolders);
    for(; !folders.atEnd(); folders.moveNext())
    {
        if(!fso.FolderExists(folder_to + folders.item().name)) {
            fso.CreateFolder(folder_to +  folders.item().name + '\\' );
        }
        read_folder(folders.item(), folder_to + folders.item().name + '\\' );
    }
    
    var files = new Enumerator(fld.Files);
    for(; !files.atEnd(); files.moveNext())
    {
        for(var i = 0; i < regexps.length; ++i)
        {
            if((files.item().attributes & attributes) || (files.item().attributes == 0)) {
                if(files.item().name.match(regexps[i]) == files.item().name) {
                    if(!fso.FileExists(folder_to + files.item().name)) {
                        fso.CopyFile(files.item(), folder_to);
                    }
                }
            }
        }
    }
}

setup();

if(WScript.CreateObject("WScript.Shell").Popup("Are you sure, you want to copy files?", 0, "Warning", 1) == 1) {
    read_folder(folder_from, folder_to);
}
