/*--------------------------------------------------------------------------
| Proto Check, version 1.0
| (c) 2008 Neil Harrison
| Released under the terms and conditions of the
| Creative Commons Attribution-Share Alike
| http://creativecommons.org/licenses/by-sa/3.0/
*--------------------------------------------------------------------------*/
ProtoCheck = Class.create({
   initialize: function(options) {
      this.options = {
         errorClass:        		 'pc_error',
         checkClass:             'pc_checkbox',
         radioClass:             'pc_radiobutton',
         checkOnClass:           'pc_check_checked',
         checkOffClass:          'pc_check_unchecked',
         radioOnClass:           'pc_radio_checked',
         radioOffClass:          'pc_radio_unchecked',
         checkOnErrorClass:      'pc_check_checked_error',
         checkOffErrorClass:     'pc_check_unchecked_error',
         radioOnErrorClass:      'pc_radio_checked_error',
         radioOffErrorClass:     'pc_radio_unchecked_error',
         checkOnDisabledClass:   'pc_check_checked_disabled',
         checkOffDisabledClass:  'pc_check_unchecked_disabled',
         radioOnDisabledClass:   'pc_radio_checked_disabled',
         radioOffDisabledClass:  'pc_radio_unchecked_disabled',
         focusClass:             'pc_focus'
      };
      Object.extend(this.options, options || { });
      this.classez               = [];
      this.errClassez            = [];
      this.disClassez            = [];
      this.classez.checkbox      = {"on": this.options.checkOnClass, 					"off": this.options.checkOffClass};
			this.errClassez.checkbox	 = {"on": this.options.checkOnErrorClass, 		"off": this.options.checkOffErrorClass};
      this.disClassez.checkbox   = {"on": this.options.checkOnDisabledClass, 	"off": this.options.checkOffDisabledClass};
      this.classez.radio         = {"on": this.options.radioOnClass, 					"off": this.options.radioOffClass};
			this.errClassez.radio			 = {"on": this.options.radioOnErrorClass, 		"off": this.options.radioOffErrorClass};
      this.disClassez.radio      = {"on": this.options.radioOnDisabledClass, 	"off": this.options.radioOffDisabledClass};
      var elements = $$("label."+this.options.checkClass).concat($$("label."+this.options.radioClass));
      elements.each(function(label) {
         var element = label.down("input[type!=hidden]");
				 if(element) {
	         element.setStyle({position:'absolute',left:'-9999px'});
	         if (element.checked) {
	            this.check(element, label);
	         } else {
	            this.uncheck(element, label);
	         }
	         //if (!element.disabled) {
	            element.observe("click", function(ev) {
	               this.click(ev);
	            }.bind(this));
	            element.observe("focus", function(ev) {
	               this.focus(ev);
	            }.bind(this));
	            element.observe("blur", function(ev) {
	               this.blur(ev);
	            }.bind(this));
	            if (this.fixIE) {
	               label.observe("click", function(ev) {
	                  this.clickIE6(ev);
	               }.bind(this));
	            }
	         //}
				}
      }.bind(this));
   },
   fixIE: (function(agent){
      var version = new RegExp('MSIE ([\\d.]+)').exec(agent);
      return version ? (parseFloat(version[1]) <= 6) : false;
   })(navigator.userAgent),
   check: function(element, label) {
			if(label.hasClassName(this.options.errorClass)) {
				label.removeClassName(this.options.errorClass);
			}
			var css = element.disabled ? this.disClassez[element.type] : this.classez[element.type];
			label.addClassName(css.on).removeClassName(css.off);
	 },
	 uncheck: function(element, label) {
			var css = element.disabled ? this.disClassez[element.type] : this.classez[element.type];
			label.addClassName(css.off).removeClassName(css.on);
   },
   focus: function(ev) {
			if(!ev.element.disabled) {
				var label = ev.element().up();
				label.addClassName(this.options.focusClass);
			}
   },
   blur: function(ev) {
			if(!ev.element.disabled) {
				var label = ev.element().up();
				label.removeClassName(this.options.focusClass);
			}
   },
   click: function(ev) {
			if(!ev.element.disabled) {
				var element = ev.element();
				var label = element.up();
				this.update(ev, element, label);
			}
   },
   clickIE6: function(ev) {
      var label = ev.element();
      if (label.nodeName == "LABEL") {
         var element = label.down();
         element.click();
      }
   },
   update: function(ev, element, label) {
      if (label.hasClassName(this.options.checkClass)) {
         if (element.checked) {
            this.check(element, label);
         } else {
            this.uncheck(element, label);
         }
      }
      if (label.hasClassName(this.options.radioClass)) {
         $$("input[name='"+element.name+"']").each(function(but) {
						// Added the following 'if' to destroy the problem on the register page if the unchecked image being set to the hidden radiobutton, and causing
						// the background of the parent div to be blanketed with the unchecked image.  Rob 10, Protocheck 0.  WIN!
						if(but.style.display != 'none') {
	            if (element != but) {
  	             this.uncheck(but, but.up());
    	        }
						}
         }.bind(this));
         this.check(element, label);
      }
      element.focus();
   }
});
