var us = {}; //注册命名空间。

//-------------------引入express模块，如果此处出错，请确认express已安装，------------------
//而且express在环境变量NODE_PATH目录中
var express = require('express');
//创建web服务
var app = express();
//以当前目录下的demo目录为web应用根目录
app.use(express.static(__dirname + '/'));
//显示错误信息，以方便调试
app.use(express.errorHandler({
    showStack: true,
    dumpExceptions: true
}));

//----------------------------------------引用包含系统模块---------------------------------
us.http = require('http');//引用包含http处理类
us.querystring = require("querystring"); //引用获取参数类
us.url = require("url"); //引用url地址处理类

//-----------------------------------------引用包含用户模块---------------------------------
//us._usdb = require('./us.db.js'); //包含另外一个文件
us.mongodb = require('./us.mongodb.js'); //引用mongodb数据库文件
us.mysql = require('./us.mysql.js'); //引用mysql数据库文件，感觉mongodb处理传统数据还是有缺陷
us.cookie = require('./us.cookie.js');//javascript处理Cookie.

//文件操作
us.files = require('./us.file.js');

//----------------------------------------接受http请求--------------------------------------
app.all('/', function (req, res) {
    //us.http.createServer(function (req, res) {
    //备注：res.writeHead(200, {'Content-Type': 'text/plain'});//英文编码
    //备注：传递表单需要添加,'application/x-www-form-urlencoded'
    //备注：Access-Control-Allow-Origin解决ie10跨域，还未完全其他跨域，如chrome等，需要进一步完善。
    //备注："Content-Type": "text/html;charset=utf-8"解决nodejs连接mysql中文编码问题
    //备注：'Access-Control-Allow-Origin': '*'  解决nodejs  Access-Control-Allow-Origin不允许跨域调用的问题。现在用端口有这个问题，以后需要移除。
    //console.log("ok");没有调试模式，只能用这个输出错误。
    //res.writeHead(200, { "Content-Type": "text/html;charset=utf-8", "Access-Control-Allow-Origin": "http://d.1473.cn", "access-control-allow-headers": "Origin" });
    //解决Chrome浏览器跨域问题。
    //res.writeHead(200, { "Content-Type": "text/html;application/json;charset=utf-8", 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With' });
    res.writeHead(200, { "Content-Type": "text/html;application/json;charset=utf-8", 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With' });
    //console.log(us.querystring.parse(req.headers.cookie)); //前台cookie
    debugger;
    //nodejs接收参数也要异步,编程起来就有点麻烦了，注意产生闭包情况。
    //NodeJS引擎中许多对象都有预定的事件，如用户在发送http请求之后获得的http.ServerRequest对象就有data和end两个事件，
    //其中data指接收到响应信息正文中的一部分时会触发此事件，end指完全接收完信息后都会触发一次。开发人员如果想处理响应，则需要注册回调函数
    //on('data') 事件   只有post 请求才能触发,由于1473都是post，所以研究这一块，传统的get方式是不一样的。
    var params = '';
    //获取参数中
    req.on('data', function (chunk) { params += chunk; });
    //获取参数结束。
    req.on('end', function () {
        //querystring.parse可以把形如mode=select&test=1111的字符串拆分成一个json对象，不过这个对象很奇怪，直接输出这个对象会报错
        var _postJson = us.querystring.parse(params);
        console.log(params);
        if (params == "") { console.log("参数为空！"); res.end(""); return; } //传递参数出错的情况下，保证后台不报错,还真奇怪啊。居然有时候可以有时候不可以，难道跨域检测机制有问题？
        //只能通过以下方式获取其中的值。这就有一定的局限性。。还需要研究。
        var _usparams = _postJson.mode; //前台传递进来的插入删除等模式
        _usparams = _usparams.split(","); //作为一个数组传递，不再拆分，可以让后台极度简化
        var _mode = _usparams[0]; //mode为switch中的路径参数.数组中剩下的为实际参数。暂时没有用处了

        //判断是mysql还是mongodb。分流。mysql是参数0,作为唯一标识。
        if (_usparams[0] == "mysql") {
            //截取掉参数1，因为是mongodb还是mysql的标志。monogdb采用默认的，没有这个参数
            _usparams.splice(0, 1);
            us.mysql.usselect(_usparams, function (results) { res.end(results); });
        }
        else if (_usparams[0] == "bkp") {//后端程序。数组第一位为文件内容，第二问为文件名,第三为语言类型
            us.files.createFileStream(res, _usparams[1], _usparams[2], _usparams[3]);
        }
        else {
            //后台代码简化为一句话。传递req,Cookie处理类，参数数组就可以了。
            us.mongodb.US_CommonPro(req, us.cookie, _usparams, function (results) { res.end(results); });
        }
        //        switch (_mode) {
        //            case "Select_OneUserByID":
        //                //console.log(_usparams[1]);
        //                //选取一个用户的树目录
        //                //us.mongodb.SelectOneUserByID("SelectOneUserByID", _usparams[1], function (results) { res.end(results); }); break;
        //                us.mongodb.US_CommonPro(_usparams, function (results) { res.end(results); }); break; 
        //            default: break;
        //        }
        //nodejs和其他程序语言不一样，在执行选取的过程中，照样会执行后面的代码，结果后面的代码先执行到res.end("false");导致返回false。所以default中不能返回res.end("false");
        //cookie判断,是否有权限做增加删除修改操作。用户id一定是传到第一个参数里面
        //        if (us.cookie.IsloginId(req, _usparams[1])) {
        //            switch (_mode) {
        //                case "Add_Folder":
        //                    //添加项目或者文件夹，通用一个函数，区分在于节点深度为2的全部是项目，根节点深度为1.其他全部是文件夹。
        //                    //1为用户id，2为父亲节点id，3为父亲节点深度，4为节点id，5为节点名字。
        //                    us.mongodb.Add_Folder("Add_Folder", _usparams[1], _usparams[2], _usparams[3], _usparams[4], _usparams[5], function (results) { res.end(results); }); break;
        //                case "Add_File":
        //                    //添加项目或者文件夹，通用一个函数，区分在于节点深度为2的全部是项目，根节点深度为1.其他全部是文件夹。
        //                    us.mongodb.Add_File("Add_File", _usparams[1], _usparams[2], _usparams[3], _usparams[4], _usparams[5], function (results) { res.end(results); }); break;
        //                case "Delete_Folder":
        //                    us.mongodb.Delete_Folder("Delete_Folder", _usparams[1], _usparams[2], _usparams[3], function (results) { res.end(results); }); break;
        //                case "Update_Folder":
        //                    us.mongodb.Update_Folder("Update_Folder", _usparams[1], _usparams[2], _usparams[3], _usparams[4], function (results) { res.end(results); }); break;
        //                case "Update_FileContent":
        //                    console.log(_usparams[1]); console.log(_usparams[2]); console.log(_usparams[3]); console.log(_usparams[4]);
        //                    us.mongodb.Update_FileContent("Update_FileContent", _usparams[1], _usparams[2], _usparams[3], _usparams[4], function (results) { res.end(results); }); break;
        //                default: break; //默认返回false，以利于前台判断。
        //            }
        //        }

        //res.end(_mode);
    });
    //备注第一个参数为构建连接字符串，第二个参数为异步查询数据库结束后调用的回调函数
    //_usdb.usselect('SELECT * FROM ' + 'PBDirectory ' + 'limit 10', function (results) {if (results === 'false') { throw Error; } else { res.end(results);}});//加错误处理
    //_usdb.usselect('SELECT * FROM ' + 'PBDirectory ' + 'limit 10', function (results) { res.end(results);});\
    //res.end("\n node js end! ");
});
//.listen(1337, "d.1473.cn");
//console.log('Server running at http://d.1473.cn:1337/');
//上面2行代码必须转换为域名，否则会跨域错误,或者使用express框架，把整个目录包含进去/// <reference path="us.mongodb.js" />

app.listen(13371, "c-back.1473.cn"); //启动express web服务，监听1337端口
console.log('express Server running at http://c-back.1473.cn:13371/');


