<commit_before>var pg = require('pg');
var _ = require('underscore');
var request = require('request');
var jwt = require('jsonwebtoken');
var secret = require('../../config/secret');
var db_settings = require('../../server.js').db_settings;
var errors = require('../../config/errors');

var Ajv = require('ajv');
var schema = require('../../models/query');
var ajv = Ajv({"format": "full"});
var validate = ajv.compile(schema);

var CouchDB_Client = require('../connectors/CouchDB_Client.js');
var EnviroCar_Client = require('../connectors/EnviroCar_Client.js');
var Postgres_Client = require('../connectors/Postgres_Client.js');
var Sparql_Client = require('../connectors/Sparql_Client.js');

// POST
exports.request = function(req, res){

    // Create timestamp
    var time = Date.now();
    // Check if Header contains Access-Token
    var accessToken = "";
    Flag = true;
    if(!req.query.authorization || req.query.authorization === "") {
        if(!req.headers.authorization || req.headers.authorization === ""){
            console.log("error. no valid authorization");
            Flag = false;
        } else {
            accessToken = req.headers.authorization;
            Flag = true;
        }
    } else {
        accessToken = req.query.authorization;
        Flag = true;
    }
    if(!Flag){
       res.status(errors.authentication.error_2.code).send(errors.authentication.error_2);
       return console.error(errors.authentication.error_2.message);
    } else {
        var url = "postgres://" + db_settings.user + ":" + db_settings.password + "@" + db_settings.host + ":" + db_settings.port + "/" + db_settings.database_name;

        // Connect to Database
        pg.connect(url, function(err, client, done) {
            if (err) {
                res.status(errors.database.error_1.code).send(errors.database.error_1);
                return console.error(errors.database.error_1.message, err);
            } else {

                // Database Query
                client.query('SELECT * FROM Apps WHERE app_hash=$1;', [
                    accessToken
                ], function(err, result) {
                    done();

                    if (err) {
                        res.status(errors.database.error_2.code).send(_.extend(errors.database.error_2, err));
                        return console.error(errors.database.error_2.message, err);
                    } else {

                        // Check if App exists
                        if (result.rows.length === 0) {
                            res.status(errors.query.error_1.code).send(errors.query.error_1);
                            console.error(errors.query.error_1.message);
                        } else {
                            query = "SELECT categories.category_name, sub_datasets.sd_name, sub_datasets.sd_description, main_datasets.md_name, main_datasets.md_description, datastores.ds_type, datastores.ds_host, datastores.ds_port, datastores.db_instance, datastores.db_user, datastores.db_password, datastores.db_instance "
                            query += "FROM public.sub_datasets INNER JOIN public.main_datasets ON sub_datasets.md_id=main_datasets.md_id INNER JOIN public.datastores ON main_datasets.ds_id=datastores.ds_id INNER JOIN categories_relationships ON categories_relationships.md_id=main_datasets.md_id INNER JOIN categories ON categories.category_id=categories_relationships.category_id "
                            words = req.params.category_name.split("&");
                            var index = 1;
                            var params = [];
                            for(i in words) {
                                word = words[i].split(",");
                                if(i==0) {
                                    for(j in word) {
                                        if(j==0) {
                                            tmp = "WHERE categories.category_name LIKE '%' || $"+index+" || '%' ";
                                            query += tmp;
                                            params.push(word[j]);
                                            index++;
                                            logCategory(client, word[j], accessToken);
                                        } else {
                                            tmp = "OR categories.category_name LIKE '%' || $"+index+" || '%' ";
                                            params.push(word[j]);
                                            index++;
                                            logCategory(client, word[j], accessToken);
                                        }
                                    }
                                } else {
                                    for(j in word) {
                                        if(j==0) {
                                            tmp = "AND categories.category_name LIKE '%' || $"+index+" || '%' ";
                                            query += tmp;
                                            params.push(word[j]);
                                            index++;
                                            logCategory(client, word[j], accessToken);
                                        } else {
                                            tmp = "OR categories.category_name LIKE '%' || $"+index+" || '%' ";
                                            query += tmp;
                                            params.push(word[j]);
                                            index++;
                                            logCategory(client, word[j], accessToken);
                                        }
                                    }
                                }
                            }
                            query += ";";
                            client.query(query, params, function(err, result) {
                                if(err) {
                                    console.log(err);
                                } else {
                                    if(result.rows.length === 0) {
                                        console.log("No entry for this category");
                                        res.status(errors.query.error_3.code).send(errors.query.error_3);
                                    } else {
                                        //res.status(201).send(result.rows);
                                        var answerCount = 0;
                                        for(index in result.rows) {
                                            // Prepare Connectors
                                            var Answer = {
                                                search_tag: req.params,
                                                results: [],
                                                data: {
                                                    Rest: {
                                                        time: 0,
                                                        count: 0,
                                                        data: []
                                                    },
                                                    postgres: {
                                                        time: 0,
                                                        count: 0,
                                                        data: []
                                                    },
                                                    parliament: {
                                                        time: 0,
                                                        count: 0,
                                                        data: []
                                                    },
                                                    couchDB: {
                                                        time: 0,
                                                        count: 0,
                                                        data: []
                                                    }
                                                }
                                            }

                                            switch(result.rows[index].ds_type) {
                                                /** TODO:
                                                 * Need to get query from database, then execute
                                                 */
                                                case("POSTGRESQL"):
                                                    answerCount ++;
                                                    // PostgreSQL
                                                    _url = "postgres://" + result.rows[index].db_user + ":" + result.rows[index].db_password + "@" + result.rows[index].db_host + ":" + result.rows[index].db_port + "/" + result.rows[index].db_instance;
                                                    var postgres_Client = new Postgres_Client(url);
                                                    postgres_Client.setURL(url);
                                                    /*postgres_Client.query(result.rows[index].query_intern, [], function(_result, err) {
                                                        if(err) {
                                                            //console.log(err);
                                                            finish(res, Answers, answerCount, result.rows.length);
                                                        } else {
                                                            Result = {
                                                                preview: _result.parseRowsByColNames("Datasets").Datasets,
                                                                query: result.rows[index].query_intern,
                                                                query_description: result.rows[index].query_description,
                                                                sd_name: result.rows[index].sd_name,
                                                                sd_description: result.rows[index].sd_description,
                                                                md_name: result.rows[index].md_name,
                                                                md_description: result.rows[index].md_description
                                                            }
                                                            Answer.data.postgres.push(Result);
                                                            finish(res, Answer, answerCount, result.rows.length);
                                                        }
                                                    });*/
                                                    finish(res, Answer, answerCount, result.rows.length);
                                                    break;
                                                case("REST"):
                                                    answerCount ++;
                                                    request(result.rows[index].ds_host, function(error, response, body) {
                                                        if(!error) {
                                                            dt = {
                                                                name: result.rows[index].sd_name,
                                                                descritpion: result.rows[index].sd_descripton,
                                                                preview: JSON.parse(body)
                                                            }
                                                            Answer.data.Rest.data.push(dt);
                                                            Answer.data.Rest.count ++;
                                                            finish(res, Answer, answerCount, result.rows.length);
                                                        } else {
                                                            console.log(error);
                                                            console.log(response);
                                                        }
                                                    });
                                                    break;
                                                case("COUCHDB"):
                                                    answerCount ++;
                                                    var data = result.rows[index];
                                                    var length = result.rows.length;
                                                    var couchdb_Client = new CouchDB_Client(data.ds_host, data.ds_port);
                                                    couchdb_Client.useDatabase(data.db_instance);
                                                    couchdb_Client.query(function (result) {
                                                        Answer.data.couchDB.data.push(result);
                                                        Answer.data.couchDB.count ++;
                                                        finish(res, Answer, answerCount, length);
                                                    });
                                                    break;
                                                default:
                                                    answerCount++;
                                                    console.log("unknown Database");
                                                    console.log(result.rows[index].ds_type);
                                                    finish(res, Answer, answerCount, result.rows.length);
                                                    break;
                                            }

                                        }
                                    }
                                }
                                    /*// EnviroCar
                                    var enviroCar_Client = new EnviroCar_Client();
                                    enviroCar_Client.query("sensors", function(data) {
                                        Answer.enviroCar.time = (Date.now() - time) / 1000 + " s";
                                        Answer.enviroCar.data = data.results;
                                        answerCount += 1;
                                        finish(res, Answer, answerCount, 1);
                                    });

                                    // Parliament
                                    var sparql_Client = new Sparql_Client();
                                    sparql_Client.query("SELECT ?p ?o { <http://vocab.lodcom.de/muenster> ?p ?o }", function(result) {
                                        Answer.parliament.time = (Date.now() - time) / 1000 + " s";
                                        Answer.parliament.data = result;
                                        answerCount += 1;
                                        finish(res, Answer, answerCount, 1);
                                    });

                                    // CouchDB
                                    var couchDB_Client = new CouchDB_Client();
                                    couchDB_Client.query(function (result) {
                                        Answer.couchDB.time = (Date.now()-time) / 1000 + " s";
                                        Answer.couchDB.data = result;
                                        answerCount += 1;
                                        finish(res, Answer, answerCount, 1);
                                    });*/

                            });
                        }
                    }
                });
            }
        });
    }
};

