/**
 *
 */

// HTMLElement prototype
/*HTMLElement.prototype.show = function () {
  this.style.display = Strings.block; 
};

HTMLElement.prototype.hide = function () { 
  this.style.display = Strings.none; 
};
*/
// Array prototype
Array.prototype.contains = function (object) {

  var element = null;
  var tmp = this.clone();
  
  while ((element = tmp.pop()) != undefined)
    if (element == object)
      return true;

  return false;
};

Array.prototype.clone = function () {

  var newInstance = new Array(); 
  
  for (var property in this)
    if (typeof (this[property]) == Strings.object)
      newInstance[property] = this[property].clone();
    else
      newInstance[property] = this[property];
  
  return newInstance;
};

var Strings = {

  empty: "",
  object: 'object',
  px: "px",
  none: "none",
  block: "block",
  email: "email",
  borderRed: "1px solid red", 
  currentEventId: 'current_event_id',
  action: 'action',
  newsletterAction: 'newsletter_action',
  actionFail: 'action_fail',
  error: 'error',
  success: 'success',
  exists: 'exists',
  post: 'post',
  server: 'server.php',
  successMessage: 'Na Twój e-mail został wysłany link aktywujący',
  successMessage2: 'Sprawdź maila, zeby potwierdzić rejestrację!',
  errorMessage: 'Wpisz poprawne dane!',
  existsMessage: 'Twój adres email już istnieje w tej imprezie!',
  existsMessage2: 'Twój adres email już istnieje!'
};

var Colors = {

  inputInactive: "#000000",
  inputActive: "#000000"
};

