(function($) {

    $.detectBrowser = function() {
      var browser=navigator.appName;
      var b_version=navigator.appVersion;
      var version=parseFloat(b_version);
      if ((browser=="Microsoft Internet Explorer") && (version<=6)) {
        var a = false;
      }
      else {
        var a = true;
      }
      return a;
    };

    $.fn.showFocus = function() {
      $(this).each(function() {
        $(this)
        .bind('focus', function(){
          $(this)
          .addClass("jQuery_hasFocus");
        })
        .bind('blur', function(){
          $(this)
          .removeClass("jQuery_hasFocus");
        })
      })
      return $(this);
    };

    $.fn.showHover = function() {
      $(this).each(function() {
        $(this)
        .bind('mouseover', function(){
          $(this)
          .addClass("jQuery_hover");
        })
        .bind('mouseout', function(){
          $(this)
          .removeClass("jQuery_hover");
        })
      })
      return $(this);
    };

    $.fn.hoverToggleClass = function(addClass) {
      return this.each(function() {
        $(this).bind('mouseover', function(){
            $(this)
            .addClass(addClass);
        })
        $(this).bind('mouseout', function(){
            $(this)
            .removeClass(addClass);
        })
        return $(this);
        })
    };

    $.doNotSubmitUntil = function(params) {
        params = $.extend( {selectors: '', callback : function(){}}, params);
        $(params.selectors)
        .bind('keyup change', params, function(){
            flag = true;
    		$(params.selectors).each(function() {
                var length = $(this).val().length;
                if (length == 0) {
                    flag = false;
                }
            });
            if (flag == true) {
                params.callback.call(this);
            }
        })
        .keyup();
	};

    $.fn.modifySubtotal = function(cost,targetSelector) {
      $(this).each(function() {
          $(this)
          .bind('click', function() {
            subtotal = parseInt($(targetSelector).text());
            if ($(this).is(':checked')) {
              $(targetSelector).text(subtotal + cost);
            }
            else {
              $(targetSelector).text(subtotal - cost);
            }
          })
          .bind('load', function() {
            subtotal = parseInt($(targetSelector).text());
            if ($(this).is(':checked')) {
              $(targetSelector).text(subtotal + cost);
            }
          });
        })
      return $(this);
    };

    $.fn.modifySubtotalAccom = function(cost,ensuitecost,targetSelector) {
      $(this).each(function() {
          $(this)
          .bind('click', function() {
            subtotal = parseInt($(targetSelector).text());
            if ($(this).is(':checked')) {
              if ($('input[name="ensuite"]').is(':checked')) {
                subtotal = subtotal + ensuitecost;
              }
              $(targetSelector).text(subtotal + cost);
            }
            else {
              if ($('input[name="ensuite"]').is(':checked')) {
                subtotal = subtotal - ensuitecost;
              }
              $(targetSelector).text(subtotal - cost);
            }
          })
          .bind('load', function() {
            subtotal = parseInt($(targetSelector).text());
            if ($(this).is(':checked')) {
              if ($('input[name="ensuite"]').is(':checked')) {
                subtotal = subtotal + ensuitecost;
              }
              $(targetSelector).text(subtotal + cost);
            }
          });
        })
      return $(this);
    };

    $.fn.modifySubtotalEnsuite = function(ensuitecost,targetSelector) {
      $(this).each(function() {
          $(this)
          .bind('click load', function() {

            subtotal = parseInt($(targetSelector).text());

            if ($(this).is(':checked'))
            {
              if ($('input[name="thursday"]').is(':checked')) {
                  subtotal = subtotal + ensuitecost;
              }
              if ($('input[name="friday"]').is(':checked')) {
                  subtotal = subtotal + ensuitecost;
              }
              if ($('input[name="saturday"]').is(':checked')) {
                  subtotal = subtotal + ensuitecost;
              }
              if ($('input[name="sunday"]').is(':checked')) {
                  subtotal = subtotal + ensuitecost;
              }

              $(targetSelector).text(subtotal);
            }
            else
            {
              if ($('input[name="thursday"]').is(':checked')) {
                  subtotal = subtotal - ensuitecost;
              }
              if ($('input[name="friday"]').is(':checked')) {
                  subtotal = subtotal - ensuitecost;
              }
              if ($('input[name="saturday"]').is(':checked')) {
                  subtotal = subtotal - ensuitecost;
              }
              if ($('input[name="sunday"]').is(':checked')) {
                  subtotal = subtotal - ensuitecost;
              }

              $(targetSelector).text(subtotal);
            }
         });
        })
      return $(this);
    };

    // This function allows the Clan images to be used as checkboxes in the Registration form.

    $.fn.imagiseRadioButton = function(params) {
      params = $.extend( {static: '', checked : '', unchecked : ''}, params);
      return $(this).each(function() {

        var assignedID = 'imagise_' + $(this).attr('name') + '_' + $(this).attr('value');
        var containerID = assignedID;
        var dynamicImageID = assignedID + '_dynamic';
        var staticImageID = assignedID + '_static';
        var targetRadioButton = 'input[name="' + $(this).attr('name') + '"][value="' + $(this).attr('value') + '"]';
        var groupName = $(this).attr('name');

        if ($(this).hide().is(':checked')) {
          $(this)
          .before("<div id=\"" + containerID + "\"><img id=\"" + staticImageID + "\" src=\"" + params.static + "\"><img id=\"" + dynamicImageID + "\" src=\"" + params.checked + "\"></div>");
        }
        else {
          $(this)
          .before("<div id=\"" + containerID + "\"><img id=\"" + staticImageID + "\" src=\"" + params.static + "\"><img id=\"" + dynamicImageID + "\" src=\"" + params.unchecked + "\"></div>");
        }

        $('#' + containerID)
        .bind('click', function(){
          if (!($(targetRadioButton).is(':checked'))) {
            $(targetRadioButton)
            .attr('checked','checked');
            $('#' + dynamicImageID)
            .attr('src',params.checked);
          }
          $('input[name="' + groupName + '"]').change();
        })
        .bind('mouseover', function(){
          document.body.style.cursor = 'pointer';
        })
        .bind('mouseout', function(){
          document.body.style.cursor = 'auto';
        })

        $(this)
        .bind('change', function(){
          if ($(this).is(':checked')) {
            $('#' + dynamicImageID)
            .attr('src',params.checked);
          }
          else {
            $('#' + dynamicImageID)
            .attr('src',params.unchecked);
          }
        })

        return $(this);

      });
    };

    // This function updates the memberlist via AJAX depending on the filter and sort options passed as parameters.

    $.fn.updateMemberlist = function(params) {
      $(this).each(function() {
          $(this)
          .mouseover(function() {
            document.body.style.cursor = 'pointer';
            $(this).css('text-decoration','underline');
          })
          .click(function(){
           $('#memberlist').html('<div style="text-align: center; color: #aaa; width: 100%">Loading...<br><img src="ajax-loader.gif"></div>');
           $('#memberlist').load("memberlist_table.ajax.php", params, function(){
              $('#alphabar_outer')
              .css('height',$('#memberlist_body').innerHeight());

              $('#alphabar_track')
              .css('height',$('#alphabar_outer').innerHeight());

              $('#alphabar_inner')
              .scrollFollow()
              .hoverToggleClass('alphabar_hover');

              $('#alphabar_inner ul li')
              .hoverToggleClass('hover');
            });
          })
          .mouseout(function() {
            document.body.style.cursor = 'auto';
            $(this).css('text-decoration','');
          });

        })
      return $(this);
    };

    $.fn.updateEventlist = function(params) {
      $(this).each(function() {
          $(this)
          .mouseover(function() {
            document.body.style.cursor = 'pointer';
            $(this).css('text-decoration','underline');
          })
          .click(function(){
           $('#eventlist').html('<div style="text-align: center; color: #aaa; width: 100%">Loading...<br><img src="ajax-loader.gif"></div>');
           $('#eventlist').load("eventlist_table.ajax.php", params, function(){
              $('#alphabar_outer')
              .css('height',$('#eventlist_body').innerHeight());

              $('#alphabar_track')
              .css('height',$('#alphabar_outer').innerHeight());

              $('#alphabar_inner')
              .scrollFollow()
              .hoverToggleClass('alphabar_hover');

              $('#alphabar_inner ul li')
              .hoverToggleClass('hover');
            });
          })
          .mouseout(function() {
            document.body.style.cursor = 'auto';
            $(this).css('text-decoration','');
          });

        })
      return $(this);
    };

    // This function updates the number of days when selecting date of birth depending on the month and year chosen.

    $.updateDaysInMonth = function(params) {
      params = $.extend( {dayID : '', monthID : '', yearID : ''}, params);
      var dayID = params.dayID;
      var monthID = params.monthID;
      var yearID = params.yearID;

      function changeDaysInMonth() {
        var currentDay = $(dayID).val();
        var maxDaysInMonth = daysInMonth($(monthID).val(),$(yearID).val());
        if ($(dayID).children(':last').attr('value') > maxDaysInMonth) {
          while ($(dayID).children(':last').attr('value') > maxDaysInMonth) {
            $(dayID).children(':last').remove();
            if (currentDay > $(dayID).children(':last').attr('value') && currentDay > 27) {
              $(dayID).children(':last').attr('selected','selected');
            }
          }
        }
        else if ($(dayID).children(':last').attr('value') < maxDaysInMonth) {
          while ($(dayID).children(':last').attr('value') < maxDaysInMonth) {
            var newDay = parseInt($(dayID).children(':last').attr('value')) + 1;
            $(dayID).children(':last').after('<option value="' + newDay + '">' + newDay + '</option>');
          }
        }
      }

      $(monthID).change(changeDaysInMonth);

      $(yearID).change(changeDaysInMonth);

    };

    // Change the cursor to act like a hyperlink when hovering over objects

    $.fn.showLinkCursor = function() {
      $(this).each(function() {
          $(this)
          .bind('mouseenter', function() {
            document.body.style.cursor = 'pointer';
          })
          .bind('mouseleave', function() {
            document.body.style.cursor = 'auto';
          })
        })
      return $(this);
    };

    // Stylise and mandatorise fields

    $.fn.skinInput = function(params) {
      params = $.extend( {mandatory : false}, params);
      $(this).each(function() {

        var fieldName = $(this).attr('name');

        var outerID = fieldName + '_outer';
        var statusID = fieldName + '_status';

        var classOuter = 'input_outer';
        var classStatus = 'input_status';
        var classHover = 'jQuery_hover';
        var classFocus = 'jQuery_hasFocus';
        var classOk = 'jQuery_input_ok';
        var classStatusOk = 'input_status_ok';

        var classNotOk = 'jQuery_input_bad';
        var classStatusNotOk = 'input_status_bad';

        $(this)
        .wrap('<div id="' + outerID + '" class="' + classOuter + '"></div>');

        if (params.mandatory == true) {
          $(this)
          .after('<div id="' + statusID + '" class="' + classStatus + '"></div>');
        }
        else {
          $(this)
          .after('<div id="' + statusID + '" class="' + classStatus + '"></div>')
        }

        $(this)
        .bind('focus', function(){
          if (params.mandatory == false) {
            $('#' + outerID)
            .removeClass(classOuter)
            .addClass(classFocus);
          }
          else {
            $('#' + outerID)
            .removeClass(classOk + ' ' + classNotOk + ' ' + classOuter)
            .addClass(classFocus);

            $('#' + statusID)
            .removeClass(classStatusOk + ' ' + classStatusNotOk);
          }
        })
        .bind('blur', function(){
          $('#' + outerID)
          .removeClass(classFocus);
          if (params.mandatory == false) {
            $('#' + outerID)
            .addClass(classOuter);
          }
        })
        .bind('keyup', function(){
          var length = $(this).val().length;
          var isGood = $(this).hasClass(classOk);
          var isBad = $(this).hasClass(classNotOk);

          if (params.mandatory == true) {
            if ((length > 0) && !(isGood)) {
              $('#' + statusID)
              .removeClass(classStatusNotOk)
              .addClass(classStatusOk);
            }
            else if((length == 0) && !(isBad)) {
              $('#' + outerID)
              .removeClass(classOk)
              .addClass(classNotOk);
              $('#' + statusID)
              .removeClass(classStatusOk);
            }
          }
        })
        .bind('blur', function(){
          var length = $(this).val().length;
          var isGood = $('#' + outerID).hasClass(classOk);
          var isBad = $('#' + outerID).hasClass(classNotOk);

          if (params.mandatory == true) {
            if ((length > 0) && !(isGood)) {
              $('#' + outerID)
              .addClass(classOuter);

              $('#' + statusID)
              .removeClass(classStatusNotOk)
              .addClass(classStatusOk);
            }
            else if((length == 0) && !(isBad)) {
              $('#' + outerID)
              .removeClass(classOk)
              .addClass(classNotOk);
              $('#' + statusID)
              .removeClass(classStatusOk)
              .addClass(classStatusNotOk);
            }
          }
        });

        $('#' + statusID)
        .css('height',$('#' + outerID).innerHeight());
      })
      return $(this);
    };

    var cache = [];
    // Arguments are image paths relative to the current page.
    $.preLoadImages = function() {
      var args_len = arguments.length;
      for (var i = args_len; i--;) {
        var cacheImage = document.createElement('img');
        cacheImage.src = arguments[i];
        cache.push(cacheImage);
      }
    }


})(jQuery);