/**
 * Check
 * @param  {number} count
 * @param  {number} maximum
 * @return {boolean} true or false
 */
var check = function (count, max) {
    if(count == max) {
        return true;
    } else {
        return false;
    }
};

/**
 * Finish
 */
var finish = function (res, Answer, answerCount, max) {
    if(check(answerCount, max)) {
        res.status(201).send(Answer);
    }
};

var logCategory = function (client, category_name, accessToken) {
    console.log(category_name);
    client.query("SELECT category_id FROM categories WHERE category_name LIKE '%' || $1 || '%' ", [
        category_name
    ], function (err, result) {
        if(err) {
            console.log(err);
        } else {
            if(result.rows.length == 0) {
                console.log("No Category");
            } else {
                console.log(result.rows[0].category_id);
                category_id = result.rows[0].category_id;
                client.query("INSERT INTO Logs VALUES ($1, now(), $2)", [accessToken, category_id], function (err, result) {
                    if(err) {
                        console.log(err);
                    } else {
                        //Logged the search
                    }
                });
            }
        }
    });
}
<commit_msg>small changes<commit_after>var pg = require('pg');
var _ = require('underscore');
var request = require('request');
var jwt = require('jsonwebtoken');
var secret = require('../../config/secret');
var db_settings = require('../../server.js').db_settings;
var errors = require('../../config/errors');

var Ajv = require('ajv');
var schema = require('../../models/query');
var ajv = Ajv({"format": "full"});
var validate = ajv.compile(schema);

var CouchDB_Client = require('../connectors/CouchDB_Client.js');
var EnviroCar_Client = require('../connectors/EnviroCar_Client.js');
var Postgres_Client = require('../connectors/Postgres_Client.js');
var Sparql_Client = require('../connectors/Sparql_Client.js');

// POST
exports.request = function(req, res){

    // Create timestamp
    var time = Date.now();
    // Check if Header contains Access-Token
    var accessToken = "";
    Flag = true;
    if(!req.query.authorization || req.query.authorization === "") {
        if(!req.headers.authorization || req.headers.authorization === ""){
            console.log("error. no valid authorization");
            Flag = false;
        } else {
            accessToken = req.headers.authorization;
            Flag = true;
        }
    } else {
        accessToken = req.query.authorization;
        Flag = true;
    }
    if(!Flag){
       res.status(errors.authentication.error_2.code).send(errors.authentication.error_2);
       return console.error(errors.authentication.error_2.message);
    } else {
        var url = "postgres://" + db_settings.user + ":" + db_settings.password + "@" + db_settings.host + ":" + db_settings.port + "/" + db_settings.database_name;

        // Connect to Database
        pg.connect(url, function(err, client, done) {
            if (err) {
                res.status(errors.database.error_1.code).send(errors.database.error_1);
                return console.error(errors.database.error_1.message, err);
            } else {

                // Database Query
                client.query('SELECT * FROM Apps WHERE app_hash=$1;', [
                    accessToken
                ], function(err, result) {
                    done();

                    if (err) {
                        res.status(errors.database.error_2.code).send(_.extend(errors.database.error_2, err));
                        return console.error(errors.database.error_2.message, err);
                    } else {

                        // Check if App exists
                        if (result.rows.length === 0) {
                            res.status(errors.query.error_1.code).send(errors.query.error_1);
                            console.error(errors.query.error_1.message);
                        } else {
                            query = "SELECT categories.category_name, sub_datasets.sd_name, sub_datasets.sd_description, main_datasets.md_name, main_datasets.md_description, datastores.ds_type, datastores.ds_host, datastores.ds_port, datastores.db_instance, datastores.db_user, datastores.db_password, datastores.db_instance "
                            query += "FROM public.sub_datasets INNER JOIN public.main_datasets ON sub_datasets.md_id=main_datasets.md_id INNER JOIN public.datastores ON main_datasets.ds_id=datastores.ds_id INNER JOIN categories_relationships ON categories_relationships.md_id=main_datasets.md_id INNER JOIN categories ON categories.category_id=categories_relationships.category_id "
                            words = req.params.category_name.split("&");
                            var index = 1;
                            var params = [];
                            for(i in words) {
                                word = words[i].split(",");
                                if(i==0) {
                                    for(j in word) {
                                        console.log(word[j]);
                                        if(j==0) {
                                            tmp = "WHERE categories.category_name LIKE '%' || $"+index+" || '%' ";
                                            query += tmp;
                                            params.push(word[j]);
                                            index++;
                                            logCategory(client, word[j], accessToken);
                                        } else {
                                            tmp = "OR categories.category_name LIKE '%' || $"+index+" || '%' ";
                                            query += tmp;
                                            params.push(word[j]);
                                            index++;
                                            logCategory(client, word[j], accessToken);
                                        }
                                    }
                                } else {
                                    for(j in word) {
                                        if(j==0) {
                                            tmp = "AND categories.category_name LIKE '%' || $"+index+" || '%' ";
                                            query += tmp;
                                            params.push(word[j]);
                                            index++;
                                            logCategory(client, word[j], accessToken);
                                        } else {
                                            tmp = "OR categories.category_name LIKE '%' || $"+index+" || '%' ";
                                            query += tmp;
                                            params.push(word[j]);
                                            index++;
                                            logCategory(client, word[j], accessToken);
                                        }
                                    }
                                }
                            }
                            query += ";";
                            console.log(query);
                            client.query(query, params, function(err, result) {
                                if(err) {
                                    console.log(err);
                                } else {
                                    if(result.rows.length === 0) {
                                        console.log("No entry for this category");
                                        res.status(errors.query.error_3.code).send(errors.query.error_3);
                                    } else {
                                        //res.status(201).send(result.rows);
                                        var answerCount = 0;
                                        for(index in result.rows) {
                                            // Prepare Connectors
                                            var Answer = {
                                                search_tag: req.params,
                                                results: [],
                                                data: {
                                                    Rest: {
                                                        time: 0,
                                                        count: 0,
                                                        data: []
                                                    },
                                                    postgres: {
                                                        time: 0,
                                                        count: 0,
                                                        data: []
                                                    },
                                                    parliament: {
                                                        time: 0,
                                                        count: 0,
                                                        data: []
                                                    },
                                                    couchDB: {
                                                        time: 0,
                                                        count: 0,
                                                        data: []
                                                    }
                                                }
                                            }
                                            switch(result.rows[index].ds_type) {
                                                /** TODO:
                                                 * Need to get query from database, then execute
                                                 */
                                                case("POSTGRESQL"):
                                                    answerCount ++;
                                                    // PostgreSQL
                                                    _url = "postgres://" + result.rows[index].db_user + ":" + result.rows[index].db_password + "@" + result.rows[index].db_host + ":" + result.rows[index].db_port + "/" + result.rows[index].db_instance;
                                                    var postgres_Client = new Postgres_Client(url);
                                                    postgres_Client.setURL(url);
                                                    /*postgres_Client.query(result.rows[index].query_intern, [], function(_result, err) {
                                                        if(err) {
                                                            //console.log(err);
                                                            finish(res, Answers, answerCount, result.rows.length);
                                                        } else {
                                                            Result = {
                                                                preview: _result.parseRowsByColNames("Datasets").Datasets,
                                                                query: result.rows[index].query_intern,
                                                                query_description: result.rows[index].query_description,
                                                                sd_name: result.rows[index].sd_name,
                                                                sd_description: result.rows[index].sd_description,
                                                                md_name: result.rows[index].md_name,
                                                                md_description: result.rows[index].md_description
                                                            }
                                                            Answer.data.postgres.push(Result);
                                                            finish(res, Answer, answerCount, result.rows.length);
                                                        }
                                                    });*/
                                                    finish(res, Answer, answerCount, result.rows.length);
                                                    break;
                                                case("REST"):
                                                    var name = result.rows[index].sd_name;
                                                    var description = result.rows[index].sd_description;
                                                    request(result.rows[index].ds_host, function(error, response, body) {
                                                        if(!error) {
                                                            dt = {
                                                                name: name,
                                                                descritpion: description,
                                                                preview: JSON.parse(body)
                                                            }
                                                            Answer.data.Rest.data.push(dt);
                                                            Answer.data.Rest.count ++;
                                                            Answer.data.Rest.time = (Date.now()-time) / 1000 + " s";
                                                            answerCount ++;
                                                            finish(res, Answer, answerCount, result.rows.length);
                                                        } else {
                                                            console.log(error);
                                                            console.log(response);
                                                            answerCount ++;
                                                            finish(res, Answer, answerCount, result.rows.length);
                                                        }
                                                    });
                                                    break;
                                                case("COUCHDB"):
                                                    var data = result.rows[index];
                                                    var length = result.rows.length;
                                                    var name = result.rows[index].sd_name;
                                                    var description = result.rows[index].sd_description;
                                                    var couchdb_Client = new CouchDB_Client(data.ds_host, data.ds_port);
                                                    couchdb_Client.useDatabase(data.db_instance);
                                                    couchdb_Client.query(function (_result) {
                                                        dt = {
                                                            name: name,
                                                            description: description,
                                                            preview: _result
                                                        }
                                                        Answer.data.couchDB.data.push(dt);
                                                        Answer.data.couchDB.count ++;
                                                        Answer.data.couchDB.time = (Date.now()-time) / 1000 + " s";
                                                        answerCount ++;
                                                        finish(res, Answer, answerCount, length);
                                                    });
                                                    break;
                                                default:
                                                    answerCount++;
                                                    console.log("unknown Database");
                                                    console.log(result.rows[index].ds_type);
                                                    finish(res, Answer, answerCount, result.rows.length);
                                                    break;
                                            }

                                        }
                                    }
                                }
                                    /*// EnviroCar
                                    var enviroCar_Client = new EnviroCar_Client();
                                    enviroCar_Client.query("sensors", function(data) {
                                        Answer.enviroCar.time = (Date.now() - time) / 1000 + " s";
                                        Answer.enviroCar.data = data.results;
                                        answerCount += 1;
                                        finish(res, Answer, answerCount, 1);
                                    });

                                    // Parliament
                                    var sparql_Client = new Sparql_Client();
                                    sparql_Client.query("SELECT ?p ?o { <http://vocab.lodcom.de/muenster> ?p ?o }", function(result) {
                                        Answer.parliament.time = (Date.now() - time) / 1000 + " s";
                                        Answer.parliament.data = result;
                                        answerCount += 1;
                                        finish(res, Answer, answerCount, 1);
                                    });

                                    // CouchDB
                                    var couchDB_Client = new CouchDB_Client();
                                    couchDB_Client.query(function (result) {
                                        Answer.couchDB.time = (Date.now()-time) / 1000 + " s";
                                        Answer.couchDB.data = result;
                                        answerCount += 1;
                                        finish(res, Answer, answerCount, 1);
                                    });*/

                            });
                        }
                    }
                });
            }
        });
    }
};

