

/**
 * CbJSPForms.js
 *
 * Copyright(C)2006 Apictura, LLC.
 */

// Browser and OS determination because fonts and
// rendering are slightly different
var ie = (/MSIE/i.test(navigator.userAgent));
var safari = (/safari/i.test(navigator.userAgent));
var lin = (/Linux/i.test(navigator.userAgent));
var ie7 = (/MSIE 7/i.test(navigator.userAgent));

var globalFormObjs = new Object;

// Height adjustments for linux/windows/firefox/ie
// Legend: linff, winff, winie
globalFormObjs.height = new Object;
globalFormObjs.height['text'] = new Array (-1, -2, -2);
globalFormObjs.height['password'] = new Array (-1, -2, -2);
globalFormObjs.height['textarea'] = new Array (-2, -2, -2);
globalFormObjs.height['select-one'] = new Array (1, 0, 1);

globalFormObjs.addElemType = function(type) {
  var tmp = document.body.getElementsByTagName(type);
  if (safari) { return; }
  for (var i=0; i<tmp.length; i++) {
    if (tmp[i].type.match(/select/) || tmp[i].type.match("text") || tmp[i].type.match("password")) {
      globalFormObjs.domElems.push(tmp[i]);

      // Track the highest form element, to
      // set focus when the page is loaded
      var y = getPosition(tmp[i]).y;
      if (typeof y == 'number' &&
          globalFormObjs.topElem.y > y &&
          !tmp[i].disabled &&
          tmp[i].parentNode.style.display != "none") {
        globalFormObjs.topElem.obj = tmp[i];
        globalFormObjs.topElem.y = y;
      }
    }
  }
}

function _initForms() {
  if (safari) { return; }
  globalFormObjs.bkg_ina_rgb = new Array (234, 235, 236);
  globalFormObjs.bkg_hov_rgb = new Array (234, 235, 242);
  globalFormObjs.bkg_foc_rgb = new Array (240, 241, 242);

  globalFormObjs.border_ina_rgb = new Array (204, 200, 216);
  globalFormObjs.border_hov_rgb = new Array (164, 180, 190);
  globalFormObjs.border_foc_rgb = new Array (67, 167, 240);

  // Get all select and input elements
  globalFormObjs.domElems = new Array;
  globalFormObjs.topElem = new Object;
  globalFormObjs.topElem.y = 99999;
  globalFormObjs.addElemType("select");
  globalFormObjs.addElemType("input");
  globalFormObjs.addElemType("textarea");

  // Setup the form elements for glowing
  for (var i=0; i<globalFormObjs.domElems.length; i++) {
    globalFormObjs.domElems[i].hasFocus = 0;
    globalFormObjs.domElems[i].hasHover = 0;
    if (globalFormObjs.domElems[i].type=="textarea") {
      globalFormObjs.domElems[i].origHeight = 140;
    } else if (globalFormObjs.domElems[i].type.match(/select/)) {
      globalFormObjs.domElems[i].origHeight = 19;
    } else {
      globalFormObjs.domElems[i].origHeight = 19;
    }
    globalFormObjs.domElems[i].bkg_tgt_rgb = globalFormObjs.bkg_ina_rgb;
    globalFormObjs.domElems[i].bkg_cur_rgb = globalFormObjs.bkg_ina_rgb.slice(0,3);
    globalFormObjs.domElems[i].border_tgt_rgb = globalFormObjs.border_ina_rgb;
    globalFormObjs.domElems[i].border_cur_rgb = globalFormObjs.border_ina_rgb.slice(0,3);

    globalFormObjs.domElems[i].bakonfocus = globalFormObjs.domElems[i].onfocus;
    globalFormObjs.domElems[i].bakonblur = globalFormObjs.domElems[i].onblur;

    globalFormObjs.domElems[i].onfocus = function () {
           if (typeof this.bakonfocus=='function') { this.bakonfocus(); }
           this.hasFocus = 1;
        };
    globalFormObjs.domElems[i].onblur = function () {
           if (typeof this.bakonblur=='function') { this.bakonblur(); }
           this.hasFocus = 0;
        };
    globalFormObjs.domElems[i].onmouseover = function () { this.hasHover = 1; };
    globalFormObjs.domElems[i].onmouseout = function () { this.hasHover = 0; };
  }

  // Set the highest element focus
  if (globalFormObjs.topElem) {
    if (globalFormObjs.topElem.obj) {
      if (typeof globalFormObjs.topElem.obj.focus == 'function' || ie) {
        setTimeout(function() { document.body.focus(); }, 10);
        setTimeout(function() { globalFormObjs.topElem.obj.focus(); }, 100);
      }
    }
  }

  // Kick off the handler
  setTimeout("handleFormObjs()", 50);
}

