//
// Jala Project [http://opensvn.csie.org/traccgi/jala]
//
// Copyright 2004 ORF Online und Teletext GmbH
//
// 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.
//
// $Revision$
// $LastChangedBy$
// $LastChangedDate$
// $HeadURL$
//

/**
 * Construct different collections as basis for the tests
 */
// 1. ArrayList
var arrayList = new jala.ListRenderer.ArrayList((function() {
   var coll = [];
   for (var i=0; i<19; i++) {
      coll[i] = {id: i, title: "Object Nr. " + i};
   }
   return coll;
})());

// 2. HopObject
var hopObject = new HopObject();
var obj;
for (var i=0; i<19; i++) {
   obj = new HopObject();
   obj.title = "HopObject Nr. " + i;
   hopObject.add(obj);
}

// 3. Array
var array = [];
for (var i=0; i<19; i++) {
   array[i] = {id: i, title: "Object Nr. " + i};
}

/**
 * Test constructor
 */
var testConstructor = function() {
   // should throw an exception when called without or with invalid arguments
   assertThrows(function() {
      new jala.ListRenderer(true);
   });
   assertThrows(function() {
      new jala.ListRenderer();
   });
   // test constructor with arrayList
   var list = new jala.ListRenderer(arrayList);
   assertEqual(list.getCollection(), arrayList);
   // test constructor with hopObjectCollection
   list = new jala.ListRenderer(hopObject);
   assertEqual(list.getCollection(), hopObject);
   // test constructor with an array
   list = new jala.ListRenderer(array);
   assertEqual(list.getCollection().constructor, jala.ListRenderer.ArrayList);

   // test backwards compatibility
   var listParam = {
      collection: hopObject,
      href: "http://localhost/test",
      urlParams: "one=two&three=four",
      urlParamName: "seite",
      itemsPerPage: 5,
      maxPages: 3,
      itemSkin: "preview",
   };
   var list = new jala.ListRenderer(listParam);
   assertEqual(list.getCollection(), listParam.collection);
   assertEqual(list.getBaseHref(), listParam.href);
   assertEqual(list.getUrlParameters(), listParam.urlParams);
   assertEqual(list.getUrlParameterName(), listParam.urlParamName);
   assertEqual(list.getPageSize(), listParam.itemsPerPage);
   assertEqual(list.getMaxPages(), listParam.maxPages);
   assertEqual(list.getItemSkin(), listParam.itemSkin);
   return;
};

/**
 * Test the calculation of the page number under various circumstances
 */
var testPageCalculation = function() {
   var list = new jala.ListRenderer(arrayList);
   list.setPageSize(3);
   assertEqual(list.getTotalPages(), 7);
   // after setting maxPages, getTotalPages() should return this value
   list.setMaxPages(3);
   assertEqual(list.getTotalPages(), 3);
   return;
};

/**
 * Test the start and end index calculation 
 */
var testIndexCalculation = function() {
   var list = new jala.ListRenderer(arrayList);
   list.setPageSize(5);
   req.data.page = "456";
   assertEqual(list.getStartIndex(), 15);
   assertEqual(list.getEndIndex(), 18);
   // test the appropriate macros too
   assertEqual(list.currentStart_macro(), 16);
   assertEqual(list.currentEnd_macro(), 19);
   assertEqual(list.size_macro(), 19);
   // limit the number of pages - the size_macro() should return the correct value
   list.setMaxPages(2);
   assertEqual(list.size_macro(), 10);
   // reset req.data.page
   delete req.data.page;
   return;
};

/**
 * Test the construction of page hrefs
 */
var testHrefs = function() {
   var baseHref = "http://localhost/test/list";
   var list = new jala.ListRenderer(arrayList);
   list.setBaseHref(baseHref);
   assertEqual(list.getBaseHref(), baseHref);
   // getPageHref without argument should return the href of the first page
   assertEqual(list.getPageHref(), baseHref + "?page=1");
   // tweak req.data to simulate a request for a certain page
   req.data.page = "2";
   assertEqual(list.getPageHref(), baseHref + "?page=2");
   // getPageHref with page number as argument
   assertEqual(list.getPageHref(10), baseHref + "?page=10");
   // invalid page arguments
   req.data.page = "nada";
   assertEqual(list.getPageHref(), baseHref + "?page=1");
   // for page numbers < 0 return the href of the first page
   req.data.page = "-10";
   assertEqual(list.getPageHref(), baseHref + "?page=1");
   // for page numbers exceeding the max. number of pages, return
   // the href of the last page
   req.data.page = "300";
   assertEqual(list.getPageHref(), baseHref + "?page=2");
   
   // now test changing the page url parameter name
   list.setUrlParameterName("seite");
   assertEqual(list.getPageHref(2), baseHref + "?seite=2"); 

   // add additional url parameters
   var params = "one=two&three=four";
   list.setUrlParameters(params);
   assertEqual(list.getPageHref(3), baseHref + "?" + params + "&seite=3");

   // reset req.data.page
   delete req.data.page;
   return;
};

/**
 * Test custom renderer
 */
var testRenderer = function() {
   // a pseudo renderer to check if overriding default renderer works
   var renderer = {
      "list": {
         "custom": function() {
            return;
         },
         "default": function() {
            return;
         },
      },
   };

   // use default renderer
   var list = new jala.ListRenderer(arrayList);
   assertEqual(list.getRenderFunction("list"),
               jala.ListRenderer.defaultRenderer.list["default"]);
   assertEqual(list.getRenderFunction("list", "nonexisting"),
               jala.ListRenderer.defaultRenderer.list["default"]);
   assertNull(list.getRenderFunction("nonexisting"));

   // use custom renderer
   list = new jala.ListRenderer(arrayList, renderer);
   assertEqual(list.getRenderFunction("list", "custom"), renderer.list["custom"]);
   assertEqual(list.getRenderFunction("list", "nonexisting"), renderer.list["default"]);
   assertEqual(list.getRenderFunction("list"), renderer.list["default"]);
   return;
};