/**
 * Check
 * @param  {number} count
 * @param  {number} maximum
 * @return {boolean} true or false
 */
var check = function (count, max) {
    if(count == max) {
        return true;
    } else {
        return false;
    }
};

/**
 * Finish
 */
var finish = function (res, Answer, answerCount, max) {
    if(check(answerCount, max)) {
        res.status(201).send(Answer);
    }
};

var logCategory = function (client, category_name, accessToken) {
    client.query("SELECT category_id FROM categories WHERE category_name LIKE '%' || $1 || '%' ", [
        category_name
    ], function (err, result) {
        if(err) {
            console.log(err);
        } else {
            if(result.rows.length == 0) {
                console.log("No Category");
            } else {
                console.log(result.rows[0].category_id);
                category_id = result.rows[0].category_id;
                client.query("INSERT INTO Logs VALUES ($1, now(), $2)", [accessToken, category_id], function (err, result) {
                    if(err) {
                        console.log(err);
                    } else {
                        //Logged the search
                    }
                });
            }
        }
    });
}
<|endoftext|>


<commit_before>var path = require('path')

var root = path.join(__dirname, '..')

var BIN = path.join(root, 'node_modules', '.bin')
var SRC = path.join(root, 'src')
var DIST = path.join(root, 'dist')

var SERVER = path.join(root, 'server.js')

var HTML_INPUT = path.join(SRC, 'index.html')
var HTML_OUTPUT = path.join(DIST, 'index.html')

var JS_FULL_NAME = 'app.js'
var JS_MIN_NAME = 'app.min.js'
var JS_INPUT_PATH = path.join(SRC, 'scripts', JS_FULL_NAME)
var JS_OUTPUT_PATH = path.join(DIST, JS_FULL_NAME)
var JS_MIN_PATH = path.join(DIST, JS_MIN_NAME)

var STATIC_NAME = 'static'

var CSS_FULL_NAME = 'style.css'
var CSS_MIN_NAME = 'style.min.css'
var CSS_DIR = path.join(DIST, STATIC_NAME, 'stylesheets')
var CSS_INPUT_PATH = path.join(CSS_DIR, CSS_FULL_NAME)
var CSS_MIN_PATH = path.join(CSS_DIR, CSS_MIN_NAME)
var CSS_FULL_RUNTIME = path.relative(DIST, CSS_INPUT_PATH)
var CSS_MIN_RUNTIME = path.relative(DIST, CSS_MIN_PATH)

module.exports = {
  BIN,
  SRC,
  DIST,

  STATIC_NAME,

  SERVER,

  HTML_INPUT,
  HTML_OUTPUT,

  JS_FULL_NAME,
  JS_MIN_NAME,
  JS_INPUT_PATH,
  JS_OUTPUT_PATH,
  JS_MIN_PATH,

  CSS_FULL_NAME,
  CSS_MIN_NAME,
  CSS_DIR,
  CSS_INPUT_PATH,
  CSS_MIN_PATH,
  CSS_FULL_RUNTIME,
  CSS_MIN_RUNTIME
}
<commit_msg>Remove SERVER env variable and fix the export order<commit_after>var path = require('path')

var root = path.join(__dirname, '..')

var BIN = path.join(root, 'node_modules', '.bin')
var SRC = path.join(root, 'src')
var DIST = path.join(root, 'dist')

var SERVER = path.join(root, 'server.js')

var HTML_INPUT = path.join(SRC, 'index.html')
var HTML_OUTPUT = path.join(DIST, 'index.html')

var JS_FULL_NAME = 'app.js'
var JS_MIN_NAME = 'app.min.js'
var JS_INPUT_PATH = path.join(SRC, 'scripts', JS_FULL_NAME)
var JS_OUTPUT_PATH = path.join(DIST, JS_FULL_NAME)
var JS_MIN_PATH = path.join(DIST, JS_MIN_NAME)

var STATIC_NAME = 'static'

var CSS_FULL_NAME = 'style.css'
var CSS_MIN_NAME = 'style.min.css'
var CSS_DIR = path.join(DIST, STATIC_NAME, 'stylesheets')
var CSS_INPUT_PATH = path.join(CSS_DIR, CSS_FULL_NAME)
var CSS_MIN_PATH = path.join(CSS_DIR, CSS_MIN_NAME)
var CSS_FULL_RUNTIME = path.relative(DIST, CSS_INPUT_PATH)
var CSS_MIN_RUNTIME = path.relative(DIST, CSS_MIN_PATH)

module.exports = {
  BIN,
  SRC,
  DIST,

  HTML_INPUT,
  HTML_OUTPUT,

  JS_FULL_NAME,
  JS_MIN_NAME,
  JS_INPUT_PATH,
  JS_OUTPUT_PATH,
  JS_MIN_PATH,

  STATIC_NAME,

  CSS_FULL_NAME,
  CSS_MIN_NAME,
  CSS_DIR,
  CSS_INPUT_PATH,
  CSS_MIN_PATH,
  CSS_FULL_RUNTIME,
  CSS_MIN_RUNTIME
}
<|endoftext|>


<commit_before>/**
 * Copyright (c) 2014, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
 * additional grant of patent rights can be found in the PATENTS file in
 * the same directory.
 */

