/*
 * $Id: nzski_2011.js,v 1.1 2011-04-10 22:41:47 han Exp $j
 */

$j = jQuery.noConflict();

var nzski = (function($j) {

  var utils = (function() {
    var covers = [];

    function cover_field(id, text, parent, cover) {
      var field = $j(id);
      parent = parent || $j("body");

      var shouldReposition = !cover;

      if (!cover) {
        cover = $j("<div>").css({
          position : "absolute",
          width : field.width(),
          height : field.height(),
          fontSize : "8pt",
          lineHeight : 2.4,
          padding : "0px 10px",
          cursor : "text",
          color : "#999"
        }).addClass("field_cover");
      }

      if (text)
        cover.text(text);

      if (shouldReposition) {
        covers.push(function() {
          if (field.css("position") == "absolute") {
            cover.css({
              top : field.css("top"),
              left : field.css("left"),
              marginLeft : field.css("marginLeft")
            });
          } else {
            cover.css({
              top : field.offset().top,
              left : field.offset().left
            });
          }
        });
      }

      function focus() {
        cover.hide();
        field[0].focus();
      }

      cover.click(focus);
      field.click(focus).focus(focus);
      field.blur(function() {
        if (!field.val())
          cover.show();
      });

      if (field.val())
        cover.hide();

      parent.append(cover);
    }

    function position() {
      $j(covers).each(function() {
        var f = this;
        f();
      });
    }

    $j(window).resize(position);

    return {
      cover_field : cover_field,
      reposition_covers : position
    };
  })();

  /* make sure the backgrounds are positioned correctly */
  function resize_content() {    
    $j("#backgrounds").css("height", $j(document).height() + "px");

    $j("#backgrounds .br, #backgrounds .bl")[$j(document).height() <= 1230 ? "hide"
        : "show"]();

    $j("body")[$j(window).height() < 650 ? "addClass" : "removeClass"]("short");
  }

  /* login form animation */
  function open_session() {
    var session = $j("#session");
    if (session.hasClass("open") || session.hasClass("opening")
        || session.hasClass("closing"))
      return;

    session.addClass("opening");

    session.find(".controls").first().animate({
      width : 328
    }, {
      duration : 500,
      complete : function() {
        session.removeClass("opening");
        session.addClass("open");
      }
    });
    session.find(".login").fadeOut();
    $j("#masthead .options.purchase h2 span").fadeOut();
    $j("#session .arrow, #session-extra").fadeIn();
    $j("#session input, #session .cover_container").fadeIn("slow");
  }

  function close_session() {
    var session = $j("#session");
    if (!session.hasClass("open"))
      return;

    session.removeClass("open");
    session.addClass("closing");

    session.find(".controls").first().animate({
      width : 47
    }, {
      duration : 500,
      complete : function() {
        session.removeClass("closing");
      }
    });
    session.find(".login").fadeIn();
    $j("#masthead .options.purchase h2 span").fadeIn();
    $j("#session input, #session .cover_container, #session-extra").fadeOut();
    $j("#session .arrow").fadeOut("fast");
  }

  function toggle_session() {
    var session = $j("#session");
    if (session.hasClass("open")) {
      close_session();
    } else if (!(session.hasClass("opening") || session.hasClass("closing"))) {
      open_session();
    }
  }

  // menu
  var menu = {
    timeout : 0,

    open : function(e) {
      var menu = $j("#masthead .purchase .menu");
      if (menu.is(":hidden")) {
        menu.slideDown(150);
      }

      clearTimeout(this.timeout);
      if (e)
        e.stopImmediatePropagation();
      return false;
    },

    close : function(e) {
      this.timeout = setTimeout(function() {
        var menu = $j("#masthead .purchase .menu");
        if (!menu.is(":hidden")) {
          menu.slideUp(150);
        }
      }, 200);
      if (e)
        e.stopImmediatePropagation();
      return false;
    }
  };

  function getter(key) {
    return function() {
      return this[key];
    };
  }

  /* visiting the tarpit to create a lazy list that cycles */
  function cycle_list(array) {
    var first = {
      head : array[0],
      tail : null
    };
    var previous = first;
    var current = null;

    for ( var i = 1, j = array.length; i < j; i++) {
      current = {
        head : array[i]
      };

      previous.tail = (function(current) {
        return function() {
          return current;
        };
      })(current);
      previous = current;
    }
    previous.tail = function() {
      return first;
    };
    return first;
  }

  function lazy_to_array(lazy, n) {
    var a = [];
    while (n-- > 0 && lazy) {
      a.push(lazy.head);
      lazy = lazy.tail();
    }
    return a;
  }

  function showUserInfo(username, verticalMeters) {
    $j("body").addClass("loggedin");
    var meters = verticalMeters ? verticalMeters : "0";
    $j("#user_info").html("Your vertical metres:<br/>" + meters + " m");
    $j("#session-extra .profile").prepend("Welcome " + username);
  }

  function getUserInfo() {
    $j.getJSON(window.mypassUrl + "/spring/nzski/jsonHeader?callback=?", function(data) {
      showUserInfo(data.User, data.Vertical);
    });
  }

  // onready handlers and event registration

  $j(function() {
    resize_content();

    var cover_container = $j("<div class=\"cover_container\">").hide();
    $j("#session .controls").append(cover_container);
    utils.cover_field("#session input[type=text]", "Username", cover_container,
        $j("<div>Username</div>").addClass("cover_username").css({
          position : "absolute",
          zIndex : 1000,
          fontSize : "8pt",
          left : "135px",
          lineHeight : "38px"
        }));
    utils.cover_field("#session input[type=password]", "Password",
        cover_container, $j("<div>Password</div>").addClass("cover_password")
            .css({
              position : "absolute",
              zIndex : 1000,
              fontSize : "8pt",
              left : "295px",
              lineHeight : "38px"
            }));

    if ($j("#mypass form:not(.getStarted)").length > 0) {
      utils.cover_field("#mypass form:not(.getStarted) input[type=text]", null,
          $j("#mypass form:not(.getStarted)"), $j("<div>Username</div>")
              .addClass("cover_email"));
      utils.cover_field("#mypass form:not(.getStarted) input[type=password]",
          null, $j("#mypass form:not(.getStarted)"), $j("<div>Password</div>")
              .addClass("cover_password"));
    }

    utils.reposition_covers();

    $j("#session .mypass, #session .login").click(toggle_session);

    getUserInfo();
    
    $j("#masthead .purchase").mouseover(function(e) {
      return menu.open(e);
    }).mouseout(function(e) {
      return menu.close(e);
    });

  });

  $j(window).resize(resize_content);
  $j(window).load(resize_content);

  return {};
})($j.sub());