function objResize(s, i, q) {
  //if (safari) { return; }
  //var domElems = globalFormObjs.domElems;
  //var t = globalFormObjs.height[globalFormObjs.domElems[i].type];
  //domElems[i].style.height = (globalFormObjs.domElems[i].origHeight + s*t[(1-lin)+ie])+"px";
  //
  //if (s==0) {
  //  domElems[i].style.borderWidth = "1px";
  //  domElems[i].style.top = "0px";
  //} else {
  //  domElems[i].style.borderWidth = "2px";
  //  domElems[i].style.top = "-2px";
  //}
}

function handleFormObjs() {
  if (safari) { return; }
  var domElems = globalFormObjs.domElems;
  for (var i=0; i<domElems.length; i++) {
    styleControl(domElems[i], i);
  }

  setTimeout("handleFormObjs()", 50);
}

function styleControl(obj, i) {

    // Get new targets
    if (obj.hasFocus) {

      // Don't stylize the select boxes in IE - it causes
      // them to glitch focus and close the select menu
      if (ie && obj.type.match(/select/)) { return; }

      obj.bkg_tgt_rgb = globalFormObjs.bkg_foc_rgb;
      obj.border_tgt_rgb = globalFormObjs.border_foc_rgb;
      objResize(1, i);
    } else if (obj.hasHover) {
      obj.bkg_tgt_rgb = globalFormObjs.bkg_hov_rgb;
      obj.border_tgt_rgb = globalFormObjs.border_hov_rgb;
      objResize(0, i);
    } else {
      obj.bkg_tgt_rgb = globalFormObjs.bkg_ina_rgb;
      obj.border_tgt_rgb = globalFormObjs.border_ina_rgb;
      obj.style.borderWidth = "1px";
      obj.style.top = "0px";
      objResize(0, i);
    }

    // Update colors
    var rgbc1 = obj.bkg_cur_rgb;
    var rgbt1 = obj.bkg_tgt_rgb;
    var rgbc2 = obj.border_cur_rgb;
    var rgbt2 = obj.border_tgt_rgb;
    var rate = 0.7;
    for (var j=0; j<3; j++) {
      rgbc1[j] = rate*rgbc1[j]+(1-rate)*rgbt1[j];
      rgbc2[j] = rate*rgbc2[j]+(1-rate)*rgbt2[j];
    }
    // Debug: obj.value = "rgb("+rgbc1[0]+","+rgbc1[1]+","+rgbc1[2]+")";

    // Set styles
    if (!obj.disabled) {
      obj.style.backgroundColor = "rgb("+Math.floor(rgbc1[0])+","+Math.floor(rgbc1[1])+","+Math.floor(rgbc1[2])+")";
      obj.style.borderColor = "rgb("+Math.floor(rgbc2[0])+","+Math.floor(rgbc2[1])+","+Math.floor(rgbc2[2])+")";
    }


}


function getPosition(obj) {
  var left = 0;
  var top = 0;
  if (obj.offsetParent) {
    left = obj.offsetLeft;
    top = obj.offsetTop;
    while (obj = obj.offsetParent) {
      left += obj.offsetLeft;
      top += obj.offsetTop;
    }
  }
  return { x: left, y: top};
}

function getStyleInt(obj, param) {
  var tmp = obj.style[param];
  tmp = tmp.replace(/px/, '');
  return (tmp/1.0);
}