!(function() {
  var hasOwn = Object.prototype.hasOwnProperty;
  var undefined; // More compressible than void 0.
  var iteratorSymbol =
    typeof Symbol === "function" && Symbol.iterator || "@@iterator";

  if (typeof regeneratorRuntime === "object") {
    return;
  }

  var runtime = regeneratorRuntime =
    typeof exports === "undefined" ? {} : exports;

  function wrap(innerFn, outerFn, self, tryList) {
    return new Generator(innerFn, outerFn, self || null, tryList || []);
  }
  runtime.wrap = wrap;

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed";

  // Returning this object from the innerFn has the same effect as
  // breaking out of the dispatch switch statement.
  var ContinueSentinel = {};

  // Dummy constructor functions that we use as the .constructor and
  // .constructor.prototype properties for functions that return Generator
  // objects. For full spec compliance, you may wish to configure your
  // minifier not to mangle the names of these two functions.
  function GeneratorFunction() {}
  function GeneratorFunctionPrototype() {}

  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunction.displayName = "GeneratorFunction";

  runtime.isGeneratorFunction = function(genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor
      ? ctor === GeneratorFunction ||
        // For the native GeneratorFunction constructor, the best we can
        // do is to check its .name property.
        (ctor.displayName || ctor.name) === "GeneratorFunction"
      : false;
  };

  runtime.mark = function(genFun) {
    genFun.__proto__ = GeneratorFunctionPrototype;
    genFun.prototype = Object.create(Gp);
    return genFun;
  };

  runtime.async = function(innerFn, outerFn, self, tryList) {
    return new Promise(function(resolve, reject) {
      var generator = wrap(innerFn, outerFn, self, tryList);
      var callNext = step.bind(generator.next);
      var callThrow = step.bind(generator["throw"]);

      function step(arg) {
        try {
          var info = this(arg);
          var value = info.value;
        } catch (error) {
          return reject(error);
        }

        if (info.done) {
          resolve(value);
        } else {
          Promise.resolve(value).then(callNext, callThrow);
        }
      }

      callNext();
    });
  };

  function Generator(innerFn, outerFn, self, tryList) {
    var generator = outerFn ? Object.create(outerFn.prototype) : this;
    var context = new Context(tryList);
    var state = GenStateSuspendedStart;

    function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        // Be forgiving, per 25.3.3.3.3 of the spec:
        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
        return doneResult();
      }

      while (true) {
        var delegate = context.delegate;
        if (delegate) {
          try {
            var info = delegate.iterator[method](arg);

            // Delegate generator ran and handled its own exceptions so
            // regardless of what the method was, we continue as if it is
            // "next" with an undefined arg.
            method = "next";
            arg = undefined;

          } catch (uncaught) {
            context.delegate = null;

            // Like returning generator.throw(uncaught), but without the
            // overhead of an extra function call.
            method = "throw";
            arg = uncaught;

            continue;
          }

          if (info.done) {
            context[delegate.resultName] = info.value;
            context.next = delegate.nextLoc;
          } else {
            state = GenStateSuspendedYield;
            return info;
          }

          context.delegate = null;
        }

        if (method === "next") {
          if (state === GenStateSuspendedStart &&
              typeof arg !== "undefined") {
            // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
            throw new TypeError(
              "attempt to send " + JSON.stringify(arg) + " to newborn generator"
            );
          }

          if (state === GenStateSuspendedYield) {
            context.sent = arg;
          } else {
            delete context.sent;
          }

        } else if (method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw arg;
          }

          if (context.dispatchException(arg)) {
            // If the dispatched exception was caught by a catch block,
            // then let that catch block handle the exception normally.
            method = "next";
            arg = undefined;
          }

        } else if (method === "return") {
          context.abrupt("return", arg);
        }

        state = GenStateExecuting;

        try {
          var value = innerFn.call(self, context);

          // If an exception is thrown from innerFn, we leave state ===
          // GenStateExecuting and loop back for another invocation.
          state = context.done
            ? GenStateCompleted
            : GenStateSuspendedYield;

          var info = {
            value: value,
            done: context.done
          };

          if (value === ContinueSentinel) {
            if (context.delegate && method === "next") {
              // Deliberately forget the last sent value so that we don't
              // accidentally pass it on to the delegate.
              arg = undefined;
            }
          } else {
            return info;
          }

        } catch (thrown) {
          state = GenStateCompleted;

          if (method === "next") {
            context.dispatchException(thrown);
          } else {
            arg = thrown;
          }
        }
      }
    }

    generator.next = invoke.bind(generator, "next");
    generator["throw"] = invoke.bind(generator, "throw");
    generator["return"] = invoke.bind(generator, "return");

    return generator;
  }

  Gp[iteratorSymbol] = function() {
    return this;
  };

  Gp.toString = function() {
    return "[object Generator]";
  };

  function pushTryEntry(triple) {
    var entry = { tryLoc: triple[0] };

    if (1 in triple) {
      entry.catchLoc = triple[1];
    }

    if (2 in triple) {
      entry.finallyLoc = triple[2];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry, i) {
    var record = entry.completion || {};
    record.type = i === 0 ? "normal" : "return";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryList) {
    // The root entry object (effectively a try statement without a catch
    // or a finally block) gives us a place to store values thrown from
    // locations where there is no enclosing try statement.
    this.tryEntries = [{ tryLoc: "root" }];
    tryList.forEach(pushTryEntry, this);
    this.reset();
  }

  runtime.keys = function(object) {
    var keys = [];
    for (var key in object) {
      keys.push(key);
    }
    keys.reverse();

    // Rather than returning an object with a next method, we keep
    // things simple and return the next function itself.
    return function next() {
      while (keys.length) {
        var key = keys.pop();
        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      }

      // To avoid creating an additional object, we just hang the .value
      // and .done properties off the next function object itself. This
      // also ensures that the minifier will not anonymize the function.
      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];
      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1;

        function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;

          return next;
        }

        return next.next = next;
      }
    }

    // Return an iterator with no values.
    return { next: doneResult };
  }
  runtime.values = values;

  function doneResult() {
    return { value: undefined, done: true };
  }

  Context.prototype = {
    constructor: Context,

    reset: function() {
      this.prev = 0;
      this.next = 0;
      this.sent = undefined;
      this.done = false;
      this.delegate = null;

      this.tryEntries.forEach(resetTryEntry);

      // Pre-initialize at least 20 temporary variables to enable hidden
      // class optimizations for simple generators.
      for (var tempIndex = 0, tempName;
           hasOwn.call(this, tempName = "t" + tempIndex) || tempIndex < 20;
           ++tempIndex) {
        this[tempName] = null;
      }
    },

    stop: function() {
      this.done = true;

      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;
      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },

    dispatchException: function(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;
      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;
        return !!caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          // Exception thrown outside of any try block that could handle
          // it, so set the completion value of the entire function to
          // throw the exception.
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }

          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },

    _findFinallyEntry: function(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc <= this.prev &&
            hasOwn.call(entry, "finallyLoc") && (
              entry.finallyLoc === finallyLoc ||
              this.prev < entry.finallyLoc)) {
          return entry;
        }
      }
    },

    abrupt: function(type, arg) {
      var entry = this._findFinallyEntry();
      var record = entry ? entry.completion : {};

      record.type = type;
      record.arg = arg;

      if (entry) {
        this.next = entry.finallyLoc;
      } else {
        this.complete(record);
      }

      return ContinueSentinel;
    },

    complete: function(record) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" ||
          record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = record.arg;
        this.next = "end";
      }

      return ContinueSentinel;
    },

    finish: function(finallyLoc) {
      var entry = this._findFinallyEntry(finallyLoc);
      return this.complete(entry.completion);
    },

    "catch": function(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;
          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry, i);
          }
          return thrown;
        }
      }

      // The context.catch method must only be called with a location
      // argument that corresponds to a known catch block.
      throw new Error("illegal catch attempt");
    },

    delegateYield: function(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      return ContinueSentinel;
    }
  };
})();
<commit_msg>Add try/catch helper to fix #148<commit_after>/**
 * Copyright (c) 2014, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
 * additional grant of patent rights can be found in the PATENTS file in
 * the same directory.
 */

