var gDisableJSValidation = false;
jQuery(function() {
    $("form").submit(function() { return FormUtils.validateForm(this) });
    $.fn.clearForm = FormUtils.clearForm;

/*
    $("#loading").ajaxSend(function(){
        $(this).show();
    });
    $("#loading").ajaxComplete(function(){ $(this).hide(); });
    $("#loading").ajaxError(function(event, request, settings) {
        Global.handleAjaxError(request.responseText, settings.url);
//		if(request.responseText && request.responseText.match("FW_PHP_ERROR")) {
//			var error = request.responseText.replace(/<!--FW_PHP_ERROR-->/g, '');
//			$.get("/Error", {fatal: error, url: settings.url});
//		}
//		alert("Oops!  Something went wrong.  Please try again.");
        return false;
    });
    */
});

var Global = {
  getAction: function(action, params, callback) {
    if(!params) params = {};
    params._ajax = 1;
    if(!params.region_id) {
      params.region_id = gRegionId;
    }
    if(!params.language_id) {
      params.language_id = gLanguageId;
    }
    var action1=URL_PREFIX_AJAX+action;
    jQuery.get(action1, params, function(data) {
      Global.handleAjaxError(data, action);
      callback(data);
    });
  },
  postAction: function(action, params, callback) {
    if(!params) params = {};
    params._ajax = 1;
    if(!params.region_id) {
      params.region_id = gRegionId;
    }
    if(!params.language_id) {
      params.language_id = gLanguageId;
    }
    var action1=URL_PREFIX_AJAX+action;
    jQuery.post(action1, params, function(data) {
      Global.handleAjaxError(data, action);
      callback(data);
    });
  },
  getJSONAction: function(action, params, callback) {
    if(!params) params = {};
    params._ajax = 1;
    if(!params.region_id) {
      params.region_id = gRegionId;
    }
    if(!params.language_id) {
      params.language_id = gLanguageId;
    }
    var action1=URL_PREFIX_AJAX+action;
    jQuery.getJSON(action1, params, function(data) {
        var error_flag = false;
        for(i in data['messages']){
          if(data['messages'][i]['type'] == 'E') 	error_flag = true;
        }
        for(i in data['verrors']){	error_flag = true;}

        Validation.displayMessages(action, data['messages']);
        Validation.displayErrors(action, data['verrors']);

        if(callback && !error_flag) {
          callback(data);
        }
    });
  },
  loadAction:	function (target, action, params, callback) {
    if(!params) params = {};
    params._ajax = 1;
    if(!params.region_id) {
      params.region_id = gRegionId;
    }
    if(!params.language_id) {
      params.language_id = gLanguageId;
    }
    var action1=URL_PREFIX_AJAX+action;
    jQuery.get(action1, params, function(data) {
        Global.handleAjaxError(data, action);
        $(target).html(data);
        if(callback) {
          callback(data);
        }
      });
  },
  ajaxSubmitJSON: function(form_id, callback) {
    var form = document.getElementById(form_id);
    var ret = FormUtils.validateForm(form);
    if(!ret)  return;
    $(form).ajaxSubmit({
        dataType: 'json',

        beforeSubmit: function(params) {

            if(!params.region_id) {
              params.region_id = gRegionId;
            }
            if(!params.language_id) {
              params.language_id = gLanguageId;
            }
          params.push({name: '_ajax', value: '1'});
        },
        success: function(data) {
          var error_flag = false;
          for(i in data['messages']){
            if(data['messages'][i]['type'] == 'E') 	error_flag = true;
          }
          for(i in data['verrors']){	error_flag = true;}

          //var action=URL_PREFIX_AJAX+action;
           var action = Global.getFormAction(form);

          Validation.displayMessages(action, data['messages']);
          Validation.displayErrors(action, data['verrors']);

          if(callback && !error_flag) {
            callback(data);
          }
      }
    });
  },

  ajaxSubmitAction: function(form_id, callback) {
    var form = document.getElementById(form_id);
    var action = Global.getFormAction(form);
    var ret = FormUtils.validateForm(form);
    if(!ret)  return;
    $(form).ajaxSubmit({
        beforeSubmit: function(params) {
          params.push({name: '_ajax', value: '1'});
        },
        success: function(data) {
          var ret = Global.handleAjaxError(data, action);
          if(!ret) return;
          if(callback) {
            callback(data);
          }
        }
    });
  },


  handleAjaxError: function(data, url) {
    if(!data && !data.match(/FW_PHP_EXCEPTION/) && !data.match(/FW_PHP_ERROR/)) return;
    if(data.match(/FW_PHP_ERROR/)) {
      var error = data.replace(/<!--FW_PHP_ERROR-->/g, '');
      $.get("/Error", {fatal: error, url: url, ajax: 1});
      alert("Oops! Something went wrong. Please try again.");
    }
    if(data.match(/FW_PHP_EXCEPTION/)) {
      alert("Oops! Something went wrong. Please try again.");
    }
  },

  clearAllMessages : function() {
    $(".alert").hide();
    $(".alert").html("");
  },

  showHide: function(jelem) {
      jelem.find("p.showExtended a").click(function() {
      jelem.find(".extended").show();
      jelem.find("p.showExtended").hide();
      jelem.find("p.hideExtended").show();
    });
    jelem.find("p.hideExtended a").click(function() {
      jelem.find(".extended").hide();
      jelem.find("p.hideExtended").hide();
      jelem.find("p.showExtended").show();
    });
  },

  //Display The Specified Data
  showData: function(id)
  {
      jQuery("#message_"+id).show();
      jQuery("#show_data_"+id).hide();
      jQuery("#hide_data_"+id).show();
  },

  //Hide The Specified Data
  hideData: function(id)
  {
      jQuery("#message_"+id).hide();
      jQuery("#hide_data_"+id).hide();
      jQuery("#show_data_"+id).show();
  },

  //Sort The Specified Data
  sortData: function(jelem, action_name){


      jelem.find("#btn_sort_contribution").click(function(){
      Global.loadAction(jelem, action_name, { sort:"Contribution" });
    });

    jelem.find("#btn_sort_alpha").click(function(){
      Global.loadAction(jelem, action_name, { sort:"Alpha" });
    });

    jelem.find("#btn_sort_date").click(function(){
      Global.loadAction(jelem, action_name, { sort:"Date" });

    });

    jelem.find("#btn_sort_gadget").click(function(){
      Global.loadAction(jelem, action_name, { sort:"Gadget" });
    });
  },

  loadPage: function(elem, action, page) {
    var container = $(elem).parents(".container").get(0);
    Global.loadAction($(container),action, {page:page});
  },

  loadAlphaPage: function(elem, action, letter) {

    var container = $(elem).parents(".container").get(0);
    Global.loadAction($(container), action, {letter:letter});
  },

  alertObj: function(obj) {
    var output = "";
    for(i in obj) {
      output += i +  "=" + obj[i];
    }
    alert(output);
  },

  getFormAction: function(form) {
      var  action = form.action;
      if(!action) {
        var path = location.pathname;
        action = path.replace(/^(\w+).*/, "$1");
      }
      action = action.toLowerCase();
      action = action.replace(/(\w+)\?/, "$1");
      action = action.replace(/^.*?(\w+)$/g, "$1");
      return action;
    },

  //Reset all the form values
  formReset: function(frm) {
    for(var i=0;i<frm.elements.length;i++){
      if(!(frm.elements[i].type && frm.elements[i].type == "submit" || frm.elements[i].type == "button" || frm.elements[i].type == "hidden")){
        if(frm.elements[i].type == "radio" || frm.elements[i].type == "checkbox")
          frm.elements[i].checked = false;
        else if(frm.elements[i].type == "select-one")
          frm.elements[i].selectedIndex = -1;
        else
          frm.elements[i].value = "";
      }
    }
  }
};

