/*
 * Global javascript file for the Yes-co website
 *
 * @author Stefan van Zanden <svz@yes-co.nl>
 * @version 1.0
 * @release-data 23-02-2009
 */

/*
 * Global YESCO Namespace
 *
 */
if (YESCO == null || typeof(YESCO) != "object") {
  var YESCO = new Object();
}

YESCO.initSignupForm = function()
{
  dojo.require("dijit.form.Form");
  dojo.require("dijit.form.ValidationTextBox");
  dojo.require("dijit.form.NumberTextBox");
  
  clearSignupError();
  retrieveCountries();
  
  function createWidget()
  {
    new dijit.form.ValidationTextBox({name: "company", invalidMessage: "Geen bedrijfsnaam ingevuld", required: "true"}, "company");
    new dijit.form.NumberTextBox({name: "number_offices", invalidMessage: "Geen getal ingevuld", style: "width:70px;"}, "number_offices");
    new dijit.form.NumberTextBox({name: "number_employees", invalidMessage: "Geen getal ingevuld", style: "width:70px;"}, "number_employees");
    new dijit.form.ValidationTextBox({name: "zipcode", invalidMessage: "Geen postcode ingevuld", required: "true", style: "width:75px;", onChange: validateAddress}, "zipcode");
    new dijit.form.ValidationTextBox({name: "housenumber", invalidMessage: "Geen huisnummer ingevuld", required: "true", style: "width:63px;", onChange: validateAddress}, "housenumber");
    new dijit.form.ValidationTextBox({name: "admin_firstname", invalidMessage: "Geen voornaam ingevuld", required: "true"}, "admin_firstname");
    new dijit.form.ValidationTextBox({name: "admin_lastname", invalidMessage: "Geen achternaam ingevuld", required: "true"}, "admin_lastname");
    new dijit.form.ValidationTextBox({name: "admin_email", invalidMessage: "Er dient een geldig e-mail adres ingevoerd te worden", regExp: "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$", required: "true", onChange: validateUsername}, "admin_email");
    
    var signupForm = dojo.byId("yisprosignupform");
    signupForm.onsubmit = function() { return validateSignupForm(); }
    
    var signupButton = dojo.byId("signUpButton");
    signupButton.onclick = function() { validateSignupForm(); return false; };
    
    validAddress = false;
  }
  
  function retrieveCountries()
  {
    dojo.xhrGet(
    {
	    url: 'scripts/retrieve_countries.php',
	    handleAs: "json",
      sync: true,
	    handle: function(result)
      {
        var index   = 0;
        var country = dojo.byId("country");
        country.options[country.length - 1] = null;
        
        for (var code in result)
        {
          country.options[country.length] = new Option(result[code], code, ((code == 'NL') ? true : false), ((code == 'NL') ? true : false));
        }
	    }
    });
  }
  
  function validateUsername()
  {
    var username        = dijit.byId("admin_email");
    var validUsername   = true;
    
    if (username.isValid())
    {
      dojo.xhrGet(
      {
	      url: 'scripts/validate_username.php?username=' + username.attr('value'),
	      handleAs: "json",
        sync: true,
	      handle: function(result)
        {
          validUsername = (result == true) ? true : false;
          
          if (result == false)
            addSignupError('Er bestaat al een Yes-co Open gebruiker met e-mail adres ' + username.attr('value'));
	      }
	    });
    }
    
    return validUsername;
  }
  
  function validateAddress()
  {
    var countryId      = dojo.byId("country").selectedIndex;
    var country        = dojo.attr(dojo.byId("country").options[countryId], 'value');

    var zipcode        = dijit.byId("zipcode");
    var housenr        = dijit.byId("housenumber");

    var street         = dojo.byId("street");
    var city           = dojo.byId("city");
    var loader         = dojo.byId("address-loader");

    console.debug(country, zipcode.attr('value'), housenr.attr('value'));
    
    if (zipcode.isValid() && housenr.isValid())
    {
      // Clear previous errors
      clearSignupError();

      // Active loader image
      // dojo.attr(loader, 'class', 'formAjaxLoader');
      dojo.addClass(loader, 'formAjaxLoader');

      // Disable street/city input fields
      dojo.attr(street, 'disabled', 'disabled');
      dojo.attr(city,   'disabled', 'disabled');

      dojo.xhrGet(
      {
	      url: 'scripts/validate_address.php?country=' + country + '&zipcode=' + zipcode.attr('value') + '&housenr=' + housenr.attr('value'),
	      handleAs: "json",
        sync: false,
	      handle: function(result)
        {
          console.log(result);

          if (typeof(result.Valid) != 'undefined')
          {
            if (result.Valid == false)
            {
              addSignupError('Postcode/huisnummer ongeldig');

              dojo.attr(street, 'value', '');
              dojo.attr(city,   'value', '');
              
              validAddress = false;
            } else
            {
              dojo.attr(street, 'value', result.Street);
              dojo.attr(city,   'value', result.City);
              
              validAddress = true;
            }
          } else
          {
            // unknown address, accept for now
            validAddress = true;
          }
          
          // Reset form to previous state
          dojo.removeAttr(street, 'disabled');
          dojo.removeAttr(city,   'disabled');
          dojo.removeClass(loader, 'formAjaxLoader');
	      }
	    });
    }
    
    return;
  }
  
  function validateSignupForm()
  {
    clearSignupError();
    var elements  = new Array();
    elements[0]   = dijit.byId("admin_email");
    elements[1]   = dijit.byId("admin_lastname");
    elements[2]   = dijit.byId("admin_firstname");
    elements[3]   = dijit.byId("housenumber");
    elements[4]   = dijit.byId("zipcode");
    elements[5]   = dijit.byId("company");
    
    var valid           = true;
    
    for (i=0; i < elements.length; i++)
    {
      if (!elements[i].isValid())
      {
        valid = false;
        elements[i].focus();
      }
    }
    
    if (valid == false)
      addSignupError('Niet alle verplichte velden zijn ingevuld');
    
    if (validAddress == false)
    {
      addSignupError('Postcode en/of huisnummer is ongeldig');
      valid = false;
    }

    var acceptElem = dojo.byId("accept");
    if (!acceptElem.checked)
    {
      addSignupError('Je dient akkoord te gaan met de gebruiksovereenkomst');
      valid = false;
    }
    
    if (valid == true && validateUsername())
    {
      document.forms[0].submit();
    }

    return valid;
  }
  
  function addSignupError(errorMsg)
  {
    var errorContainer            = dojo.byId("formErrorMessage");
    errorContainer.innerHTML     += '<p>' + errorMsg + '</p>';
    errorContainer.style.display  = 'block';
  }
  
  function clearSignupError()
  {
    var errorContainer            = dojo.byId("formErrorMessage");
    errorContainer.innerHTML      = '';
    errorContainer.style.display  = 'none';
  }
  
  dojo.addOnLoad(createWidget);
}