!(function() {
  var hasOwn = Object.prototype.hasOwnProperty;
  var undefined; // More compressible than void 0.
  var iteratorSymbol =
    typeof Symbol === "function" && Symbol.iterator || "@@iterator";

  if (typeof regeneratorRuntime === "object") {
    return;
  }

  var runtime = regeneratorRuntime =
    typeof exports === "undefined" ? {} : exports;

  function wrap(innerFn, outerFn, self, tryList) {
    return new Generator(innerFn, outerFn, self || null, tryList || []);
  }
  runtime.wrap = wrap;

  // Try/catch helper to minemize deoptimizations
  var _try = function(block) {
    try {
      block();
      return undefined;
    } catch (err) {
      return err;
    }
  };

  var GenStateSuspendedStart = "suspendedStart";
  var GenStateSuspendedYield = "suspendedYield";
  var GenStateExecuting = "executing";
  var GenStateCompleted = "completed";

  // Returning this object from the innerFn has the same effect as
  // breaking out of the dispatch switch statement.
  var ContinueSentinel = {};

  // Dummy constructor functions that we use as the .constructor and
  // .constructor.prototype properties for functions that return Generator
  // objects. For full spec compliance, you may wish to configure your
  // minifier not to mangle the names of these two functions.
  function GeneratorFunction() {}
  function GeneratorFunctionPrototype() {}

  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;
  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  GeneratorFunctionPrototype.constructor = GeneratorFunction;
  GeneratorFunction.displayName = "GeneratorFunction";

  runtime.isGeneratorFunction = function(genFun) {
    var ctor = typeof genFun === "function" && genFun.constructor;
    return ctor
      ? ctor === GeneratorFunction ||
        // For the native GeneratorFunction constructor, the best we can
        // do is to check its .name property.
        (ctor.displayName || ctor.name) === "GeneratorFunction"
      : false;
  };

  runtime.mark = function(genFun) {
    genFun.__proto__ = GeneratorFunctionPrototype;
    genFun.prototype = Object.create(Gp);
    return genFun;
  };

  runtime.async = function(innerFn, outerFn, self, tryList) {
    return new Promise(function(resolve, reject) {
      var generator = wrap(innerFn, outerFn, self, tryList);
      var callNext = step.bind(generator.next);
      var callThrow = step.bind(generator["throw"]);

      function step(arg) {
        var info, value, self = this, error = _try(function() {
          info = self(arg);
          value = info.value;
        });

        if (error) {
          return reject(error);
        }

        if (info.done) {
          resolve(value);
        } else {
          Promise.resolve(value).then(callNext, callThrow);
        }
      }

      callNext();
    });
  };

  function Generator(innerFn, outerFn, self, tryList) {
    var generator = outerFn ? Object.create(outerFn.prototype) : this;
    var context = new Context(tryList);
    var state = GenStateSuspendedStart;

    function invoke(method, arg) {
      if (state === GenStateExecuting) {
        throw new Error("Generator is already running");
      }

      if (state === GenStateCompleted) {
        // Be forgiving, per 25.3.3.3.3 of the spec:
        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
        return doneResult();
      }

      while (true) {
        var delegate = context.delegate;
        if (delegate) {
          var info, uncaught = _try(function() {
            info = delegate.iterator[method](arg);

            // Delegate generator ran and handled its own exceptions so
            // regardless of what the method was, we continue as if it is
            // "next" with an undefined arg.
            method = "next";
            arg = undefined;

          })

          if (uncaught) {
            context.delegate = null;

            // Like returning generator.throw(uncaught), but without the
            // overhead of an extra function call.
            method = "throw";
            arg = uncaught;

            continue;
          }

          if (info.done) {
            context[delegate.resultName] = info.value;
            context.next = delegate.nextLoc;
          } else {
            state = GenStateSuspendedYield;
            return info;
          }

          context.delegate = null;
        }

        if (method === "next") {
          if (state === GenStateSuspendedStart &&
              typeof arg !== "undefined") {
            // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
            throw new TypeError(
              "attempt to send " + JSON.stringify(arg) + " to newborn generator"
            );
          }

          if (state === GenStateSuspendedYield) {
            context.sent = arg;
          } else {
            delete context.sent;
          }

        } else if (method === "throw") {
          if (state === GenStateSuspendedStart) {
            state = GenStateCompleted;
            throw arg;
          }

          if (context.dispatchException(arg)) {
            // If the dispatched exception was caught by a catch block,
            // then let that catch block handle the exception normally.
            method = "next";
            arg = undefined;
          }

        } else if (method === "return") {
          context.abrupt("return", arg);
        }

        state = GenStateExecuting;

        var value, thrown = _try(function() {
          value = innerFn.call(self, context);
        })

        if (!thrown) {
          // If an exception is thrown from innerFn, we leave state ===
          // GenStateExecuting and loop back for another invocation.
          state = context.done
            ? GenStateCompleted
            : GenStateSuspendedYield;

          var info = {
            value: value,
            done: context.done
          };

          if (value === ContinueSentinel) {
            if (context.delegate && method === "next") {
              // Deliberately forget the last sent value so that we don't
              // accidentally pass it on to the delegate.
              arg = undefined;
            }
          } else {
            return info;
          }

        } else {
          state = GenStateCompleted;

          if (method === "next") {
            context.dispatchException(thrown);
          } else {
            arg = thrown;
          }
        }
      }
    }

    generator.next = invoke.bind(generator, "next");
    generator["throw"] = invoke.bind(generator, "throw");
    generator["return"] = invoke.bind(generator, "return");

    return generator;
  }

  Gp[iteratorSymbol] = function() {
    return this;
  };

  Gp.toString = function() {
    return "[object Generator]";
  };

  function pushTryEntry(triple) {
    var entry = { tryLoc: triple[0] };

    if (1 in triple) {
      entry.catchLoc = triple[1];
    }

    if (2 in triple) {
      entry.finallyLoc = triple[2];
    }

    this.tryEntries.push(entry);
  }

  function resetTryEntry(entry, i) {
    var record = entry.completion || {};
    record.type = i === 0 ? "normal" : "return";
    delete record.arg;
    entry.completion = record;
  }

  function Context(tryList) {
    // The root entry object (effectively a try statement without a catch
    // or a finally block) gives us a place to store values thrown from
    // locations where there is no enclosing try statement.
    this.tryEntries = [{ tryLoc: "root" }];
    tryList.forEach(pushTryEntry, this);
    this.reset();
  }

  runtime.keys = function(object) {
    var keys = [];
    for (var key in object) {
      keys.push(key);
    }
    keys.reverse();

    // Rather than returning an object with a next method, we keep
    // things simple and return the next function itself.
    return function next() {
      while (keys.length) {
        var key = keys.pop();
        if (key in object) {
          next.value = key;
          next.done = false;
          return next;
        }
      }

      // To avoid creating an additional object, we just hang the .value
      // and .done properties off the next function object itself. This
      // also ensures that the minifier will not anonymize the function.
      next.done = true;
      return next;
    };
  };

  function values(iterable) {
    if (iterable) {
      var iteratorMethod = iterable[iteratorSymbol];
      if (iteratorMethod) {
        return iteratorMethod.call(iterable);
      }

      if (typeof iterable.next === "function") {
        return iterable;
      }

      if (!isNaN(iterable.length)) {
        var i = -1;

        function next() {
          while (++i < iterable.length) {
            if (hasOwn.call(iterable, i)) {
              next.value = iterable[i];
              next.done = false;
              return next;
            }
          }

          next.value = undefined;
          next.done = true;

          return next;
        }

        return next.next = next;
      }
    }

    // Return an iterator with no values.
    return { next: doneResult };
  }
  runtime.values = values;

  function doneResult() {
    return { value: undefined, done: true };
  }

  Context.prototype = {
    constructor: Context,

    reset: function() {
      this.prev = 0;
      this.next = 0;
      this.sent = undefined;
      this.done = false;
      this.delegate = null;

      this.tryEntries.forEach(resetTryEntry);

      // Pre-initialize at least 20 temporary variables to enable hidden
      // class optimizations for simple generators.
      for (var tempIndex = 0, tempName;
           hasOwn.call(this, tempName = "t" + tempIndex) || tempIndex < 20;
           ++tempIndex) {
        this[tempName] = null;
      }
    },

    stop: function() {
      this.done = true;

      var rootEntry = this.tryEntries[0];
      var rootRecord = rootEntry.completion;
      if (rootRecord.type === "throw") {
        throw rootRecord.arg;
      }

      return this.rval;
    },

    dispatchException: function(exception) {
      if (this.done) {
        throw exception;
      }

      var context = this;
      function handle(loc, caught) {
        record.type = "throw";
        record.arg = exception;
        context.next = loc;
        return !!caught;
      }

      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        var record = entry.completion;

        if (entry.tryLoc === "root") {
          // Exception thrown outside of any try block that could handle
          // it, so set the completion value of the entire function to
          // throw the exception.
          return handle("end");
        }

        if (entry.tryLoc <= this.prev) {
          var hasCatch = hasOwn.call(entry, "catchLoc");
          var hasFinally = hasOwn.call(entry, "finallyLoc");

          if (hasCatch && hasFinally) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            } else if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else if (hasCatch) {
            if (this.prev < entry.catchLoc) {
              return handle(entry.catchLoc, true);
            }

          } else if (hasFinally) {
            if (this.prev < entry.finallyLoc) {
              return handle(entry.finallyLoc);
            }

          } else {
            throw new Error("try statement without catch or finally");
          }
        }
      }
    },

    _findFinallyEntry: function(finallyLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc <= this.prev &&
            hasOwn.call(entry, "finallyLoc") && (
              entry.finallyLoc === finallyLoc ||
              this.prev < entry.finallyLoc)) {
          return entry;
        }
      }
    },

    abrupt: function(type, arg) {
      var entry = this._findFinallyEntry();
      var record = entry ? entry.completion : {};

      record.type = type;
      record.arg = arg;

      if (entry) {
        this.next = entry.finallyLoc;
      } else {
        this.complete(record);
      }

      return ContinueSentinel;
    },

    complete: function(record) {
      if (record.type === "throw") {
        throw record.arg;
      }

      if (record.type === "break" ||
          record.type === "continue") {
        this.next = record.arg;
      } else if (record.type === "return") {
        this.rval = record.arg;
        this.next = "end";
      }

      return ContinueSentinel;
    },

    finish: function(finallyLoc) {
      var entry = this._findFinallyEntry(finallyLoc);
      return this.complete(entry.completion);
    },

    "catch": function(tryLoc) {
      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
        var entry = this.tryEntries[i];
        if (entry.tryLoc === tryLoc) {
          var record = entry.completion;
          if (record.type === "throw") {
            var thrown = record.arg;
            resetTryEntry(entry, i);
          }
          return thrown;
        }
      }

      // The context.catch method must only be called with a location
      // argument that corresponds to a known catch block.
      throw new Error("illegal catch attempt");
    },

    delegateYield: function(iterable, resultName, nextLoc) {
      this.delegate = {
        iterator: values(iterable),
        resultName: resultName,
        nextLoc: nextLoc
      };

      return ContinueSentinel;
    }
  };
})();
<|endoftext|>