var Utils = {

  inputDefaultValues: new Array(),
  inputDefaultKeys: new Array(),
  newsletterElement: new Array(),
  errors: new Array(),
  unsupportedCharacters: [ '~', '!', '@', '#', '$', '%', '^', '&', '*', 
                           ';', '"', '\\', '<', '>', '(', ')', 
                           '{', '}', '|', ':', ',' ],

  newsletterDefaultText: function (element, isNewsletter) {
  
    var parent = this;
    this.newsletterElement = [ element.value, element.id];
    element.style.color = Colors.inputInactive;
    
    element.onfocus = function () { 
      
      if (this.value == parent.newsletterElement[0]) {
        this.value = Strings.empty;
        this.style.color = Colors.inputActive;
      }
    };
    
    element.onblur = function () { 
      
      if (this.value == Strings.empty) {
        this.value = parent.newsletterElement[0];
        this.style.color = Colors.inputInactive;
      }
    };
  },
  
  validateNewsletter: function () {
  
    var parent = this;
    
    if ($(this.newsletterElement[1]).value == this.newsletterElement[0]) {
      $(this.newsletterElement[1]).value = Strings.empty;
      $(this.newsletterElement[1]).style.color = Colors.inputInactive;
    }
    
    if (!this.validateEmail($(this.newsletterElement[1]).value)) {
    
      $(this.newsletterElement[1]).style.border = Strings.borderRed; 
      return false;
    }
    
    // no errors? submit data
    new Ajax.Request(Strings.server, {
    
      method: Strings.post,
      parameters: {
      
        email: $(parent.newsletterElement[1]).value,
        action: $(Strings.newsletterAction).value
      },
      onSuccess: function (transport) {
        
        var response = transport.responseText;
        
        if (response == Strings.exists) {
        	$(parent.newsletterElement[1]).value = Strings.existsMessage2;
        }
        else if (response != Strings.success) {
        	$(parent.newsletterElement[1]).value = Strings.errorMessage;
        }
        else {
        	$(parent.newsletterElement[1]).value = Strings.successMessage;
        }
        
//        $(parent.newsletterElement[1]).value = Strings.empty;
      },
      onError: function (e) { }
    });
    
    return false;
  },
                           
  inputDefaultText: function (element, isNewsletter) {
  
    var parent = this;
    this.inputDefaultValues[element.id] = element.value;
    this.inputDefaultKeys.push(element.id);
    element.style.color = Colors.inputInactive;
    
    element.onfocus = function () { 
      
      if (this.value == parent.inputDefaultValues[this.id]) {
        this.value = Strings.empty;
        this.style.color = Colors.inputActive;
      }
    };
    
    element.onblur = function () { 
      
      if (this.value == Strings.empty) {
        this.value = parent.inputDefaultValues[this.id];
        this.style.color = Colors.inputInactive;
      }
    };
  },
  
  clearInputFields: function () {
  
    var count = this.inputDefaultKeys.length;
    
    for (i = 0; i < count; i++) {
    
      $(this.inputDefaultKeys[i]).value = this.inputDefaultValues[this.inputDefaultKeys[i]];
      $(this.inputDefaultKeys[i]).style.color = Colors.inputInactive;
    }
  },
  
  validateEventInputs: function () {
  
    this.clearInputDefaults();
    this.errors = new Array();
    
    var parent = this;
    var result = true;
    var count = this.inputDefaultKeys.length;
    var i;
    
    for (i = 0; i < count; i++) {
    
      if (this.inputDefaultKeys[i] == Strings.email && !this.validateEmail($(this.inputDefaultKeys[i]).value)) {
       
        this.errors.push(this.inputDefaultKeys[i]);
        result = false;
      }
      else if (this.inputDefaultKeys[i] != Strings.email &&!this.validateName($(this.inputDefaultKeys[i]).value)) {
      
        this.errors.push(this.inputDefaultKeys[i]);
        result = false;
      }
    }
    
    // update fields errors
    count = this.errors.length;
    
    if (count > 0) {
    
      for (i = 0; i < count; i++)
        $(this.errors[i]).style.border = Strings.borderRed;  
      
      $("eventFormMessage").innerHTML = Strings.errorMessage;
    }
    else {
    
      // no errors? submit data
      new Ajax.Request(Strings.server, {
      
        method: Strings.post,
        parameters: {
        
          firstname: $(parent.inputDefaultKeys[0]).value,
          secondname: $(parent.inputDefaultKeys[1]).value,
          email: $(parent.inputDefaultKeys[2]).value,
          current_event_id: $(Strings.currentEventId).value,
          action: $(Strings.action).value
        },
        onSuccess: function (transport) {
          
          var response = transport.responseText;
          var e = document.getElementById("eventFormMessage");
          
          if (response == Strings.exists) {
            e.innerHTML = Strings.existsMessage;
          }
          else if (response != Strings.success) {
        	  e.innerHTML = Strings.errorMessage;
          }
          else {
        	  e.innerHTML = Strings.successMessage2;
          }
          
          parent.clearInputFields();
        },
        onError: function (e) { }
      });
    }
    
    return false;
  },
  
  clearInputDefaults: function () {
    
    var count = this.inputDefaultKeys.length;
    var defaultValue, realValue;
    
    for (var i = 0; i < count; i++) {
      
      defaultValue = this.inputDefaultValues[this.inputDefaultKeys[i]];
      realValue = $(this.inputDefaultKeys[i]).value;
      
      if (realValue == defaultValue) 
        $(this.inputDefaultKeys[i]).value = Strings.empty;
    }
  },
  
  validateName: function (name) {
  
    var length = name.length;
    
    if (length < 3)
      return false;
    
    for (var i = 0; i < length; i++) {
      
      if (this.unsupportedCharacters.contains(name.charAt(i)))
        return false;
    }
    
    return true;
  },
  
  validateEmail: function (email) {
    
    if (email.length < 6)
      return false;
      
    var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
    
    return reg.test(email);
  },

  rollDownUp: function (element) {
  
    element = $(element);
    
    if (!element)
      return;
    
    var height = window.parseInt(element.style.height);
    var display = element.style.display;
    
    var x = 0;
    var h;
    
    var max = 73;
    
    height = height < 5 ? 0 : height;
    height = height > max ? max : height;
    
    if (height == 0) {
    
      // roll down
      if (display == Strings.none)
        element.style.display = Strings.block;
      
      h = window.setInterval(function () {

        y = ease(x, max)
        element.style.height = y + Strings.px;
        x += 8;
        
        if (y >= max) {
        
          element.style.height = max + Strings.px;
          window.clearInterval(h);
          return;
        }
        
      }, 10);
    }
    else if (height == max) {
         
      // roll up
      
      h = window.setInterval(function () {

         y = ease(x, max)
		 height = max - y - 15
		 if (height < 0) height = 0
          element.style.height = height + Strings.px;
          x += 8;
          
        if (y >= max) {
          element.style.display = Strings.none;
          element.style.height = 0 + Strings.px;
          window.clearInterval(h);
          return;
       }
        
      }, 10); 
    }
    
    function ease(x, max)
    {
    	if (x > max) return max
    	return Math.round(Math.sqrt(Math.pow(max, 2) - Math.pow(x - max, 2)))
    }
  },
  
  getIEVersion: function() {

    if (navigator.appName == 'Microsoft Internet Explorer') {
    
        var agent = navigator.userAgent;
        var expression = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        
        if (expression.exec(agent) != null)
            return parseFloat(RegExp.$1);
    }
    
    return -1;
  }
};
