// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

// Verify callbacks ran
var jsonp_flag = 0;

// Callbacks
function jsonp_no_chunk(doc) {
  T(jsonp_flag == 0);
  T(doc._id == "0");
  jsonp_flag = 1;
}

function jsonp_chunk(doc) {
  T(jsonp_flag == 0);
  T(doc.total_rows == 1);
  jsonp_flag = 1;
}

// Do some jsonp tests.
couchTests.jsonp = function(debug) {
  var db_name = get_random_db_name();
  var db = new CouchDB(db_name, {"X-Couch-Full-Commit":"false"});
  db.createDb();
  if (debug) debugger;
  
  var doc = {_id:"0",a:0,b:0};
  T(db.save(doc).ok);
  
  // callback param is ignored unless jsonp is configured
  var xhr = CouchDB.request("GET", "/" + db_name + "/0?callback=jsonp_not_configured");
  JSON.parse(xhr.responseText);

  run_on_modified_server(
    [{section: "httpd",
      key: "allow_jsonp",
      value: "true"}],
  function() {

    // Test unchunked callbacks.
    var xhr = CouchDB.request("GET", "/" + db_name + "/0?callback=jsonp_no_chunk");
    TEquals("application/javascript", xhr.getResponseHeader("Content-Type"));
    T(xhr.status == 200);
    jsonp_flag = 0;
    eval(xhr.responseText);
    T(jsonp_flag == 1);
    xhr = CouchDB.request("GET", "/" + db_name + "/0?callback=foo\"");
    T(xhr.status == 400);

    // Test chunked responses
    var doc = {_id:"1",a:1,b:1};
    T(db.save(doc).ok);

    var designDoc = {
      _id:"_design/test",
      language: "javascript",
      views: {
        all_docs: {map: "function(doc) {if(doc.a) emit(null, doc.a);}"}
      }
    };
    T(db.save(designDoc).ok);

    var url = "/" + db_name + "/_design/test/_view/all_docs?callback=jsonp_chunk";
    xhr = CouchDB.request("GET", url);
    TEquals("application/javascript", xhr.getResponseHeader("Content-Type"));
    T(xhr.status == 200);
    jsonp_flag = 0;
    eval(xhr.responseText);
    T(jsonp_flag == 1);
    xhr = CouchDB.request("GET", url + "\'");
    T(xhr.status == 400);
  });

  // cleanup
  db.deleteDb();
};