<commit_before>dojo.provide("app.src");

dojo.require("dojo.fx");
dojo.require("dojox.fx.easing");
dojo.require("dojo.parser");
dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.TabContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.form.Button");
dojo.require("dijit.form.TextBox");
dojo.require("dijit.form.ValidationTextBox");
dojo.require("dijit.form.Slider");
dojo.require("dijit.form.FilteringSelect");
dojo.require("dojox.form.DropDownSelect");
dojo.require("dojox.grid.Grid");
dojo.require("dojox.data.QueryReadStore");
dojo.require("org.ppwcode.dojo.dijit.form.PpwMasterView");
dojo.require("org.ppwcode.dojo.dojox.grid.data.model");
dojo.require("org.ppwcode.dojo.dijit.form.PpwObjectForm");
dojo.require("org.ppwcode.dojo.dijit.form.PpwCrudForm");
dojo.require("org.ppwcode.dojo.dijit.form.PpwViewFormControllerDwr");
dojo.require("org.ppwcode.dojo.dijit.form.PpwImageBox");

var fbfriendsgridview = {
        cells: [
          [
            {name: "First Name", field: "first_name", width: "8em"},
            {name: "Last Name", field: "last_name", width: "100%"}
          ]
        ]
};
var fbfriendsgridlayout = [ fbfriendsgridview ];
var fbfriendsgridmodel = new org.ppwcode.dojo.dojox.grid.data.PpwObjects();

var yourmovielistgridlayout = [
	{
		cells: [[
		         {name: "Title", field: "title", width:"100%"}
		        ]]
	}
];
var yourmovielistgridmodel = new org.ppwcode.dojo.dojox.grid.data.PpwObjects();

function formatRating(therating) {
	var result = "";
	var i = 0;
	for (i = 0; i < therating; i++) {
		result += "";
	}
	for (i = 0; i < 5 - therating; i++) {
		result += "";
	}
	return result;
}

function formatMediaType(value) {
	var mediaTypeMap = {
			OTHER: "Other",
			BLURAY: "Blu-Ray",
			DVD: "DVD",
			DIVX_XVID: "DivX/XviD"
	}
	return mediaTypeMap[value];
}

var fbfriendsmoviesgridlayout = [
  {
    cells: [[
      {name: "Title", field: "title", width:"30em"},
      {name: "Rating", field: "rating", width: "100px", formatter: formatRating},
      {name: "Media type", field: "mediaType", width: "6em", formatter: formatMediaType}
    ]]
  }
];

var fbfriendsmoviesgridmodel = new org.ppwcode.dojo.dojox.grid.data.PpwObjects();

var fbFriendFormMap = [
  { property: "pic", fieldid: "FbFriendPicture", isEditable: false},
  { property: "first_name", fieldid: "FbFriendFirstName", isEditable: false},
  { property: "last_name", fieldid: "FbFriendLastName", isEditable: false}
];

var yourMovieFormMap = [
  { property: "persistenceId", fieldid: "yourMovieIdHiddenBox", isId: true},
  { property: "persistenceVersion", fieldid: "yourMoviePersistenceVersionHiddenBox"},
  { property: "facebookUserId", fieldid: "yourFacebookUserIdHiddenBox"},
  { property: "id", fieldid: "yourMovieId"},
  { property: "mediaType", fieldid: "yourMovieMediaType" },
  { property: "rating", fieldid: "yourMovieRating" }
];

function retrieve_movies(fbuid) {
	console.log("getting movies for user " + fbuid);
	JpaMovieDaoWrapper.findByFacebookUser(fbuid,
		{
			callback: function(response) {
				console.log (response.length + " movies for user " + fbuid);
				lstYourMovies.setData(response);
			},
			errorHandler: function(errorString, exception) {
				console.error("could not get movies for user " + fbuid + ": " + errorString);
			}
		}
	);
}

var yourMovieViewFormController;

function initializeDwrControllers() {
	yourMovieViewFormController = new org.ppwcode.dojo.dijit.form.PpwViewFormControllerDwr();
	yourMovieViewFormController.dwrRetrieveFunction = JpaMovieDaoWrapper.findByFacebookUser;
    yourMovieViewFormController.dwrCreateFunction = JpaAtomicStatelessCrudDaoWrapper.createPersistentBean;
    yourMovieViewFormController.dwrUpdateFunction = JpaAtomicStatelessCrudDaoWrapper.updatePersistentBean;
    yourMovieViewFormController.configure(lstYourMovies, frmYourMovie);

    yourMovieViewFormController.beforeItemCreate = function(item) {
    	item.facebookUserId = FB.Connect.get_loggedInUser();
    }
}

function show_user() {
   var node = document.getElementById("userbox");
   node.innerHTML =
         "
"
       + "

"
       + "    "
       + "      <fb:profile-pic uid='loggedinuser' facebook-logo='true'></fb:profile-pic>"
       + "    	"
       + "      Welcome, <fb:name uid='loggedinuser' useyou='false'></fb:name>.  You are signed in with"
       + "      your facebook account."
       + "    	"
       + "

"
       + "    "
       + "      <button dojoType='dijit.form.Button' onclick='do_logout();'>logout</button>"
       + "    	"
       + "

"
       + "
"
   FB.XFBML.Host.parseDomTree();
   dojo.parser.parse(node);
}

function retrieve_friends() {
    FB.Facebook.apiClient.friends_get(null, function(result, ex) {
            FB.Facebook.apiClient.users_getInfo(result,
                                                ["pic", "first_name", "last_name"],
                                                function(result, ex) {
            fbfriendsgridmodel.setData(result);
        });
      });
}

function do_login() {
	console.log("doing login routine");
	show_user();
	retrieve_friends();
	yourMovieViewFormController.setDwrRetrieveFunctionParameters([FB.Connect.get_loggedInUser()]);
	yourMovieViewFormController.fillMasterView();
}

function do_logout() {
	console.log("doing logout routine");
    fbfriendsgridmodel.clear();
    fbFriendForm.reset();
    lstYourMovies.setData(null);
    fbfriendsmoviesgridmodel.setData(null);
    FB.Connect.logout(function() {
        var node = document.getElementById("userbox");
        node.innerHTML = "<fb:login-button onlogin='show_user();'></fb:login-button>";
        FB.XFBML.Host.parseDomTree();
    });
}

