
  Basis = {};

  Basis.is_number = function (value) {

    if (value && value.match && (value.match(/([^0-9\.])/g) != null)) {

      return false;

    } // end if

    return (Basis.parse_number(value) != null) ? true : false;

  }; // end Basis.is_number()

  Basis.parse_number = function (value) {

    if (value != null) {

      if (value === 0) { return 0; } // end if
      if (value && (value.toString().replace(/([^0]+)/,"") == value.toString())) { return 0; } // end if

      var unpad = value.toString().replace(/(^[0]+)/,"");

      if (unpad.length == 0) { return null; } // end if

      var retval = (unpad.match(/\./g) ? parseFloat(unpad) : parseInt(unpad));

      return (!isNaN(retval)) ? retval : null;

    } // end if

    return null;

  }; // end Basis.parse_number()

  Basis.image_rotator = function (element, array, options) {

    /*

      argument in this format:

      element = id of image to swap with

      array( "URL",
             "URL2",
           );

    */

    var options = options ? options : {};

    var d       = MochiKit.DOM.currentDocument();

    if (d.images) {

      if (!d.preloaded_images)           { d.preloaded_images           = new Object(); } // end if
      if (!d.preloaded_images["rotate"]) { d.preloaded_images["rotate"] = new Array();  } // end if

      var fade     = options["fade"] ? true : false;
      var duration = options["duration"] ? options["duration"] : 2000;

      var index = d.preloaded_images["rotate"].length;
      var obj   = MochiKit.DOM.getElement(element);

      d.preloaded_images["rotate"][index]    = new Array();
      d.preloaded_images["rotate"][index][0] = element;

      if (obj) {

        if (fade) {

          var image_dimensions = MochiKit.Style.getElementDimensions(obj);

          if ((image_dimensions.w == 0) && (image_dimensions.h == 0)) {

            image_dimensions = {"w" : obj.width,
                                "h" : obj.height};

          } // end if

          if ((image_dimensions.w == 0) && (image_dimensions.h == 0)) {

            image_dimensions = {"w" : obj.style.width.toString().replace("px", ""),
                                "h" : obj.style.height.toString().replace("px", "")};

          } // end if

          var layer_a   = DIV({"style" : "position: absolute; top: 0px; left: 0px; display: none;"});
          var layer_b   = DIV({"style" : "position: absolute; top: 0px; left: 0px; display: none;"});
          var container = DIV({"style" : "overflow: hidden; position: relative;"});
          var obj_b     = IMG({"src" : obj.src});

          MochiKit.Style.setElementDimensions(container, image_dimensions);
          MochiKit.Style.setElementDimensions(layer_a, image_dimensions);
          MochiKit.Style.setElementDimensions(layer_b, image_dimensions);
          MochiKit.Style.setElementDimensions(obj_b, image_dimensions);

          MochiKit.Style.setOpacity(layer_a, 100);
          MochiKit.Style.setOpacity(layer_b, 0);

          obj.parentNode.insertBefore(container, obj);

          layer_a.appendChild(obj);
          layer_b.appendChild(obj_b);

          container.appendChild(layer_a);
          container.appendChild(layer_b);
 
          layer_a.style.display = "";
          layer_b.style.display = "";

        } // end if

        for (var i in array) {

          var idx = d.preloaded_images["rotate"][index].length;

          d.preloaded_images["rotate"][index][idx]     = new Image();
          d.preloaded_images["rotate"][index][idx].src = array[i];

          if (!Basis.is_number(i)) {

            d.preloaded_images["rotate"][index][idx].HREF = i;

          } // end if

        } // end for

        if (fade) {

          obj.rotate = MochiKit.Base.bind(function (index, idx) {

            var d = MochiKit.DOM.currentDocument();

            var current_image = (this.layer_a.style.display == "none") ? this.image_b : this.image_a;
            var swap_to_image = (current_image == this.image_a) ? this.image_b : this.image_a;

            if (d.preloaded_images["rotate"][index][idx] && d.preloaded_images["rotate"][index][idx].src) {

              swap_to_image.src  = d.preloaded_images["rotate"][index][idx].src;

              if (d.preloaded_images["rotate"][index][idx].HREF && getElement("clicker")) {

                getElement("clicker").parentNode.href = d.preloaded_images["rotate"][index][idx].HREF;

              } // end if

              MochiKit.Visual.fade(current_image.parentNode, 0, {"duration" : 0.50, "afterFinish" : MochiKit.Base.bind(function () { this.style.display = "none"; }, current_image)});
              MochiKit.Visual.appear(swap_to_image.parentNode, 100, {"duration" : 0.50, "afterFinish" : MochiKit.Base.bind(function () { this.style.display = ""; }, swap_to_image)});

            } // end if

            var max = d.preloaded_images["rotate"][index].length;

            if (idx == (max - 1)) {

              var nidx = 1;

            } else {

              var nidx = idx + 1;

            } // end if

            setTimeout(("MochiKit.DOM.getElement('"+ this.element.id +"').rotate("+ index +","+ nidx +");"), duration);

          }, {"element" : obj,
              "layer_a" : layer_a,
              "layer_b" : layer_b,
              "image_a" : obj,
              "image_b" : obj_b}); // end rotate()

        } else {

          obj.rotate = function (index, idx) {

            var element = MochiKit.DOM.getElement(d.preloaded_images["rotate"][index][0]);

            if (element) {

              if (d.preloaded_images["rotate"][index][idx] && d.preloaded_images["rotate"][index][idx].src) {

                element.src = d.preloaded_images["rotate"][index][idx].src;

                if (d.preloaded_images["rotate"][index][idx].HREF && getElement("clicker")) {

                  getElement("clicker").parentNode.href = d.preloaded_images["rotate"][index][idx].HREF;

                } // end if

              } // end if

              var max = d.preloaded_images["rotate"][index].length;

              if (idx == (max-1)) {

                var nidx = 1;

              } else {

                var nidx = idx+1;

              } // end if

              setTimeout(("MochiKit.DOM.getElement('"+ element.id +"').rotate("+ index +","+ nidx +");"), duration);

            } // end if

          }; // end rotate()

        } // end if

        if (d.preloaded_images["rotate"][index].length > 1) {

          obj.rotate(index, 1);

        } // end if

        return container;

      } // end if

    } // end if

  }; // end Basis.image_rotator()
  
  Basis.preserve_url = function (options) {

    /* just_keys, original_url, keys_add, force_https, force_http */

    var options      = (options && (Basis.array_length(options) > 0)) ? options : {};

    var just_keys    = options["just_keys"]    ? options["just_keys"]    : false;
    var original_url = options["original_url"] ? options["original_url"] : null;
    var keys_add     = options["keys_add"]     ? options["keys_add"]     : {};
    var force_https  = options["force_https"]  ? options["force_https"]  : false;
    var force_http   = options["force_http"]   ? options["force_http"]   : false;

    if (original_url == "clear") {

      original_url = null;

    } // end if

    var url      = original_url ? original_url.split("?")[0] : ("" + window.location + "").split("?")[0];
    var split    = url.split(":");
    var protocol = split[0];

    protocol     = (force_http ? "http" : (force_https ? "https" : "http"));

    original_url = original_url ? original_url : ("" + window.location + "");

    original_url = original_url.split("?");
    original_url = original_url[1] ? original_url[1] : "";
    original_url = original_url.split("&");

    var ourl     = {};

    if (original_url.length > 0) {

      for (var i in original_url) {

        if (typeof(original_url[i]) != "function") {

          var qitem = original_url[i];

          var titem = qitem.split("=");

          if (titem[0] && titem[1]) {

            ourl[titem[0]] = titem[1];

          } // end if

        } // end if

      } // end for

    } // end if

    for (var i in keys_add) {

      if (typeof(keys_add[i]) != "function") {

        var key   = i;
        var value = keys_add[i];

        if (value || (value == 0)) {

          ourl[key] = value;

         } else {

          if (ourl[key]) {

            delete ourl[key];

          } // end if

        } // end if

      } // end if

    } // end foreach

    original_url = url;

    if (original_url.substring(original_url.length - 1, 1) != "?") {

      original_url += "?";

    } // end if

    keys = "";

    for (var i in ourl) {

      if (typeof(ourl[i]) != "function") {

        var key   = i;
        var value = ourl[i];

        if (value || (value == 0)) {

          keys += (key + "=" + value + "&");

        } // end if

      } // end if

    } // end foreach

    if (just_keys) {

      return keys;

    } // end if

    original_url += keys;

    return original_url.substring(0, (original_url.length - 1));

  }; // end Basis.preserve_url()

  Basis.preserve_url_path = function () {

    var url = Basis.preserve_url().split("?")[0];
    url     = url.split("/");

    delete url[url.length - 1];

    url     = url.join("/");
    url     = url.substring(0, url.length - 1);

    return url;

  }; // end Basis.preserve_url_path()

