
var sgFun={map:function(fun,list){var res=[];if(sgFun._isArray(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(sgFun._isArray(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=new Array(list.length);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;},_isArray:function(el){var s=typeof el;if(s==='object'){if(el){if(typeof el.length==='number'&&!el.propertyIsEnumerable('length')&&typeof el.splice==='function'){return true;}}}
return false;}};
String.prototype.sgTrim=function(){return this.replace(/^\s*(\b.*\b|)\s*$/,"$1");};String.prototype.sgIsEmpty=function(){if(this.length===0||this.sgTrim()===""){return true;}else{return false;}};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){if(lang=='it'){var errMsg=sgForms._getErrMsg("Inserire un valore nel campo ##name##",field);}else{var errMsg=sgForms._getErrMsg("Fill in form field ##name##",field);}
if(fieldValue.sgIsEmpty()){return errMsg;}
return true;},_isEmail:function(field,fieldValue,lang){var strMailFilter=/^.+@.+\..{2,3}$/;var strIllegalChars=/[\(\)\<\>\,\;\:\\\/\*\-\+\=\"\[\]]/;var email=fieldValue;if(lang=='it'){var errMsg=sgForms._getErrMsg("##name## non valida",field);}else{var 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,'');if(lang=='it'){var errMsg=sgForms._getErrMsg("##name## non valida",field);}else{var errMsg=sgForms._getErrMsg("Invalid ##name##",field);}
if(phoneNumber&&isNaN(phoneNumber)){return errMsg;}
return true;},_isNumber:function(field,fieldValue,lang){var valueConv=fieldValue.replace(',','.');if(lang=='it'){var errMsg=sgForms._getErrMsg("Formato non valido per il campo ##name##",field);}else{var 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');if(lang=='it'){var errMsg=sgForms._getErrMsg("Formato non valido per il campo ##name##",field);}else{var 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(',','.');if(lang=='it'){var errMsg=sgForms._getErrMsg("Formato non valido per il campo ##name##",field);}else{var errMsg=sgForms._getErrMsg("Invalid format in field ##name##",field);}
if(valueConv&&isNaN(parseFloat(valueConv))){return errMsg;}
return true;},_isChecked:function(field,fieldValue,lang){if(lang=='it'){var errMsg=sgForms._getErrMsg("Selezionare il campo ##name##",field);}else{var 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){if(typeof el=='string')
var elRef=document.getElementById(el);else if(typeof el=='object')
var 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 attr in arg){if(attr=='style')
for(var sty in arg[attr])
tag[attr][sty]=arg[attr][sty];else
tag[attr]=arg[attr];};});return tag;};});