var Validation = {

  validateAction: function (form) {

    if(gDisableJSValidation) return true;
    var action=URL_PREFIX_AJAX+form.action;;
    if(!action) {
      var path = location.pathname;
      action = path.replace(/^(\w+).*/, "$1");
    }
    action = action.toLowerCase();
    action = action.replace(/(\w+)\?/, "$1");
    action = action.replace(/^.*?(\w+)$/g, "$1");
    var validateRules = gValidateRules[action];
    var ret = true;
    for(elem in validateRules) {
      var elemRules = validateRules[elem];
      if(elemRules != null) {
        ret1 = this.validateElem(action, form, elem, elemRules);
        ret = ret && ret1;
      }
    }
    return ret;
  },


  validateElem: function (action, form, elem, rules) {
    jform = $(form);
    jelem  = jform.find(":input[name='" + elem + "']");
    var required = true;
    var label = elem;
    var jLabel = jform.find("label[for='" + elem + "']");
    if(jLabel) {
       label = jLabel.html();
    }
    if(!label) {
      label = elem;
    }
    //alert(elem);
    //alert(jelem);
    if(required && jQuery.trim(jelem.val()) == "") {
      this.displayActionError(action, form.name, elem, label + " is required.");
      return false;
    }

    for(id in rules) {
      var rule = rules[id];
      var message  = rule['message'];
      var type     = rule['rule'];
      var args     = rule['args'];

      message = message.replace("{label}", label);
      if(type == 'matchOther') {
        var otherLabel = jform.find("label[for='" + args[0] + "']");
        if(otherLabel) {
          otherLabel = otherLabel.html();
        }
        else {
          otherLabel = elem;
        }
        message = message.replace("{label1}", otherLabel);
      }

      for(i=0;i<args.length;i++) {
        message = message.replace("{" + (i+1) + "}", args[i]);
      }

      //alert(jelem.val());
      if(!this.validateElemType(jform, jelem, type, args)) {
        this.displayActionError(action, form.name, elem, message);
        return false;
      }
    }

    return true;
  },

  validateElemType: function (jform, jelem, type, args) {
    if(type == 'alphanumeric') {
      if(jelem.val().match(/[^\d\w]/i)) {
        return false;
      }
    }
    if(type == 'minLength') {
      if(jelem.val().length < args[0]){
        return false;
      }
    }
    if(type == 'maxLength') {
      if(jelem.val().length > args[0]){
        return false;
      }
    }
    if(type == 'matchOther') {
      var jOther = jform.find(":input[name='" + args[0] + "']");
      if(jelem.val() != jOther.val()) {
        return false;
      }
    }
    if(type == 'email') {
      return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(jelem.val());
    }
    if(type == 'required') {
      if(jQuery.trim(jelem.val()) == '') {
        return false;
      }
    }
    return true;
  },

  displayErrors: function (action, errors) {
    for(elem in errors) {

      var message = errors[elem];

      if(gForm) {
        var jLabel = $("form[name=" + gForm + "]").find("label[for=" + elem + "]");
        if(jLabel) {
          label = jLabel.html();
        }
      }
      else {
        label = elem;
      }
      message = message.replace("{label}", label);
      this.displayActionError(action, gForm, elem, message);
    }
  },

  displayActionError: function (action, form, elem, error){
    var error_id = ".e_" + action + "_" + form + "_" + elem;
    var	error_woform_id = ".e_" + action + "__" + elem;
    var all_id = ".e_" + action + "__, .m_" + action + "-ALL";
    var rest_id = ".e_" + action + "__, .m_" + action + "-REST";
    //alert(error);
    if($(error_id).length + $(error_woform_id).length > 0) {
      $(error_id).html(error);
      $(error_id).height("");
      $(error_id).show();

      $(error_woform_id).html(error);
      $(error_woform_id).height("");
      $(error_woform_id).show();
    }
    else if($(rest_id).length > 0) {
      $(rest_id).height("");
      $(rest_id).append("<div class='error erroritem' >" + error + "</div>");
      $(rest_id).show();
    }
    if($(all_id).length > 0) {
      $(all_id).height("");
      $(all_id).append("<div class='error erroritem' >" + error + "</div>");
      $(all_id).show();
    }

    $("form[name=" + form + "]").find("label[for='"+ elem + "']").addClass("error_label");
    $("form[name=" + form + "]").find(":input[name='"+ elem + "']").addClass("error_elem");
  },

  displayMessages: function (action, messages) {
    var alert_flag = false;

    jQuery("#alert_messages").html("");
    // Hide existing messages for that action
    $(".alert").each(function() {
      if(!this.className.match("m_" + action + "_"))  {
        return;
      }
      $(this).html("");
      $(this).hide();
    });
    for(msg_id in messages) {
      var msg_str = messages[msg_id]['msg'];
      var msg_type = messages[msg_id]['type'];
      var msg_style = messages[msg_id]['style'];
      if(msg_style == 'A'){ alert_flag = true; }
      this.displayActionMessage(action, msg_id, msg_str, msg_type, msg_style);

    }
    if(alert_flag){
      jQuery.blockUI({message: jQuery("#alert_popover"), css:{width: jQuery("#alert_popover").width() + 50}});
    }
  },

  displayActionMessage: function (action, msg_id, msg_str, msg_type, msg_style){
    var elem_id = ".m_" + action.toLowerCase() + "-" + msg_id;
    var rest_id  = ".m_" +  action.toLowerCase() + "-REST";

    var all_id  = ".m_" +  action.toLowerCase() + "-ALL";

    var error_class = "";
    if(msg_type == 'S') {		error_class = "success";	}
    else if(msg_type == 'W'){	error_class = "warning";}
    else if(msg_type == 'E'){	error_class = "error";}

    if(!msg_style || msg_style == "" || msg_style == "F") {
      if($(elem_id).length > 0) {
        $(elem_id).html(msg_str);
        $(elem_id).height("");
        $(elem_id).addClass(error_class);
        $(elem_id).show();
        if(msg_style == "F"){
          $(elem_id).show("fast", function() {
            setTimeout('$("' + elem_id + '").hide()' , 5000);
          });
        }
      }
      else if($(rest_id).length > 0) {
        $(rest_id).height("");
        $(rest_id).append("<div class='" + error_class + "' >" + msg_str + "</div>");
        $(rest_id).show();
        if(msg_style == "F"){
          $(rest_id).show("fast", function() {
            setTimeout('$("' + rest_id + '").hide()' , 5000);
          });
        }
      }
      if($(all_id).length > 0) {
        $(all_id).height("");
        $(all_id).append("<div class='" + error_class + "' >" + msg_str + "</div>");
        $(all_id).show();
        if(msg_style == "F"){
          $(all_id).show("fast", function() {
            setTimeout('$("' + all_id + '").hide()' , 5000);
          });
        }
      }
    }
    else if(msg_style == 'A'){
      $("#alert_messages").append("'<div class='" + error_class + "'>" + msg_str + "</div>");
    }
  }

};