function showall() {
	setTimeout(function() {
			dojo.fadeOut({node: 'splashscreen', duration: 1000, onEnd: function() { dojo.query("#splashscreen").orphan(); }}).play();
			hideFrmYourMovie().play();
			dojo.fadeOut({node: 'fbFriendContentPane', duration: 10}).play();
		},
		20
	);
}

function showFrmYourMovie() {
	return dojo.fx.combine([
        dojo.fx.slideTo({node: "frmYourMovie", left: (0).toString(), unit: "px"}),
        dojo.fadeIn({node: "yourMoviePicture", duration: 200 }),
        dojo.fadeIn({node: "yourMovieDescription", duration: 200 }),
        dojo.fadeIn({node: "yourMovieActors", duration: 200 })
	]);
}

function hideFrmYourMovie() {
    return dojo.fx.combine([
	    dojo.fx.slideTo({node: "frmYourMovie", left: (-400).toString(), unit: "px"}),
	    dojo.fadeOut({node: "yourMoviePicture", duration: 200 }),
	    dojo.fadeOut({node: "yourMovieDescription", duration: 200 }),
	    dojo.fadeOut({node: "yourMovieActors", duration: 200 })
	]);
}

function showFriendDetails(e) {
    var user = fbfriendsgridmodel.getRow(e.rowIndex);

    /* dojo.fx.chain is buggy: http://www.dojotoolkit.org/forum/dojo-core-dojo-0-9/dojo-core-support/dojo-fx-chain-causing-multiple-errors
    dojo.fx.chain([
	      dojo.fx.combine([
	          dojo.fadeOut({node: fbFriendForm.id, duration: 250, onEnd: function() { fbFriendForm.displayItem(user) } }),
	          dojo.fx.slideTo({ node: "fbFriendContentPane", left: (1500).toString(), unit: "px", duration: 500 })
	      ]),
		  dojo.fx.combine([
              dojo.fadeIn({node: fbFriendForm.id, duration: 1500}),
              dojo.fx.slideTo({ node: "fbFriendContentPane", left: (0).toString(), unit: "px", duration: 1000, easing: dojox.fx.easing.bounceOut })
		  ])

	]).play();
	*/

    var slideOut = dojo.fx.combine([
          dojo.fadeOut({node: "fbFriendContentPane", duration: 250, onEnd: function() { fbFriendForm.displayItem(user) } }),
          dojo.fx.slideTo({ node: "fbFriendContentPane", left: (1500).toString(), unit: "px", duration: 500 })
    ]);
    var slideIn = dojo.fx.combine([
          dojo.fadeIn({node: "fbFriendContentPane", duration: 1500}),
          dojo.fx.slideTo({ node: "fbFriendContentPane", left: (0).toString(), unit: "px", duration: 1000, easing: dojox.fx.easing.bounceOut })
    ]);
    dojo.connect(slideOut, "onEnd", slideIn, 'play');
    slideOut.play();

    console.dir(user);
    JpaMovieDaoWrapper.findByFacebookUser(user.uid,
      {
        callback: function(response) {
          fbfriendsmoviesgridmodel.setData(response);
        },
        errorHandler: function(errorString, ex) {
          console.error(errorString);
        }
      }
    );

}

function showMovieImage(e) {
	var movie = yourmovielistgridmodel.getRow(e.rowIndex);

	TheOpenMovieDBUtilWrapper.getPosterThumb(movie.id, function(url) {
		yourMoviePicture.setValue(url);
	});

	TheOpenMovieDBUtilWrapper.getShortOverview(movie.id, function(description) {
		dojo.byId("yourMovieDescription").innerHTML = "
" + description + "
";
	});

	TheOpenMovieDBUtilWrapper.getMainActors(movie.id, function(actors) {
		var actorsHTML = "";
		for (var i = 0; i < actors.length; i++) {
			actorsHTML += actors[i] + "
";
		}
		dojo.byId("yourMovieActors").innerHTML = "
" + actorsHTML + "
";
	});

}

function lstYourMoviesAddButtonClick() {
	yourMoviePicture.setValue(null);
	dojo.byId("yourMovieDescription").innerHTML = "

";
	dojo.byId("yourMovieActors").innerHTML = "

";
	showFrmYourMovie().play();
}

function lstYourMoviesGridRowClick(e) {
	showMovieImage(e);
	showFrmYourMovie().play();
}

function wrapPlay(obj) {
	return function() { obj().play(); }
}

dojo.addOnLoad(function() {
	dojo.config.usePlainJson=true;
	dojo.parser.parse();
	console.info("done parsing");
	fbFriendForm.setFormMap(fbFriendFormMap);
	frmYourMovie.setFormMap(yourMovieFormMap);
	initializeDwrControllers();

	dojo.connect(lstYourMovies,"onAddButtonClick", lstYourMoviesAddButtonClick);
	dojo.connect(frmYourMovie, "onCreateModeCancelButtonClick", wrapPlay(hideFrmYourMovie));
	dojo.connect(lstYourMovies,"onGridRowClick", lstYourMoviesGridRowClick);

	dojo.connect(fbFriendsGrid, "onRowClick", showFriendDetails);

	FB.ensureInit(function() {
		console.log("before ifUserConnected");
		FB.Connect.ifUserConnected(do_login, do_logout);
		console.log("after ifUserConnected");
		showall();
	});
});
<commit_msg>Refactored frmYourMovieCreateModeCancelButtonClick<commit_after>dojo.provide("app.src");

dojo.require("dojo.fx");
dojo.require("dojox.fx.easing");
dojo.require("dojo.parser");
dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.TabContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.form.Button");
dojo.require("dijit.form.TextBox");
dojo.require("dijit.form.ValidationTextBox");
dojo.require("dijit.form.Slider");
dojo.require("dijit.form.FilteringSelect");
dojo.require("dojox.form.DropDownSelect");
dojo.require("dojox.grid.Grid");
dojo.require("dojox.data.QueryReadStore");
dojo.require("org.ppwcode.dojo.dijit.form.PpwMasterView");
dojo.require("org.ppwcode.dojo.dojox.grid.data.model");
dojo.require("org.ppwcode.dojo.dijit.form.PpwObjectForm");
dojo.require("org.ppwcode.dojo.dijit.form.PpwCrudForm");
dojo.require("org.ppwcode.dojo.dijit.form.PpwViewFormControllerDwr");
dojo.require("org.ppwcode.dojo.dijit.form.PpwImageBox");

var fbfriendsgridview = {
        cells: [
          [
            {name: "First Name", field: "first_name", width: "8em"},
            {name: "Last Name", field: "last_name", width: "100%"}
          ]
        ]
};
var fbfriendsgridlayout = [ fbfriendsgridview ];
var fbfriendsgridmodel = new org.ppwcode.dojo.dojox.grid.data.PpwObjects();

var yourmovielistgridlayout = [
	{
		cells: [[
		         {name: "Title", field: "title", width:"100%"}
		        ]]
	}
];
var yourmovielistgridmodel = new org.ppwcode.dojo.dojox.grid.data.PpwObjects();

function formatRating(therating) {
	var result = "";
	var i = 0;
	for (i = 0; i < therating; i++) {
		result += "";
	}
	for (i = 0; i < 5 - therating; i++) {
		result += "";
	}
	return result;
}

function formatMediaType(value) {
	var mediaTypeMap = {
			OTHER: "Other",
			BLURAY: "Blu-Ray",
			DVD: "DVD",
			DIVX_XVID: "DivX/XviD"
	}
	return mediaTypeMap[value];
}

var fbfriendsmoviesgridlayout = [
  {
    cells: [[
      {name: "Title", field: "title", width:"30em"},
      {name: "Rating", field: "rating", width: "100px", formatter: formatRating},
      {name: "Media type", field: "mediaType", width: "6em", formatter: formatMediaType}
    ]]
  }
];

var fbfriendsmoviesgridmodel = new org.ppwcode.dojo.dojox.grid.data.PpwObjects();

var fbFriendFormMap = [
  { property: "pic", fieldid: "FbFriendPicture", isEditable: false},
  { property: "first_name", fieldid: "FbFriendFirstName", isEditable: false},
  { property: "last_name", fieldid: "FbFriendLastName", isEditable: false}
];

var yourMovieFormMap = [
  { property: "persistenceId", fieldid: "yourMovieIdHiddenBox", isId: true},
  { property: "persistenceVersion", fieldid: "yourMoviePersistenceVersionHiddenBox"},
  { property: "facebookUserId", fieldid: "yourFacebookUserIdHiddenBox"},
  { property: "id", fieldid: "yourMovieId"},
  { property: "mediaType", fieldid: "yourMovieMediaType" },
  { property: "rating", fieldid: "yourMovieRating" }
];