function _reg_page(y, m, d) {
  var rf = document.getElementById('reg_form');
  var elems = new Object;
  var items = new Array ('nickname', 'pass1', 'pass2', 'security_question', 'security_answer', 'birth_month', 'birth_day', 'age', 'location', 'gender_f', 'gender_m', 'birth_date', 'register');

  // Populate elems
  for (var i in items) {
    elems[items[i]] = document.getElementById(items[i]);
  }

  // Populate birth_date from birth month and day and age
  var month = elems['birth_month'].value;
  var theAge = elems['age'].value;
  var day = elems['birth_day'].value;
  var year = 0;
  if (month >=0 && day > 0) {
    if (theAge > 1900) {
      // They probably entered year for age
      elems['birth_date'].value = theAge+"-"+(month*1.0+1)+"-"+day;
    } else {
      if (m > month) {
        // Already had a birthday this year
        year = y-theAge;
      } else if (month == m && d >= day) {
        // Already had a birthday this year - it was this month!
        year = y-theAge;
      } else {
        // No birthday yet this year
        year = y-theAge-1;
      }
      elems['birth_date'].value = year+"-"+(month*1.0+1)+"-"+day;
    }
  }



  var errBubble = function(obj, txt) {
    obj.focus();

    var pos = findXY(obj);
    var msg = new CbMessage(txt, pos[0]+15, pos[1]-10, 2, 5);
    msg.msgBox.setOpacity(0);
    msg.msgBox.show();

    setTimeout(function() { fadeTo(msg.msgBox.container, 1, .5); }, 150);

    obj.oldkd = obj.onkeydown;
    obj.oldclk = obj.onclick;

    obj.onkeydown = function() {
      msg.goodbye();
      this.onkeydown = obj.oldkd;
      this.onclick = obj.oldclk;
    }

    obj.onclick = function() {
      msg.goodbye();
      this.onclick = obj.oldclk;
      this.onkeydown = obj.oldkd;
    }

    obj.bob = obj.onblur;
    obj.onblur = function() {
      if (typeof obj.bob == 'function') {
        obj.bob();
        obj.onblur = obj.bob;
        obj.bob = null;
      }
      msg.goodbye();
      this.onclick = obj.oldclk;
      this.onkeydown = obj.oldkd;
    }
  }


  // Check nickname special chars, no space at beginning or end
  if (/[\'\"]/i.test(elems['nickname'].value)) {
    errBubble(elems['nickname'], "You may not use quotes (' or \") in your nickname.");
    return;
  }
  if (/[:]/i.test(elems['nickname'].value)) {
    errBubble(elems['nickname'], "You may not use colon (:) in your nickname.");
    return;
  }
  if (/[,]/i.test(elems['nickname'].value)) {
    errBubble(elems['nickname'], "You may not use comma (,) in your nickname.");
    return;
  }
  if (/[\\\/]/i.test(elems['nickname'].value)) {
    errBubble(elems['nickname'], "You may not use slashes (\\ or /) in your nickname.");
    return;
  }
  if (/[\<\>]/i.test(elems['nickname'].value)) {
    errBubble(elems['nickname'], "You may not use brackets (&lt; or &gt;) in your nickname.");
    return;
  }
  if (/\s$/i.test(elems['nickname'].value) ||
      /^\s/i.test(elems['nickname'].value)) {
    errBubble(elems['nickname'], "Your nickname should not begin<br>or end with a space.");
    return;
  }
  if (/\s\s+/i.test(elems['nickname'].value)) {
    errBubble(elems['nickname'], "Your nickname shouldn't have<br>multiple spaces in a row.");
    return;
  }
  if (/\s\s+/i.test(elems['nickname'].value)) {
    errBubble(elems['nickname'], "Your nickname shouldn't have<br>multiple spaces in a row.");
    return;
  }

  // Check that none are empty
  for (var i in elems) {
    var val = elems[i].value;
    if (val.length < 1 ||
        (i == 'birth_month' && val == -1) ||
        (i == 'birth_day' && val == 0) ) {
      errBubble(elems[i], "Oops - you left something blank!");
      return;
    }
  }

  // Gender is different because it's a radio selection
  var emptyGender = function(obj) {
    obj.focus();

    var pos = findXY(obj);
    var msg = new CbMessage("Oops - you left something blank!", pos[0]+15, pos[1]-10, 2, 5);
    msg.msgBox.setOpacity(0);
    msg.msgBox.show();
    setTimeout(function() { fadeTo(msg.msgBox.container, 1, .5); }, 100);

    var gm = document.getElementById('gender_m');
    var gf = document.getElementById('gender_f');
    gf.oldclk = gf.onclick;
    gm.oldclk = gm.onclick;

    gf.onclick = function() {
      msg.goodbye();
      gm.onclick = gm.oldclk;
      gf.onclick = gf.oldclk;
    }

    gm.onclick = function() {
      msg.goodbye();
      gm.onclick = gm.oldclk;
      gf.onclick = gf.oldclk;
    }
  }

  // Check empty gender
  if (!elems['gender_m'].checked && !elems['gender_f'].checked) {
    var q = document.getElementById('gender_loc');
    emptyGender(q);
    return;
  }

  var passMismatch = function(obj) {
    obj.focus();

    var pos = findXY(obj);
    var msg = new CbMessage("Your passwords don't match!<br>Please re-enter them.", pos[0]+15, pos[1]-10, 2, 5);
    msg.msgBox.setOpacity(0);
    msg.msgBox.show();

    setTimeout(function() { fadeTo(msg.msgBox.container, 1, .5); }, 150);

    obj.oldkd = obj.onkeydown;
    obj.oldclk = obj.onclick;

    obj.onkeydown = function() {
      msg.goodbye();
      this.onkeydown = obj.oldkd;
      this.onclick = obj.oldclk;
    }

    obj.onclick = function() {
      msg.goodbye();
      this.onclick = obj.oldclk;
      this.onkeydown = obj.oldkd;
    }

  }

  // Check password agreeance
  if (!(elems['pass1'].value == elems['pass2'].value)) {
    elems['pass1'].value = '';
    elems['pass2'].value = '';
    passMismatch(elems['pass1']);
    return;
  }



  // Everything looks good!
  elems['register'].value = 1;
  rf.submit();

}