var Utils = {
  is_array: function (mixed_var) {
      return ( mixed_var instanceof Array );
  },
  is_object: function (mixed_var) {
      if(mixed_var instanceof Array) {
          return false;
      } else {
          return (mixed_var !== null) && (typeof( mixed_var ) == 'object');
      }
  }
};


var FormUtils = {
  validateForm: function(form) {
    //var form = t;
    $(form).find(":input").removeClass("error_elem");
    $(form).find("label").removeClass("error_label");

    $(".alert").html("");
    $(".alert").hide();
    var ret = Validation.validateAction(form);
    if(!ret) return ret;

    // Append the labels
    var labels = {};
    $(form).find("label").each(function() {
      name = $(this).attr("for");
      label = $(this).html();
      labels[name] = label.replace(/'/g, "&#039;");
    });
    for(name in labels){
      $(form).append("<input type='hidden' name='_label_" + name + "' value='" + labels[name] + "' />");
    };

    // Append the form name
    $(form).append("<input type='hidden' name='_form_' value='" + this.name + "' />");
    return true;
  },

  clearForm: function() {
   // iterate each matching form
        return this.each(function() {
          // iterate the elements within the form
          $(':input', this).each(function() {
            var type = this.type, tag = this.tagName.toLowerCase();
            if (type == 'text' || type == 'password' || tag == 'textarea')
              this.value = '';
            else if (type == 'checkbox' || type == 'radio')
              this.checked = false;
            else if (tag == 'select')
              this.selectedIndex = -1;
          });
        });
     }
};
