
var is_array=function(value){return Object.prototype.toString.apply(value)==='[object Array]';};if(typeof Object.create!=='function'){Object.create=function(oldObj){var F=function(){};F.prototype=oldObj;return new F();};}
Function.prototype.method=function(name,func){if(!this.prototype[name]){this.prototype[name]=func;}};String.method('trim',function(){return this.replace(/^\s*(\b.*\b|)\s*$/,"$1");});String.method('is_empty',function(){if(this.length===0||this.trim()===""){return true;}else{return false;}});
Function.prototype.method=function(name,func){if(!this.prototype[name]){this.prototype[name]=func;}};Function.method('curry',function(){var slice=Array.prototype.slice,args=slice.apply(arguments),that=this;return function(){return that.apply(null,args.concat(slice.apply(arguments)));};});Array.method('map',function(f){var res=[];for(var i=0,len=this.length;i<len;i++){res[res.length]=f(this[i]);}
return res;});var sgFun=function(){return{map:function(fun,list){var res=[];if(is_array(list)){for(var i=0,len=list.length;i<len;i++){res[i]=fun(list[i]);}}else{for(field in list){res[i]=fun(list[field]);}}
return res;},flatten:function(list){var res=[];for(var i=0,len=list.length;i<len;i++){if(is_array(list[i])){res=res.concat(sgFun.flatten(list[i]));}else{res[res.length]=list[i];}}
return res;},foldl:function(fun,list,acc){var result=acc;for(var i=0,len=list.length;i<len;i++){result=fun(list[i],result);}
return result;},foldr:function(fun,list,acc){var result=acc;for(var i=list.length-1;i>=0;i--){result=fun(list[i],result);}
return result;},filter:function(fun,list){var result=[];for(var i=0,len=list.length;i<len;i++){if(fun(list[i])){result[result.length]=list[i];}}
return result;},partial:function(fun){var fixed=arguments;var res=function(){var newargs=[];for(var arg in fixed){newargs[newargs.length]=arg;}
for(var arg2 in arguments){newargs[newargs.length]=arg2;}
return apply(fun,newargs);};return res;},any:function(fun,list){for(var i=0,len=list.length;i<len;i++){if(fun(list[i])){return true;}}
return false;},all:function(fun,list){for(var i=0,len=list.length;i<len;i++){if(!fun(list[i])){return false;}}
return true;},or:function(list){return this.any(function(el){return el;},list);},and:function(list){return this.all(function(el){return el;},list);},Y:function(le){return function(f){return f(f);}(function(f){return le(function(x){return f(f)(x);});});},lc:function(expression){var parsed=this._parse_lc(expression);var expr=parsed[1];var unbound=parsed[2];var theList=parsed[3];try{list=eval(theList);}catch(e){if(e instanceof ReferenceError){throw new SyntaxError("SyntaxError: undefined list "+theList);}}
var result=[];for(var i=0,len=list.length;i<len;i++){result[i]=eval(expr.replace(unbound,list[i]));}
return result;},_parse_lc:function(expession){var result=[];var re=/([A-Za-z0-9_()\[\],]+) for (\w+) in ([A-Za-z0-9_()\[\],]+)/;var match=re.exec(expession);if(!match){throw new SyntaxError("Invalid syntax: "+expession);}
return match;}};}();
var sgForms={_formLabels:{},_getErrMsg:function(baseMsg,frmElem){if(sgForms._formLabels[frmElem.id]){return baseMsg.replace('##name##',sgForms._formLabels[frmElem.id]);}else if(frmElem.title){return baseMsg.replace('##name##',frmElem.title);}else if(frmElem.name){return baseMsg.replace('##name##',frmElem.name);}else{return baseMsg;}},_notEmpty:function(field,fieldValue,lang){var errMsg;if(lang=='it'){errMsg=sgForms._getErrMsg("Inserire un valore nel campo ##name##",field);}else{errMsg=sgForms._getErrMsg("Fill in form field ##name##",field);}
if(fieldValue.is_empty()){return errMsg;}
return true;},_isEmail:function(field,fieldValue,lang){var strMailFilter=/^.+@.+\..{2,3}$/;var strIllegalChars=/[\(\)<>\,\;\:\\\/\*\-\+\=\"\[\]]/;var email=fieldValue;var errMsg;if(lang=='it'){errMsg=sgForms._getErrMsg("##name## non valida",field);}else{errMsg=sgForms._getErrMsg("Invalid ##name##",field);}
if(email&&!email.match(strIllegalChars)&&!strMailFilter.test(email)){return errMsg;}
return true;},_isPhone:function(field,fieldValue,lang){var phoneNumber=fieldValue.replace(/[\ \(\)<>\,\;\:\\\/\*\-\+\=\"\[\]]/g,'');var errMsg;if(lang=='it'){errMsg=sgForms._getErrMsg("##name## non valida",field);}else{errMsg=sgForms._getErrMsg("Invalid ##name##",field);}
if(phoneNumber&&isNaN(phoneNumber)){return errMsg;}
return true;},_isNumber:function(field,fieldValue,lang){var valueConv=fieldValue.replace(',','.');var errMsg;if(lang=='it'){errMsg=sgForms._getErrMsg("Formato non valido per il campo ##name##",field);}else{errMsg=sgForms._getErrMsg("Invalid format in field ##name##",field);}
if(valueConv&&isNaN(valueConv)){return errMsg;}
return true;},_isInt:function(field,fieldValue,lang){var valueConv=fieldValue.replace(',','a').replace('.','a');var errMsg;if(lang=='it'){errMsg=sgForms._getErrMsg("Formato non valido per il campo ##name##",field);}else{errMsg=sgForms._getErrMsg("Invalid format in field ##name##",field);}
if(valueConv&&isNaN(valueConv)){return errMsg;}
return true;},_isFloat:function(field,fieldValue,lang){var valueConv=fieldValue.replace(',','.');var errMsg;if(lang=='it'){errMsg=sgForms._getErrMsg("Formato non valido per il campo ##name##",field);}else{errMsg=sgForms._getErrMsg("Invalid format in field ##name##",field);}
if(valueConv&&isNaN(parseFloat(valueConv))){return errMsg;}
return true;},_isChecked:function(field,fieldValue,lang){var errMsg;if(lang=='it'){errMsg=sgForms._getErrMsg("Selezionare il campo ##name##",field);}else{errMsg=sgForms._getErrMsg("Check the field ##name##",field);}
if(!field.checked){return errMsg;}
return true;},_checkRule:function(field,fieldValue,lang){inner=function(rule){if(rule=='notEmpty'){return sgForms._notEmpty(field,fieldValue,lang);}
if(rule=='email'){return sgForms._isEmail(field,fieldValue,lang);}
if(rule=='number'){return sgForms._isNumber(field,fieldValue,lang);}
if(rule=='integer'){return sgForms._isInt(field,fieldValue,lang);}
if(rule=='float'){return sgForms._isFloat(field,fieldValue,lang);}
if(rule=='isChecked'){return sgForms._isChecked(field,fieldValue,lang);}
if(rule=='phone'){return sgForms._isPhone(field,fieldValue,lang);}
try{return rule(field,fieldValue,lang);}catch(e){return e;}};return inner;},_isValid:function(rules,lang){inner=function(field,acc){try{var fieldRef=document.getElementById(field);var rulesToCheck=rules[field];results=sgFun.map(sgForms._checkRule(fieldRef,fieldRef.value,lang),rulesToCheck);return acc.concat(sgFun.filter(function(val){return val!==true;},results));}catch(e){return acc.concat("Error in rule "+field+": "+e.toString());}};return inner;},validate:function(rules,lang){sgForms._formLabels={};var lbls=document.getElementsByTagName("label");for(var i=0;i<lbls.length;i++){sgForms._formLabels[lbls[i].htmlFor]=lbls[i].innerHTML;}
var keys=[];for(var field in rules){keys[keys.length]=field;}
return sgFun.foldl(sgForms._isValid(rules,lang),keys,[]);},validateAlert:function(rules){var lang='en';if(arguments.length>1){lang=arguments[1];}
result=sgForms.validate(rules,lang);if(result.length>0){alert(result.join('\n'));return false;}
return true;},validateBrString:function(rules){var lang='en';if(arguments.length>1){lang=arguments[1];}
result=sgForms.validate(rules,lang);if(result){return result.join('<br>');}
return"";},validateString:function(rules){var lang='en';if(arguments.length>1){lang=arguments[1];}
result=sgForms.validate(rules,lang);if(result){return result.join('\n');}
return"";}};
var sgHTML={parseKVPairs:function(kvStr,sep){var dict={};var pairs=kvStr.split(sep);for(var i=0,len=pairs.length;i<len;i++){var kv=pairs[i].split('=');open=kv[0].indexOf('[');close=kv[0].indexOf(']',open);if(open!==-1&&close!==-1){var key=kv[0].substr(0,open);dict[key]=dict[key]||[];if(open+1===close){dict[key][dict[key].length]=kv[1];}else{idx=kv[0].substr(open+1,(close-(open+1)));dict[key][idx]=kv[1];}}else{dict[kv[0]]=kv[1];}}
return dict;},parseQueryStr:function(queryStr){var qstr=queryStr||location.search.substr(1);return this.parseKVPairs(qstr,'&');},toggleClass:function(el,className){var elRef=null;if(typeof el==='string'){elRef=document.getElementById(el);}else if(typeof el==='object'){elRef=el;}
var current=elRef.className.split(' ');var newClass=[];var done=false;for(var i=0,len=current.length;i<len;i++){if(current[i]===className){done=true;}else{newClass[newClass.length]=current[i];}}
if(!done){newClass[newClass.length]=className;}
elRef.className=newClass.join(" ");},roll:function(el,className){this.toggleClass(el,className);}};function _each(a,f){for(var i=0,l=a.length;i<l;i++){f(a[i]);}}
_each('a big blockquote br b center code div em form h1 h2 h3 h4 h5 h6 hr img iframe input i li ol option pre p script select small span strong style sub sup table tbody td textarea tr ul u'.split(' '),function(label){sgHTML[label]=function(){var tag=document.createElement(label);_each(arguments,function(arg){if(arg.nodeType){tag.appendChild(arg);}else if(typeof arg=='string'||typeof arg=='number'){tag.innerHTML+=arg;}else{for(var i=0,len=arg.length;i<len;i++){var attr=arg[i];if(attr=='style'){var styleList=arg[attr];for(var j=0,len2=styleList.length;j<len2;j++){var sty=styleList[j];tag[attr][sty]=styleList[sty];}}else{tag[attr]=arg[attr];}}}});return tag;};});