function retrieve_movies(fbuid) {
	console.log("getting movies for user " + fbuid);
	JpaMovieDaoWrapper.findByFacebookUser(fbuid,
		{
			callback: function(response) {
				console.log (response.length + " movies for user " + fbuid);
				lstYourMovies.setData(response);
			},
			errorHandler: function(errorString, exception) {
				console.error("could not get movies for user " + fbuid + ": " + errorString);
			}
		}
	);
}

var yourMovieViewFormController;

function initializeDwrControllers() {
	yourMovieViewFormController = new org.ppwcode.dojo.dijit.form.PpwViewFormControllerDwr();
	yourMovieViewFormController.dwrRetrieveFunction = JpaMovieDaoWrapper.findByFacebookUser;
    yourMovieViewFormController.dwrCreateFunction = JpaAtomicStatelessCrudDaoWrapper.createPersistentBean;
    yourMovieViewFormController.dwrUpdateFunction = JpaAtomicStatelessCrudDaoWrapper.updatePersistentBean;
    yourMovieViewFormController.configure(lstYourMovies, frmYourMovie);

    yourMovieViewFormController.beforeItemCreate = function(item) {
    	item.facebookUserId = FB.Connect.get_loggedInUser();
    }
}

function show_user() {
   var node = document.getElementById("userbox");
   node.innerHTML =
         "
"
       + "

"
       + "    "
       + "      <fb:profile-pic uid='loggedinuser' facebook-logo='true'></fb:profile-pic>"
       + "    	"
       + "      Welcome, <fb:name uid='loggedinuser' useyou='false'></fb:name>.  You are signed in with"
       + "      your facebook account."
       + "    	"
       + "

"
       + "    "
       + "      <button dojoType='dijit.form.Button' onclick='do_logout();'>logout</button>"
       + "    	"
       + "

"
       + "
"
   FB.XFBML.Host.parseDomTree();
   dojo.parser.parse(node);
}

function retrieve_friends() {
    FB.Facebook.apiClient.friends_get(null, function(result, ex) {
            FB.Facebook.apiClient.users_getInfo(result,
                                                ["pic", "first_name", "last_name"],
                                                function(result, ex) {
            fbfriendsgridmodel.setData(result);
        });
      });
}

function do_login() {
	console.log("doing login routine");
	show_user();
	retrieve_friends();
	yourMovieViewFormController.setDwrRetrieveFunctionParameters([FB.Connect.get_loggedInUser()]);
	yourMovieViewFormController.fillMasterView();
}

function do_logout() {
	console.log("doing logout routine");
    fbfriendsgridmodel.clear();
    fbFriendForm.reset();
    lstYourMovies.setData(null);
    fbfriendsmoviesgridmodel.setData(null);
    FB.Connect.logout(function() {
        var node = document.getElementById("userbox");
        node.innerHTML = "<fb:login-button onlogin='show_user();'></fb:login-button>";
        FB.XFBML.Host.parseDomTree();
    });
}

function showall() {
	setTimeout(function() {
			dojo.fadeOut({node: 'splashscreen', duration: 1000, onEnd: function() { dojo.query("#splashscreen").orphan(); }}).play();
			hideFrmYourMovie().play();
			dojo.fadeOut({node: 'fbFriendContentPane', duration: 10}).play();
		},
		20
	);
}

function showFrmYourMovie() {
	return dojo.fx.combine([
        dojo.fx.slideTo({node: "frmYourMovie", left: (0).toString(), unit: "px"}),
        dojo.fadeIn({node: "yourMoviePicture", duration: 200 }),
        dojo.fadeIn({node: "yourMovieDescription", duration: 200 }),
        dojo.fadeIn({node: "yourMovieActors", duration: 200 })
	]);
}

function hideFrmYourMovie() {
    return dojo.fx.combine([
	    dojo.fx.slideTo({node: "frmYourMovie", left: (-400).toString(), unit: "px"}),
	    dojo.fadeOut({node: "yourMoviePicture", duration: 200 }),
	    dojo.fadeOut({node: "yourMovieDescription", duration: 200 }),
	    dojo.fadeOut({node: "yourMovieActors", duration: 200 })
	]);
}

function showFriendDetails(e) {
    var user = fbfriendsgridmodel.getRow(e.rowIndex);

    /* dojo.fx.chain is buggy: http://www.dojotoolkit.org/forum/dojo-core-dojo-0-9/dojo-core-support/dojo-fx-chain-causing-multiple-errors
    dojo.fx.chain([
	      dojo.fx.combine([
	          dojo.fadeOut({node: fbFriendForm.id, duration: 250, onEnd: function() { fbFriendForm.displayItem(user) } }),
	          dojo.fx.slideTo({ node: "fbFriendContentPane", left: (1500).toString(), unit: "px", duration: 500 })
	      ]),
		  dojo.fx.combine([
              dojo.fadeIn({node: fbFriendForm.id, duration: 1500}),
              dojo.fx.slideTo({ node: "fbFriendContentPane", left: (0).toString(), unit: "px", duration: 1000, easing: dojox.fx.easing.bounceOut })
		  ])

	]).play();
	*/

    var slideOut = dojo.fx.combine([
          dojo.fadeOut({node: "fbFriendContentPane", duration: 250, onEnd: function() { fbFriendForm.displayItem(user) } }),
          dojo.fx.slideTo({ node: "fbFriendContentPane", left: (1500).toString(), unit: "px", duration: 500 })
    ]);
    var slideIn = dojo.fx.combine([
          dojo.fadeIn({node: "fbFriendContentPane", duration: 1500}),
          dojo.fx.slideTo({ node: "fbFriendContentPane", left: (0).toString(), unit: "px", duration: 1000, easing: dojox.fx.easing.bounceOut })
    ]);
    dojo.connect(slideOut, "onEnd", slideIn, 'play');
    slideOut.play();

    console.dir(user);
    JpaMovieDaoWrapper.findByFacebookUser(user.uid,
      {
        callback: function(response) {
          fbfriendsmoviesgridmodel.setData(response);
        },
        errorHandler: function(errorString, ex) {
          console.error(errorString);
        }
      }
    );

}

function showMovieImage(e) {
	var movie = yourmovielistgridmodel.getRow(e.rowIndex);

	TheOpenMovieDBUtilWrapper.getPosterThumb(movie.id, function(url) {
		yourMoviePicture.setValue(url);
	});

	TheOpenMovieDBUtilWrapper.getShortOverview(movie.id, function(description) {
		dojo.byId("yourMovieDescription").innerHTML = "
" + description + "
";
	});

	TheOpenMovieDBUtilWrapper.getMainActors(movie.id, function(actors) {
		var actorsHTML = "";
		for (var i = 0; i < actors.length; i++) {
			actorsHTML += actors[i] + "
";
		}
		dojo.byId("yourMovieActors").innerHTML = "
" + actorsHTML + "
";
	});

}

function lstYourMoviesAddButtonClick() {
	yourMoviePicture.setValue(null);
	dojo.byId("yourMovieDescription").innerHTML = "

";
	dojo.byId("yourMovieActors").innerHTML = "

";
	showFrmYourMovie().play();
}

function lstYourMoviesGridRowClick(e) {
	showMovieImage(e);
	showFrmYourMovie().play();
}

function frmYourMovieCreateModeCancelButtonClick() {
	hideFrmYourMovie().play();
}

dojo.addOnLoad(function() {
	dojo.config.usePlainJson=true;
	dojo.parser.parse();
	console.info("done parsing");
	fbFriendForm.setFormMap(fbFriendFormMap);
	frmYourMovie.setFormMap(yourMovieFormMap);
	initializeDwrControllers();

	dojo.connect(lstYourMovies,"onAddButtonClick", lstYourMoviesAddButtonClick);
	dojo.connect(frmYourMovie, "onCreateModeCancelButtonClick", frmYourMovieCreateModeCancelButtonClick);
	dojo.connect(lstYourMovies,"onGridRowClick", lstYourMoviesGridRowClick);

	dojo.connect(fbFriendsGrid, "onRowClick", showFriendDetails);

	FB.ensureInit(function() {
		console.log("before ifUserConnected");
		FB.Connect.ifUserConnected(do_login, do_logout);
		console.log("after ifUserConnected");
		showall();
	});
});
<|endoftext|>