/**
 * MoCS - Modular Contact Suite 
 * Addons
 * 
 * "Viens-la, viens avec moi, ne pars pas sans moi"
 * 
 * @author Marco "DWJ" Solazzi 
 * @version 0.2b
 */
mocha.components.addons = "0.2b";
mochaSetup.lang.EN.onTypeCountMax = "Max field length reached";
mochaSetup.lang.IT.onTypeCountMax = "Numero massimo di caratteri raggiunto";

mochajs.implement({
	
	eventsTypes : {
		"select-one" : "change",
		"text" : ["keyup","blur","focus"],
		"textarea" : ["keyup","blur","focus"],
		"checkbox" : "click",
		"radio" : "click",
		"button" : "click"
	},
	
	getInputs : function (full) {
		var types = (full || false);
		var els = [];
		var text = this.getFormObj().fieldsByType("textarea");
		var input = this.getFormObj().fieldsByType("text");
		var selects = types ? this.getFormObj().fieldsByType("select-one") : {};
		for (prop in $merge (text,input,selects)) {
				els.push($EN(prop));
		}
		return els;
	},
	
	highlight: function (focus) {
		var _this = this;
		var f = this.getInputs(true);
		$b(f).on(["focus","blur"],function (e) {
			switch (e.type) {
				case "focus":
					$b(this).css("background-color",(focus ||"#FFFFCC") ); 
				break;
				case "blur":
					_this.validates.length > 0 ? _this.colorize() : $b(this).css("background-color","");
				break;
			}
		});
	},
	
	onTypeCount : function  (field,max) {
         var maxChar = max;
		 var _this = this; 
         var fieldE = this.getFields(field);
		 $b(fieldE).on('keyup', function(){
				var MaxCharF = maxChar;
				if (this.value.length >= MaxCharF ) {
					this.value = this.value.substring(0,maxChar);
					alert (_this.lang.onTypeCountMax+": "+MaxCharF);
                }
         });
	},
	
	firstFocus :  function (field, blank) {
		var fields = this.getFields(field);
		for (i=0;i<fields.length;i++) {
			var fieldE = fields[i];
			var getvalue = this.getFieldValue(fieldE.name);
			$b(fieldE).on('focus',function(){
						if ($b(this).val() == getvalue){
							this.value="";
						}
			});
			if ($type(blank) && blank == true) {			
				$b(FieldE).on("blur",function () {
					if ($b(this).val() == "") {
						$b(this).val(getvalue);
					}
				});
			}
		}
	},
	
	showOn : function  (fieldmod,fieldsh,when) {
         var modifier = this.getFields(fieldmod);
		 var _this = this;
		 var event = this.eventsTypes[$b(modifier).item(0,true).type];
		 $b(fieldsh).css("display","none");
	     if ($type(when) == "function") {
			var whenvalue = when;
	   	 } else {
		 	var whenvalue = function(el) {
				return (isArray(when) ? when : [when]).inArray($b(el).val());
			};
		 }
         $b(modifier).on(event,function (e) {
		 				   var showing = $b(fieldsh);
                           if (whenvalue.call(_this,this)) {
						   		showing.css("display","").item(0,true).focus();
						   } else {
						   		showing.css("display","none");
						   }
        });
	},
	
	enableOn : function  (modifier,enabling,when) {	
		var x = this.getFields(modifier);
		var event = this.eventsTypes[$b(x).item(0,true).type];
		
		$b(enabling).each(function (el) {
			el.disabled = true;
		});
		var whenvalue = isArray(when) ? when : [when];
		$b(x).on(event, function () {
			var disabled = whenvalue.inArray($b(this).val()) ? false : true;
			var en = $b(enabling);
			en.each(function (el) {
				el.disabled = disabled;
			});
		});
	},
	autoTags : function (opts) {
		var options = $merge({
			"buttons" : "btn_",
			"tables" : "tbl_",
			"blocks" : "blk_",
			"blockLabels" : "bll_",
			"required" : "mocha_req"
		},opts || {});
		var baseblock = { 
				"tag":"input",
				"type":"hidden"
				};
		var _this = this;
		//mark buttons
		var buttons = this.getFormObj().buttons;
		$b(buttons.buttons,buttons.submits,buttons.resets).each(function (el) {
			var name = $b(el).attr("name");
			$b(el).attr("name",options.buttons+name);
		});
		
		$b("#"+this.options.formId).get("fieldset").each(function (el,i) {
			var fieldLabels =  [];	
			var id = $b(el).attr("id");
			var els = $b(el).get("*",{"name":"*"}).each(function (f) {
			
				fieldLabels.checkAgainst('"'+f.name+'":"'+_this.getFieldLabel(f)+'"');
			
			}).mAttr("name",",");
			var block = $E($merge(baseblock,{
				"name" : options.blocks+( (id != "" && id != null) ? id : i),
				"value" : els
				}));
			$b(el).append(block);
			
			if ($b(el).get("legend").length() > 0) {
				var labelBlock = $E($merge(baseblock,{
				"name" : options.blockLabels+( (id != "" && id != null) ? id : i),
				"value" : $b(el).get("legend").txt()+"|{"+fieldLabels.join(",")+"}"
				}));
				$b(el).append(labelBlock);
			}
		});
		var buttons = this.getFormObj().buttons;
		$b(buttons.buttons,buttons.submits,buttons.resets).each(function (el) {
			var name = $b(el).attr("name");
			$b(el).attr("name",options.buttons+name);
		});
		
		// create the required list element
		var reqFields = $b("." + this.options.requiredKey).mAttr("name", ",");
		var reqContainer = $E($merge(baseblock,{
				"name" : options.required,
				"value" : reqFields
				}));
		$b("#" + this.options.formId).append(reqContainer);
	}
});