/*
 * Function that changes the Edition banner and the button wich is mousedover on
 */
YESCO.changeHomePageEditionBanner = function(edition)
{
  if (!edition)
    return;

  var elemBroker            = null;
  var elemOffice            = null;
  var elemMultiOffice       = null;

  var elemBrokerButton      = null;
  var elemOfficeButton      = null;
  var elemMultiOfficeButton = null;
  var classNameSelected     = 'orange_but';
  var classNameNormal       = 'blue_but';

  if (elemBroker = document.getElementById('edition-broker'))
  {
    if (elemOffice = document.getElementById('edition-office'))
    {
      if (elemMultiOffice = document.getElementById('edition-multi-office'))
      {
        if (elemBrokerButton = document.getElementById('edition-broker-button'))
        {
          if (elemOfficeButton = document.getElementById('edition-office-button'))
          {
            if (elemMultiOfficeButton = document.getElementById('edition-multi-office-button'))
            {

              elemBroker.style.visibility           = 'hidden';
              elemOffice.style.visibility           = 'hidden';
              elemMultiOffice.style.visibility      = 'hidden';

              switch (edition)
              {
                case 'broker':

                  elemBroker.style.visibility       = 'visible';

                  YESCO.swapClass(elemBrokerButton,      classNameNormal, classNameSelected);
                  YESCO.swapClass(elemOfficeButton,      classNameSelected, classNameNormal);
                  YESCO.swapClass(elemMultiOfficeButton, classNameSelected, classNameNormal);

                break;

                case 'office':

                  elemOffice.style.visibility       = 'visible';

                  YESCO.swapClass(elemBrokerButton,      classNameSelected, classNameNormal);
                  YESCO.swapClass(elemOfficeButton,      classNameNormal, classNameSelected);
                  YESCO.swapClass(elemMultiOfficeButton, classNameSelected, classNameNormal);

                break;

                case 'multi-office':

                  elemMultiOffice.style.visibility  = 'visible';

                  YESCO.swapClass(elemBrokerButton,      classNameSelected, classNameNormal);
                  YESCO.swapClass(elemOfficeButton,      classNameSelected, classNameNormal);
                  YESCO.swapClass(elemMultiOfficeButton, classNameNormal, classNameSelected);

                break;
              }

            }
          }
        }
      }
    }
  }
}

/*
 * Function that checks if the element has a certain class
 */
YESCO.hasClass = function(elem, className) {

  return elem.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'));

}

/*
 * Function that adds a certain class to the element
 */
YESCO.addClass = function(elem, className) {

  if (!this.hasClass(elem, className))
    elem.className += " " + className;

}

/*
 * Function that removes a certain class from the element
 */
YESCO.removeClass = function(elem, className) {

  if (this.hasClass(elem, className)) {
    var reg         = new RegExp('(\\s|^)' + className + '(\\s|$)');
    elem.className  = elem.className.replace(reg, ' ');
  }

}

/*
 * Function that swaps 2 classes from the element
 */
YESCO.swapClass = function(elem, classNameFrom, classNameTo) {
  this.removeClass(elem, classNameFrom);
  this.addClass(elem, classNameTo);
}

/*
 * Function that opens a popup
 */
YESCO.openWindow = function(windowUrl, windowName, windowWidth, windowHeight) {

  if (!windowName)
    windowName = '_blank';

  window.open(windowUrl, windowName, 'width=' + windowWidth + ',height=' + windowHeight + ',resizable=yes,scrollbars=no');
}

/*
 * Function that initialises the HomePage
 */
YESCO.initHomePage = function() {

  // Homepage banner button events
  var elemBrokerButton = null;
  var elemOfficeButton = null;
  var elemMultiOfficeButton = null;

  if (elemBrokerButton = document.getElementById('edition-broker-button'))
  {
    if (elemOfficeButton = document.getElementById('edition-office-button'))
    {
      if (elemMultiOfficeButton = document.getElementById('edition-multi-office-button'))
      {
        elemBrokerButton.onmouseover        = function() { YESCO.changeHomePageEditionBanner('broker'); }
        elemOfficeButton.onmouseover        = function() { YESCO.changeHomePageEditionBanner('office'); }
        elemMultiOfficeButton.onmouseover   = function() { YESCO.changeHomePageEditionBanner('multi-office'); }

      }
    }
  }

}
