
gDisableJSValidation = false;

var pageloadflag = true;
var lasthash = "";
if(location.hash) pageload(location.hash);

function pageload(hash) {
    var hash = hash.replace(/^[#\/]+/, "");
    if(hash != "") {
        var parts = hash.split("/");
        var actions = [];
        pathname = location.pathname.replace(/\/?$/, "");
        var page, letter;
        for(var i=0;i<parts.length;i++) {
            var action = parts[i++];
            var value  = parts[i];
            if(action == 'page') {
                hash = hash.replace(/\/?page\/\d+/, "");
                pathname = pathname.replace(/\/page\/\d+/, "") + "/page/" + value;
                page = value;
            }
            if(action == 'letter') {
                // remove page number when letter is changed
                hash = hash.replace(/\/?page\/\d+/, "");
                pathname = pathname.replace(/\/page\/\d+/, "");
                hash = hash.replace(/\/?letter\/[\w-09]+/, "");
                pathname = pathname.replace(/\/letter\/[\w-09]+/, "") + "/letter/" + value;
                letter = value;
                page = 1;
            }
        }
        pathname += "/";
        if(hash) {
            hash = "#" + hash;
        }
        if(pageloadflag) {
            location.href = location.protocol + "//" + location.host +  pathname + location.search + hash;
            return false;
        }
        else {
            // TODO: tick Google Analytics with the URL that would be loaded if this wasn't done via Ajax
            // pageTracker._trackPageview( pathname + location.search + hash ); // NOT SURE IF THIS IS CORRECT
            if(page && !letter) {
                Global.loadNumericPage($(".pagination.primary, .pagination_prevnext.primary"), page);
            }
            if(letter) {
               // $("#alpha_browser .load_page").html(letter).click();
               Global.loadAlphaPage($(".alpha_browser"), letter);

            }
        }
    }
    else {
        if(!pageloadflag) {
            var page = "1";
            var pathname = location.pathname.replace(/\/?$/, "");
            if(pathname.match(/\/page\/\d+/)) {
                page = pathname.replace(/.*\/page\/(\d+).*/, "$1");
            }
            if(pathname.match(/\/letter\/[\w-09]+/)) {
                page = pathname.replace(/.*\/letter\/([\w-09]+).*/, "$1");
            }
            if(lasthash != "" && lasthash.match(/\/page\/\d+/)) {
               Global.loadNumericPage($(".pagination.primary, .pagination_prevnext.primary"), page);

            }
            if(lasthash != "" && lasthash.match(/\/letter\/[\w-09]+/)) {
                Global.loadAlphaPage($(".alpha_browser"), letter);
            }
        }
    }
    lasthash = location.hash;
    pageloadflag = false;
    return false;
}


jQuery(function() {

  /* $.historyInit(pageload); */

  // handle pagination
  $.ajaxSetup({cache: false});
  $("form").submit(function() { return FormUtils.validateForm(this) });
  $.fn.clearForm = FormUtils.clearForm;

  $("#loading").hide();
  $("#loading").ajaxSend(function(){
    $(this).show();
  });
  $("#loading").ajaxComplete(function(){
      $(this).hide();
  });
  $("#loading").ajaxStop(function(){
      $(this).hide();
  });
  $("#loading").ajaxError(function(event, request, settings) {
    Global.handleAjaxError(request.responseText, settings.url);
    return false;
  });

  $("body").ajaxSend(function(evt, request, settings){
    //Global.alertObject(settings);
  });

  $(".alpha_browser .page").live("click", function() {
          var letter = $(this).text().toLowerCase();
          var parent = $(this).parents(".alpha_browser").get(0);
          if($(parent).hasClass("primary")) {
              Global.updateHash("letter", [letter]);
          }
          else {
              Global.loadAlphaPage(parent, letter);
          }
          return false;
  });

  $(".pagination .page, .pagination_prevnext .page").live("click", function() {
          var page = this.id.substr(6);
          var parent = $(this).parents(".pagination, .pagination_prevnext").get(0);
          if($(parent).hasClass("primary")) {
              if(!$(parent).hasClass("pgn_ajax")) return true;
              Global.updateHash("page", [page]);
          }
          else {
              Global.loadNumericPage(parent, page);
          }
          return false;
  });

  for(i in jshandlers) {
    var h = jshandlers[i];
    if(h == '') continue;
    eval(h + '()');
  }
 });


$.fn.typeahead = function(func, options) {
    var timeout = false;        // hold timeout ID for suggestion results to appear
    var prevLength = 0;         // last recorded length of $input.val()
    var $input = $(this);

    if ($.browser.mozilla)
        $input.keypress(processKey);    // onkeypress repeats arrow keys in Mozilla/Opera
    else
        $input.keydown(processKey);     // onkeydown repeats arrow keys in IE/Safari

    function processKey(e) {
        // printable chars
        if(e.which >= 32 && e.which < 127) {
            if (timeout)
                clearTimeout(timeout);
            timeout = setTimeout(func, options.delay);
        }
    }
};


var Global = {


  getDebugDetails: function() {
      jQuery.get("/a/" + "DebugAjaxDetails", {_ajax: 1} , function(data) {
         $("#fw_debug_ajax_actions").append(data);
      });
  },

  updateHash: function(action, params) {
        // remove leading #,/ and trailing /
        var hash = location.hash.replace(/^#\/?/, "").replace(/\/?$/, "/");
        if(action == 'page'){
            hash = hash.replace(/page\/\d+/, "") + "page/" + params[0];
        }
        if(action == 'letter'){
            hash = hash.replace(/page\/\d+/, "");
            hash = hash.replace(/letter\/[\w-09]+/, "") + "letter/" + params[0];
        }
        if(location.hash != "#" + hash) {
            $.historyLoad(hash);
    }
    return false;
  },

  getMsg: function(msg_id, args) {
      arg_array = Utils.is_array(args);
      msg = gStaticMessages[msg_id];
      if(arg_array){
        for(i=0; i<args.length; i++){
            msg = msg.replace("{" + (i+1) + "}", args[i]);
        }
      }
      else{
        msg = msg.replace("{1}", args);
      }
      return msg;
  },

  alertMsg: function(msg_id, args) {
       alert(Global.getMsg(msg_id, args));
  },

  confirmMsg: function(msg_id, args) {
       return confirm(Global.getMsg(msg_id, args));
  },

 // not used as of now
  extractValidateRules: function() {
    if($("#gValidateRules").length == 0) return;
    var  rules = window["eval"]("(" + $("#gValidateRules").text() + ")");
    for(action in rules){
        gValidateRules[action] = rules[action];
    }
    $("#gValidateRules").remove();
  },

  getAction: function(action, params, callback) {
    if(!params) params = {};
    params._ajax = 1;
    var actionUrl=URL_PREFIX_AJAX+action;
    return jQuery.get(actionUrl, params, function(data) {
      if(FW_DEBUG) { Global.getDebugDetails(); }
      var ret = Global.handleAjaxError(data, action);
      if(!ret) return;
      if(callback) callback(data);
    });
  },

  postAction: function(action, params, callback) {
    if(!params) params = {};
    params._ajax = 1;
    var actionUrl=URL_PREFIX_AJAX+action;
    return jQuery.post(actionUrl, params, function(data) {
      if(FW_DEBUG) { Global.getDebugDetails(); }
      var ret = Global.handleAjaxError(data, action);
      if(!ret) return;
      if(callback) callback(data);
    });
  },
  getJSONAction: function(action, params, callback) {
    if(!params) params = {};
    params._ajax = 1;
    var actionUrl=URL_PREFIX_AJAX+action;
    return jQuery.getJSON(actionUrl, params, function(data) {
        if(FW_DEBUG) { Global.getDebugDetails(); }
        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'], data['_form']);

        if(callback && !error_flag) {
          callback(data);
        }
    });
  },
  loadAction:    function (target, action, params, callback) {
    if(!params) params = {};
    params._ajax = 1;
    var actionUrl = URL_PREFIX_AJAX + action;
    return jQuery.get(actionUrl, params, function(data) {
        if(FW_DEBUG) { Global.getDebugDetails(); }
        var ret = Global.handleAjaxError(data, action);
        if(!ret) return;
        $(target).html(data);
        // applying the click handler here causes an obscure right-click bug
        // it is now applied with live() in gdgt.js
        //$(target).find(".auth").click(Gdgt.authHandler);
        if(callback) {
          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) {
          if(FW_DEBUG) { Global.getDebugDetails(); }
          var ret = Global.handleAjaxError(data, action);
          if(!ret) return;
          if(callback) {
            callback(data);
          }
        }
    });
  },

  ajaxSubmitJSON: function(form_id, callback, errorcallback) {
    var form = document.getElementById(form_id);
    var ret = FormUtils.validateForm(form);
    var action = Global.getFormAction(form);
    if(!ret)  return;
    $(form).ajaxSubmit({
        dataType: 'json',
        beforeSubmit: function(params) {
          params.push({name: '_ajax', value: '1'});
        },
        success: function(data) {
          if(FW_DEBUG) { Global.getDebugDetails(); }
          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'], data['_form']);

          if(errorcallback && error_flag) {
             errorcallback(data);
          }

          if(callback && !error_flag) {
            callback(data);
          }
      },
      error: function(data){
          if(errorcallback){
             errorcallback(data);
          }
      }
    });
  },

  handleAjaxError: function(data, url) {
    if(!data) return true;
    if(data.match(/FW_PHP_ERROR/)) {
      var error = data.replace(/<!--FW_PHP_ERROR-->/g, '');
      $.get(URL_PREFIX_AJAX + "Error", {fatal: error, url: url, ajax: 1});
      alert("Oops! Something went wrong. Please try again.");
      return false;
    }
    else if(data.match(/FW_PHP_EXCEPTION/)) {
      alert("Oops! Something went wrong. Please try again.");
      return false;
    }
    else if(data.match(/FW_AJAX_REDIRECT/)) {
        var redirect_url = data.replace(/.*<!--FW_AJAX_REDIRECT-->(.*?)<!--FW_AJAX_REDIRECT-->.*/m, "$1");
        window.location.href = redirect_url;
        return false;
    }
    return true;
  },

  clearActionMessages: function(action) {
      $(".alert, .alertbox").each(function() {
          if(!this.className.match("m_" + action.toLowerCase() + "-"))  {
            return;
          }
          $(this).html("");
          $(this).hide();
          $(this).parents('form.normal').find('label').removeClass('error_label');
    });
  },

  loadNumericPage: function(elem, page) {
    if($(elem).length == 0) return;
    var container = $(elem).parents(".container").get(0);
    if($(elem).hasClass("pgn_scrolltop") ) {
        $.scrollTo($(container));
    }
    var primary = $(elem).hasClass("primary")?1:0;
    var action = $(elem).find(".pgn_action").text();
    Global.loadAction($(container), action, {page: page, _primary: primary}, function() {});
  },

  loadAlphaPage: function(elem, letter) {
    if($(elem).length == 0) return;
    var container = $(elem).parents(".container").get(0);
    var action = $(elem).find(".pgn_action").text();
    Global.loadAction($(container), action, {letter:letter}, function() {});
  },

  alertObj: function(obj) {
    var output = "";
    for(i in obj) {
      output += i +  "=" + obj[i];
    }
  },

  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;
    },

    typeAhead: function($input, func, minChars, maxChars, delay) {
        var timeout = false;
        if ($.browser.mozilla)
            $input.keypress(processKey);    // onkeypress repeats arrow keys in Mozilla/Opera
        else
            $input.keydown(processKey);     // onkeydown repeats arrow keys in IE/Safari

        function processKey(e) {
            // printable chars
            if(($(this).val().length < minChars - 1) || ($(this).val().length > maxChars - 1)) return;
            if(e.which >= 32 && e.which < 127 || e.which == 8) {
                if (timeout)
                    clearTimeout(timeout);
                timeout = setTimeout(func, delay);
            }
        }
    }
};



var Validation = {

  validateAction: function (form) {

    if(gDisableJSValidation) return true;
    var action = Global.getFormAction(form);
    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.text();
    }
    if(!label) {
      label = elem;
    }

    if(required && jQuery.trim(jelem.val()) == "") {
      this.displayActionMessage(action, '-e-' + elem, label + " is required.", 'E', '');
      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.text();
        }
        else {
          otherLabel = elem;
        }
        message = message.replace("{label1}", otherLabel);
      }

      for(i=0;i<args.length;i++) {
        message = message.replace("{" + (i+1) + "}", args[i]);
      }

      if(!this.validateElemType(jform, jelem, type, args)) {
        this.displayActionMessage(action, '-e-' + elem, message, 'E', '');
        return false;
      }
    }

    return true;
  },

  validateElemType: function (jform, jelem, type, args) {
    if(type == 'alphanumeric') {
      if(jelem.val().match(/[^\d\w]/i)) {
        return false;
      }
    }
    else if(type == 'postalcode') {
      if(jelem.val().match(/[^\d\w\s-]/i)) {
        return false;
      }
    }
    else if(type == 'minLength') {
      if(jelem.val().length < args[0]){
        return false;
      }
    }
    else if(type == 'maxLength') {
      if(jelem.val().length > args[0]){
        return false;
      }
    }
    else if(type == 'matchOther') {
      var jOther = jform.find(":input[name='" + args[0] + "']");
      if(jelem.val() != jOther.val()) {
        return false;
      }
    }
    else if(type == 'ip') {
        var bytes = jelem.val().split('.');
        if(!bytes || bytes.length != 4) return false;
        for(i in bytes) {
            var byte1 = bytes[i];
            if(isNaN(byte1) || byte1 < 0 || byte1 > 255) {
                return false;
            }
        }
    }
    else 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());
    }
    else if(type == 'required') {
      if(jQuery.trim(jelem.val()) == '') {
        return false;
      }
    }
    return true;
  },
  displayMessages: function (action, messages) {
    var alert_flag = false;

    // Hide existing alert messages for an action
//    jQuery("#alert_messages" + ".m_" + action.toLowerCase()).html("");
    for(msg_id1 in messages) {
      var msg_style = messages[msg_id1]['style'];
      if(msg_style == 'A'){ alert_flag = true; }
    }
    if(alert_flag) {
        jQuery("#alert_messages").html("");
    }
    jQuery(".m_global").html("");
    jQuery(".m_global").hide("");

    Global.clearActionMessages(action);


    for(msg_id1 in messages) {
      var msg_str = messages[msg_id1]['msg'];
      var msg_type = messages[msg_id1]['type'];
      var msg_style = messages[msg_id1]['style'];
      var global_flag = messages[msg_id1]['global'];
      if(global_flag) {
           this.displayGlobalMessage(msg_str, msg_type);
      }
      else {
        this.displayActionMessage(action, msg_id1, msg_str, msg_type, msg_style);
      }
    }
    if(alert_flag){
//Gdgt.dialog($("#alert_popover"));
//alert(msg_str);
//      jQuery("#alert_messages").removeClass();
//      jQuery("#alert_messages").addClass("m_" + action.toLowerCase());
    }
  },

  displayGlobalMessage: function(msg_str,  msg_type) {
    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";}
    else if(msg_type == 'I'){   error_class = "info";}
    $(".m_global").append("<div class='" + error_class + "'>" + msg_str + "</div>");
    $(".m_global").show();
  },

  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";}
    else if(msg_type == 'I'){   error_class = "info";}

    if(!msg_style) msg_style = "";

    if(msg_style == 'A'){
      $("#alert_messages").append("<div class='" + error_class + "'>" + msg_str + "</div>");
    }
    else {
      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);
          });
        }
      }

      if(msg_id.match('-e-')){
        var elem = msg_id.replace('-e-', '');
//        $("form[name=" + form + "]").find("label[for='"+ elem + "']").addClass("error_label");
//        $("form[name=" + form + "]").find(":input[name='"+ elem + "']").addClass("error_elem");
         $("form").find("label[for='"+ elem + "']").addClass("error_label");
         //$("form").find(":input[name='"+ elem + "']").addClass("error_elem");
      }

    }
  }

};

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, .alertbox").html("");
//    $(".alert, .alertbox").hide();

    var action = Global.getFormAction(form);
    if(action) { Global.clearActionMessages(action); }
    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).text();
      labels[name] = label;
    });
    for(name in labels){
      $(form).append("<input type='hidden' name='_label_" + name + "' value='" + labels[name] + "' />");
    };

    // Append the form name
    var formName = '';
    if(form.name) {
      formName = form.name
    }
    $(form).append("<input type='hidden' name='_form_' value='" + formName + "' />");
    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;
          });
        });
  },
  //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 = "";
      }
    }
  },
  drawPaymentFields: function(){
	  if($('[name=payment_method]').val()=='creditcard') {
	 	  $(".paymentCC").show();
	  }else {
		  $(".paymentCC").hide();
	  }
	  
	  if($('[name=payment_method]').fieldValue()=='creditcard') {
	 	  $(".paymentCC").show();
	  } else {
	 	  $(".paymentCC").hide();
	  }
	 
	 
	 
  },
  togglePaymentMode: function(value){
  	if(value == 'rec'){
  		$("[name='amount_110']").removeAttr('checked');
  		$('#amount_110_other').val('');
  	}else{
  		$("[name='amount_month']").removeAttr('checked');
  		$('#amount_month_other').val('');
  	}
  },

  //hiding and showing reason sectionin donate form
  manageDonateReason:function(){
	  if($('[name=reason]').fieldValue() == ''){
	  	$("#reason_donation").hide();
	  }else{
	  	$("#reason_donation").show();
	  	$('#deselect_row').show();
	  }
  }
};

