var sgjs={version: '0.5.1'};

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=[];if(typeof f!="function"){throw new TypeError("TypeError: f is not a function");}
for(var i=0,len=this.length;i<len;i++){res[res.length]=f(this[i]);}
return res;});Array.method('foldl',function(f,acc){var result=acc;if(typeof f!="function"){throw new TypeError("TypeError: f is not a function");}
for(var i=0,len=this.length;i<len;i++){result=f(this[i],result);}
return result;});Array.method('foldr',function(f,acc){var result=acc;if(typeof f!="function"){throw new TypeError("TypeError: f is not a function");}
for(var i=this.length-1;i>=0;i--){result=f(this[i],result);}
return result;});Array.method('filter',function(f){if(typeof f!="function"){throw new TypeError("TypeError: f is not a function");}
var result=[];for(var i=0,len=this.length;i<len;i++){if(f(this[i])){result[result.length]=list[i];}}
return result;});Array.method('flatten',function(){var res=[];for(var i=0,len=this.length;i<len;i++){if(is_array(this[i])){res=res.concat(this[i].flatten());}else{res[res.length]=this[i];}}
return res;});Array.method('any',function(f){if(typeof f!="function"){throw new TypeError("TypeError: f is not a function");}
for(var i=0,len=this.length;i<len;i++){if(f(this[i])){return true;}}
return false;});Array.method('all',function(f){if(typeof f!="function"){throw new TypeError("TypeError: f is not a function");}
for(var i=0,len=this.length;i<len;i++){if(!f(this[i])){return false;}}
return true;});var sgFun=function(){return{map:function(f,list){var res=[];if(is_array(list)){res=list.map(f);}else{for(field in list){if(list.hasOwnProperty(field)){res[i]=f(list[field]);}}}
return res;},flatten:function(list){return list.flatten();},foldl:function(f,list,acc){return list.foldl(f,acc);},foldr:function(f,list,acc){return list.foldr(f,acc);},filter:function(f,list){return list.filter(f);},partial:function(f){if(typeof f!="function"){throw new TypeError("TypeError: f is not a function");}
var slice=Array.prototype.slice;var fixed=slice.apply(arguments);fixed.splice(0,1);var res=function(){var newargs=slice.apply(arguments);var allargs=fixed.concat(newargs);return f.apply(null,allargs);};return res;},any:function(f,list){return list.any(f);},all:function(f,list){return list.all(f);},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(lcObj){var funArg=lcObj['do'];var theList=lcObj['in'];var test=lcObj['if'];if(typeof funArg!="function"){throw new TypeError("TypeError: 'do' is not a function");}
if(!is_array(theList)){throw new TypeError("TypeError: 'in' is not an Array");}
if(test!==undefined&&typeof test!="function"){throw new TypeError("TypeError: 'if' is not a function");}
var result=[];for(var i=0,len=theList.length;i<len;i++){if(test===undefined){result[result.length]=funArg(theList[i]);}else if(test(theList[i])){result[result.length]=funArg(theList[i]);}}
return result;}};}();
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){if(rules.hasOwnProperty(field)){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;};});