/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

   MU (MdsUtils)

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

if(typeof(MU)=='undefined'){
	var MU={};
}

MU.debugEnabled=false;

MU.regExp={
	'classNameReplace':'^(.*[ ])?(%1$s)([ ].*)?$',
	'classNameSearch':'(^|[ ])(%1$s)($|[ ])'
};

MU.typeRadio='radio';
MU.typeRadioList='radioList';
MU.typeUnknown='unknown';

MU.$=function(str){
	var rv=null;
	if(str&&MU.isString(str)){
		rv=document.getElementById(str);
	}
	return rv;
};

MU.$className=function(cn,elm,tag){
	var tag=tag||'*';
	var elm=elm||document;
	var l=(tag=='*'&&elm.all)?elm.all:elm.getElementsByTagName(tag);
	var i,rv=[];
	for(i=0;i<l.length;i++){
		if(MU.classNameMatch(l[i],cn)){
			rv.push(l[i]);
		}
	}
	return rv;
};

MU.$lang=function(id){
	var rv=MU.sprintf('#%1$s#',id);
	var t=null;
	eval('t=typeof(lg_'+id+')!="undefined";');
	if(t) eval('rv=lg_'+id+';');
	return rv;
};

MU.$tag=function(tag,container){
	var rv=new Array();
	if(tag&&MU.isString(tag)){
		if(container&&MU.isString(container)) container=MU.$(container);
		if(!container) container=document;
		rv=container.getElementsByTagName(tag);
	}
	return rv;
};

MU.arrayHasKey=function(arr,str){
	var rv=false;
	if(arr){
		rv=(typeof(arr[str])!='undefined');
	}
	return rv;
};

MU.arrayHasValue=function(arr,str){
	var rv=false;
	if(arr&&arr.length){
		var i;
		for(i in arr){
			if(arr[i]==str){
				rv=true;
				break;
			}
		}
	}
	return rv;
};

MU.classNameAdd=function(elm,cn){
	var rv=false;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		if(rv=!MU.classNameMatch(elm,cn)){
			var c=MU.classNameGet(elm);
			c+=((c.length>0)?' ':'')+cn;
			elm.className=c;
		}
	}
	return rv;
};

MU.classNameGet=function(elm){
	var rv='';
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if((navigator.userAgent.indexOf('MSIE 7')!=-1)&&MU.formTagIsSelect(elm)){
		rv=elm.getAttribute('class');
	}else if(typeof(elm.className)!='undefined'&&MU.isString(elm.className)){
		rv=elm.className;
	}
	if(!MU.isString(rv)){
		rv='';
	}
	return rv;
};

MU.classNameMatch=function(elm,cn){
	var rv=false;
	if(elm&&this.isString(elm)) elm=this.$(elm);
	if(elm&&this.classNameGet(elm)&&this.isString(cn)){
		var i,c=this.classNameGet(elm);
		var cns=this.classNamesGetFromPattern(c,cn);
		for(i in cns){
			if(c.match(this.sprintf(this.regExp.classNameSearch,cns[i]))){
				rv=cns;
				break;
			}
		}
	}
	return rv;
};

MU.classNameRemove=function(elm,cn){
	var rv=false;
	if(elm&&this.isString(elm)) elm=this.$(elm);
	if(elm&&this.classNameGet(elm)){
		var cns=this.classNameMatch(elm,cn);
		if(cns){
			var i,r,c=this.classNameGet(elm);
			for(i in cns){
				r=new RegExp(this.sprintf(this.regExp.classNameReplace,cns[i]),'g');
				c=c.replace(r,'$1$3');
			}
			this.classNameSet(elm,this.trim(c));
			rv=(c!=this.classNameGet(elm));
		}
	}
	return rv;
};

MU.classNameSet=function(elm,cn){
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if((navigator.userAgent.indexOf('MSIE 7')!=-1)&&MU.formTagIsSelect(elm)){
		elm.setAttribute('class',cn);
	}else if(typeof(elm.className)!='undefined'&&MU.isString(elm.className)){
		elm.className=cn;
	}
};

MU.classNameSwitch=function(elm,cn,force){
	var rv=false;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		var c=MU.classNameGet(elm);
		var add=!MU.classNameMatch(elm,cn);
		if(typeof(force)!='undefined') add=force;
		rv=(add)?this.classNameAdd(elm,cn):MU.classNameRemove(elm,cn);
	}
	return rv;
};

MU.classNamesGetFromPattern=function(cn,pattern){
	var rv=[];
	if(pattern.indexOf('*')==-1){
		rv=[pattern];
	}else{
		var i,l=cn.split(' ');
		var r=new RegExp('^'+pattern.replace('*','.*')+'$');
		for(i in l){
			l[i]=MU.trim(l[i]);
			if(r.test(l[i])){
				rv.push(l[i]);
			}
		}
	}
	return rv;
}

MU.dateCheck=function(year,month,day){
	var rv=false;
	if(month&&MU.isString(month)) month=parseInt(month.replace(/^0/,''));
	if(day&&MU.isString(day)) day=parseInt(day.replace(/^0/,''));
	var d=new Date();
	d.setFullYear(year,(month-1),day);
	rv=(month>=1&&month<=12&&year>=1&&year<=32767&&(d.getMonth()+1)==month&&day<32);
	return rv;
};

MU.display=function(elm){
	var rv=null;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		var argv=arguments;
		var swap='swap';
		var show=(typeof(argv[1])!='undefined')?argv[1]:swap;
		var disp=(show==true||(show==swap&&elm.style.display=='none'))?'':'none';
		elm.style.display=disp;
		rv=(disp=='');
	}
	return rv;
};

MU.debug=function(str){
	if(this.debugEnabled){
		var elm=MU.$('appDebug');
		if(elm){
			elm.innerHTML='<div>'+str+'</div>'+elm.innerHTML;
		}
	}
}

MU.dump=function(v){
	var depthMax=(typeof(arguments[1])=='undefined')?1:arguments[1];
	var depth=(typeof(arguments[2])=='undefined')?0:arguments[2];
	var i,rv='',indent='';
	for(i=0;i<=depth;i++) indent+='        ';
	var t=typeof(v);
	if(v==null){
		rv+='[null]';
	}else if(t=='number'){
		rv+=MU.sprintf('[number] %1$s',v);
	}else if(t=='string'){
		rv+=MU.sprintf('[string/%2$s] %1$s',v,v.length);
	}else if(t=='boolean'){
		rv+=MU.sprintf('[boolean] %1$s',v);
	}else if(t=='object'){
		rv+=MU.sprintf('[object/%1$s]\n',MU.sizeof(v));
		if(depth<=depthMax){
			for(i in v){
				try{
					rv+=indent+i+' : '+MU.dump(v[i],depthMax,depth+1)+'\n';
				}catch(e){
					rv+=indent+i+' : [Failed, can\'t read this property]\n';
				}
			}
		}else{
			rv=MU.trim(rv)+' [Depth max reached ('+depthMax+')]';
		}
	}else{
		rv+=t;
	}
	return MU.trim(rv);
};

MU.dumpAlert=function(v){
	var depthMax=(typeof(arguments[1])=='undefined')?1:arguments[1];
	var rv=MU.dump(v,depthMax);
	alert(rv);
	return rv;
};

MU.elementGetInfo=function(elm){
	var rv=false;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		var rv={
			'height':elm.offsetHeight,
			'width':elm.offsetWidth,
			'top':elm.offsetTop, //TODO: Need fix
			'left':elm.offsetLeft //TODO: Need fix
		};
	}
	return rv;
};

MU.eventAddListener=function(elm,type,func,capture){
	var rv=null;
	if(MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		if(elm.addEventListener&&MU.isFunction(elm.addEventListener)){
			rv=elm.addEventListener(type,func,capture);
		}else if(elm.attachEvent){
			rv=elm.attachEvent('on'+type,func);
		}
	}
	return rv;
};

MU.eventGet=function(evt){
	var rv=evt||window.event;
	return rv;
};

MU.eventGetTarget=function(evt){
	evt=MU.eventGet(evt);
	var rv=evt.target||evt.srcElement;
	return rv;
};

MU.eventGetType=function(evt){
	return evt.type;
};

MU.eventPreventDefault=function(evt){
	var rv=null;
	evt=MU.eventGet(evt);
	if(evt.preventDefault){
		rv=evt.preventDefault();
	}else{
		evt.returnValue=false;
		evt.cancelBubble=true;
		rv=true;
	}
	return rv;
};

MU.eventRemoveListener=function(elm,type,func,capture){
	var rv=null;
	if(MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		if(elm.removeEventListener&&MU.isFunction(elm.removeEventListener)) rv=elm.removeEventListener(type,func,capture);
		else if(elm.detachEvent&&MU.isFunction(elm.detachEvent)) rv=elm.detachEvent('on'+type,func);
	}
	return rv;
};

MU.eventStart=function(elm,type,bubbles,cancelable){
	var rv=null;
	if(MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		if(document.createEvent){
			if(typeof(bubbles)=='undefined') bubbles=false;
			if(typeof(cancelable)=='undefined') cancelable=true;
			var evt=document.createEvent('Events');
			evt.initEvent(type,bubbles,cancelable);
			rv=elm.dispatchEvent(evt);
		}else{
			rv=elm.fireEvent('on'+type);
		}
	}
	return rv;
};

MU.flashWriteSwf=function(htmlId,width,height,movie,bgcolor,transparent){
	var o=MU.$(htmlId);
	if(o){
		//params
		var argv=MU.flashWriteSwf.arguments;
		if(typeof(argv[6])!='undefined') var params=argv[6];
		else var params=new Array();
		var givenParam=false;
		if(params.sizeof!=0){
			var i;
			var j=0;
			var paramString=new Array();
			for(i in params){
				paramString[j]=i+'='+params[i];
				j++;
			}
			paramString=paramString.join('&');
			givenParam=true;
		}
		// swf object pattern
		var swfPattern='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="%1$s" height="%2$s" align="middle">\n';
		swfPattern+='<param name="allowScriptAccess" value="sameDomain" />\n';
		swfPattern+='<param name="movie" value="%3$s" />\n';
		swfPattern+='<param name="quality" value="high" />\n';
		swfPattern+='<param name="bgcolor" value="%4$s" />\n';
		swfPattern+='<param name="menu" value="false" />\n';
		if(transparent){
			swfPattern+='<param name="wmode" value="transparent" />\n';
		}else{
			swfPattern+='<param name="wmode" value="opaque" />\n';
		}
		if(givenParam)	swfPattern+='<param name="flashvars" value="%5$s" />\n';
		swfPattern+='<embed src="%3$s" menu="false" quality="high"';
		if(transparent){
			swfPattern+=' wmode="transparent" ';
		}else{
			swfPattern+=' wmode="opaque" ';
		}
		if(givenParam)	swfPattern+=' flashvars="%5$s" ';
		swfPattern+='bgcolor="%4$s" width="%1$s" height="%2$s" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />\n';
		swfPattern+='</object>';
		// write swf
		if(givenParam) var content=MU.sprintf(swfPattern,width,height,movie,bgcolor,paramString);
		else  var content=MU.sprintf(swfPattern,width,height,movie,bgcolor);
		o.innerHTML=content;
		return(true);
	}
	alert('"'+htmlId+'" id doesn\'t exists !\n Function can\'t write SWF.');
}

MU.flashGetVersion=function(){
	var flashVer='0';
	if(navigator.plugins!=null&&navigator.plugins.length>0){
		if(navigator.plugins['Shockwave Flash 2.0']||navigator.plugins['Shockwave Flash']){
			var swVer2=navigator.plugins['Shockwave Flash 2.0']?' 2.0':'';
			var flashDescription=navigator.plugins['Shockwave Flash'+swVer2].description;
			var descArray=flashDescription.split(' ');
			var tempArrayMajor=descArray[2].split('.');
			var versionMajor=tempArrayMajor[0];
			var versionMinor=tempArrayMajor[1];
			var versionRevision=descArray[3];
			if(versionRevision==''){
				versionRevision=descArray[4];
			}
			if(versionRevision[0]=='d'){
				versionRevision=versionRevision.substring(1);
			}else if(versionRevision[0]=='r'){
				versionRevision=versionRevision.substring(1);
				if(versionRevision.indexOf('d')>0){
					versionRevision=versionRevision.substring(0,versionRevision.indexOf('d'));
				}
			}
			flashVer=versionMajor+'.'+versionMinor+'.'+versionRevision;
		}
	}else if(navigator.userAgent.toLowerCase().indexOf('webtv/2.6')!=-1) flashVer='4';
	else if(navigator.userAgent.toLowerCase().indexOf('webtv/2.5')!=-1) flashVer='3';
	else if(navigator.userAgent.toLowerCase().indexOf('webtv')!=-1) flashVer='2';
	else{
		var isIE=(navigator.appVersion.indexOf('MSIE')!=-1)?true:false;
		var isWin=(navigator.appVersion.toLowerCase().indexOf('win')!=-1)?true:false;
		var isOpera=(navigator.userAgent.indexOf('Opera')!=-1)?true:false;
		if(isIE&&isWin&&!isOpera){
			var axo,e;
			try{
				axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
				flashVer=axo.GetVariable("$version");
			}catch(e){}
			if(!flashVer){
				try{
					axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
					flashVer='6.0.21.0';
					axo.AllowScriptAccess="always";
					flashVer=axo.GetVariable("$version");
				}catch(e){}
			}
			if(!flashVer){
				try{
					axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
					flashVer=axo.GetVariable("$version");
				}catch(e){}
			}
			if(!flashVer){
				try{
					axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
					flashVer='3.0.18.0';
				}catch(e){}
			}
			if(!flashVer){
				try{
					axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
					flashVer='2.0.0.11';
				}catch(e){
					flashVer='0';
				}
			}
		}
	}
	if(!MU.isString(flashVer)) flashVer=MU.sprintf('%1$s',flashVer);
	flashVer=flashVer.replace(/^[a-z]+\s*/gi,'');
	flashVer=flashVer.replace(/,/g,'.');
	return flashVer;
};

MU.formElementsGetList=function(f){
	var rv=new Array();
	if(f&&MU.isString(f)) f=MU.$(f);
	if(f&&f.nodeName&&MU.isString(f.nodeName)&&f.nodeName.toLowerCase()=='form'){
		var elm,i;
		for(i=0;i<f.elements.length;i++){
			elm=f.elements[i];
			rv[rv.length]=elm;
		}
	}
	return rv;
};

MU.formElementsGetValues=function(f){
	var rv={};
	if(f&&MU.isString(f)) f=MU.$(f);
	if(f&&f.nodeName&&MU.isString(f.nodeName)&&f.nodeName.toLowerCase()=='form'){
		var l=MU.formElementsGetList(f);
		var elm,i,r,n,t,v;
		for(i=0;i<l.length;i++){
			elm=l[i];
			n=(elm.name&&MU.isString(elm.name))?elm.name:'elm'+i;
			if(r=n.match(/^(.+)\[(.*)\]$/)){
				n=r[1];
				if(typeof(rv[n])=='undefined'){
					rv[n]={};
				}
				t=(typeof(r[2])!='undefined'&&r[2])?r[2]:MU.sizeof(rv[n]);
				v=MU.formTagGetValue(elm);
				if(v!=null) rv[n][t]=v;
			}else{
				v=MU.formTagGetValue(elm);
				if(v!=null) rv[n]=v;
			}
		}
	}
	return rv;
};

MU.formTagCheckboxGetValue=function(elm,m){
	var rv=null;
	if(m||(elm&&elm.checked)) rv=elm.value;
	return rv;
};

MU.formTagGetType=function(elm){
	var rv=MU.typeUnknown;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		if(typeof(elm.type)!='undefined'){
			rv=elm.type;
		}else{
			rv=MU.typeRadioList;
		}
	}
	return rv;
};

MU.formTagGetValue=function(elm){
	var rv=null;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		var t=MU.formTagGetType(elm);
		if(t!=MU.typeUnknown){
			if(t=='select-one'||t=='select-multiple') rv=MU.formTagSelectGetValue(elm);
			else if(t=='checkbox') rv=MU.formTagCheckboxGetValue(elm);
			else if(t==MU.typeRadio||t==MU.typeRadioList) rv=MU.formTagRadioGetValue(elm);
			else if(typeof(elm.value)!='undefined') rv=elm.value; /* text, password, button, hidden, file, submit, image */
		}
	}
	return rv;
};

MU.formTagSetValue=function(elm,val){
	var rv=false,t;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		if(t=MU.formTagGetType(elm)){
			if(MU.formTagIsSelect(elm)) MU.formTagSelectSetValue(elm,val);
			else elm.value=val;
			rv=(MU.formTagGetValue(elm)==val);
		}
	}
	return rv;
};

MU.formTagIsSelect=function(elm){
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	var r=new RegExp('^select','i');
	var rv=r.test(MU.formTagGetType(elm));
	return rv;
};

MU.formTagRadioGetValue=function(elm){
	var rv=null;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&(MU.formTagGetType(elm)==MU.typeRadio)) elm=elm.form.elements[elm.name];
	if(elm&&(MU.formTagGetType(elm)==MU.typeRadioList)){
		var i;
		for(i=0;i<elm.length;i++){
			if(elm[i].checked){
				rv=elm[i].value;
				break;
			}
		}
	}
	return rv;
};

MU.formTagRadioReset=function(elm){
	var rv=0;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&(MU.formTagGetType(elm)!=MU.typeRadio)) elm=elm.form.elements[elm.name];
	if(elm&&(MU.formTagGetType(elm)==MU.typeRadioList)){
		var i;
		for(i=0;i<elm.length;i++){
			if(elm[i].checked) rv++;
			elm[i].checked=false;
		}
	}
	return rv;
};

MU.formTagSelectCreate=function(id,values,selected){/* ,attributes,prefix */
	var i,j,l;
	var c='ctnr_'+id;
	var argv=arguments;
	var attributes=argv[3]||{};
	var prefix=argv[4]||null;
	document.write('<span id="'+c+'" class="selectContainer"></span>');
	var s=document.createElement('select');
	s.setAttribute('name',id);
	s.setAttribute('id',id);
	for(i in attributes){
		s.setAttribute(i,attributes[i]);
	}
	if(typeof(values)!='undefined'){
		for(i in values){
			j=i;
			if(prefix&&j.indexOf(prefix)==0) j=j.substring(prefix.length);
			l=s.options.length;
			s.options[l]=new Option(values[i],j,(selected==j));
			s.options[l].selected=(selected==j);
		}
	}
	var rv=MU.$(c).appendChild(s);
	return rv;
};

MU.formTagSelectGetValue=function(elm){
	var rv=null;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&MU.formTagIsSelect(elm)){
		if((!isNaN(elm.selectedIndex))&&elm[elm.selectedIndex]&&typeof(elm[elm.selectedIndex].value)!='undefined'){
			rv=elm[elm.selectedIndex].value;
		}
	}
	return rv;
};

MU.formTagSelectOptionAdd=function(elm,value,text,selected,position){
	var rv=null;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&MU.formTagIsSelect(elm)){
		var current=elm.selectedIndex;
		if(typeof(selected)!='boolean') selected=false;
		var opt=new Option(text,value);
		if(typeof(position)!='number') position=elm.options.length;
		var i,j,n=new Array;
		if(position<0) position=0;
		if(position>elm.options.length) position=elm.options.length;
		for(i=0,j=0;i<=elm.options.length;i++,j++){
			if(position==i){
				rv=j;
				n[j]=opt;
				j++;
			}
			if(i<elm.options.length) n[j]=elm.options[i];
		}
		i=0;
		while(i<65536&&elm.options.length){
			elm.options[0]=null;
			i++;
		}
		for(i=0;i<n.length;i++){
			elm.options[i]=n[i];
		}
		elm.selectedIndex=(selected)?rv:current;
	}
	return rv;
};

MU.formTagSelectOptionRemove=function(elm,value){
	var rv=null;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&MU.formTagIsSelect(elm)){
		var i;
		var l=elm.options.length;
		for(i=0,rv=0;i<l;i++){
			if(elm.options[i].value==value){
				elm.options[i]=null;
				rv++;
			}
		}
	}
	return rv;
};

MU.formTagSelectOptionRemoveAll=function(elm){
	var rv=null;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&MU.formTagIsSelect(elm)){
		rv=0;
		while(elm.options.length!=0){
			elm.options[0]=null;
			rv++;
		}
	}
	return rv;
};

MU.formTagSelectSetValue=function(elm,v){
	var rv=-1;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&(!isNaN(elm.selectedIndex))){
		var i;
		for(i=0;i<elm.length;i++){
			if(typeof(elm[i].value)!='undefined'&&elm[i].value==v){
				elm.selectedIndex=i;
				rv=i;
			}
		}
	}
	return rv;
};

MU.is_=function(re,v){
	var rv=null;
	if(re&&re.test&&MU.isFunction(re.test)){
		rv=re.test(v);
	}
	return rv;
};

MU.isArray=function(arr){
	var rv=(typeof(arr)=='object');
	return rv;
};

MU.isEmail=function(str,strict){
	var rv=false;
	if(str&&MU.isString(str)){
		if(!strict){
			strict=true;
			str=str.toLowerCase();
		}
		rv=(MU.is_(/^([a-z0-9])+([\.]?[_a-z0-9-]+)*@([a-z0-9]{1})([\.]?[a-z0-9-]+)+[\.]{1}[a-z]{2,6}$/,str));
	}
	return rv;
};

MU.isFunction=function(func){
	var rv=(typeof(func)=='function');
	return rv;
};

MU.isLink=function(str){
	var rv=false;
	if(str&&MU.isString(str)){
		var r=new RegExp('^(https?|ftps?|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$','i');
		rv=(MU.is_(r,str));
	}
	return rv;
};

MU.isNumber=function(num,strict){
	if(strict) rv=(num&&typeof(num)=='number');
	else rv=!isNaN(num);
	return rv;
};

MU.isString=function(str){
	var rv=(typeof(str)=='string');
	return rv;
};

MU.numberFormat=function(number,decimals,decimalPoint,thousandsSeparator){
  /* From phpjs.org */
  var n=!isFinite(+number)?0:+number;
  var prec=!isFinite(+decimals)?0:Math.abs(decimals);
  var sep=(typeof(thousandsSeparator)==='undefined')?',':thousandsSeparator;
  var dec=(typeof(decimalPoint)==='undefined')?'.':decimalPoint;
  var s='';
  var toFixedFix=function(n,prec){
    var k=Math.pow(10,prec);
    return ''+Math.round(n*k)/k;
  };
  s=(prec?toFixedFix(n,prec):''+Math.round(n)).split('.');
  if(s[0].length>3){
    s[0]=s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,sep);
  }
  if((s[1]||'').length<prec){
    s[1]=s[1]||'';
    s[1]+=new Array(prec-s[1].length+1).join('0');
  }
  return s.join(dec);
};

MU.pageGetSize=function(){
	var scrollX=0,scrollY=0,windowWidth=0,windowHeight=0;
	if(window.innerHeight&&window.scrollMaxY){
		scrollX=document.body.scrollWidth;
		scrollY=window.innerHeight+window.scrollMaxY;
	}else if(document.body.scrollHeight>document.body.offsetHeight){
		scrollX=document.body.scrollWidth;
		scrollY=document.body.scrollHeight;
	}else{
		scrollX=document.body.offsetWidth;
		scrollY=document.body.offsetHeight;
	}
	if(self.innerHeight){
		windowWidth=self.innerWidth;
		windowHeight=self.innerHeight;
	}else if(document.documentElement&&document.documentElement.clientHeight){
		windowWidth=document.documentElement.clientWidth;
		windowHeight=document.documentElement.clientHeight;
	}else if(document.body){
		windowWidth=document.body.clientWidth;
		windowHeight=document.body.clientHeight;
	}
	var pageWidth=(scrollX<windowWidth)?windowWidth:scrollX;
	var pageHeight=(scrollY<windowHeight)?windowHeight:scrollY;
	return {'pageWidth':pageWidth,'pageHeight':pageHeight,'windowWidth':windowWidth,'windowHeight':windowHeight};
};

MU.parentSearchWithTagName=function(elm,tag){
	tag=tag.toLowerCase();
	rv=elm;
	do{
		try{
			if(rv&&rv.parentNode){
				rv=rv.parentNode;
				if(rv.nodeName){
					var n=rv.nodeName.toLowerCase();
					if(n==tag||n=='body') break;
				}else rv=null;
			}else rv=null;
		}catch(e){
			rv=null;
		}
	}while(rv);
	return rv;
};

MU.serialize=function(txt){
	switch(typeof(txt)){
		case 'string':
			return 's:'+txt.length+':"'+txt+'";';
		case 'number':
			if(txt>=0&&String(txt).indexOf('.')==-1 &&txt<65536) return 'i:'+txt+';';
			return 'd:'+txt+';';
		case 'boolean':
			return 'b:'+((txt)?'1':'0')+';';
		case 'object':
			var i=0,k,ret='';
			for(k in txt){
				if(!isNaN(k)) k=Number(k);
				ret+=MU.serialize(k)+MU.serialize(txt[k]);
				i++;
			}
			return 'a:'+i+':{'+ret+'}';
		default:
			return 'N;';
	}
}

MU.sizeof=function(v){
	if(typeof(v)=='string') return v.length;
	if(v==null||(v.constructor!=Array&&v.constructor!=Object)) return 0;
	var i,rv=0;
	for(i in v) rv++;
	return rv;
};

MU.sprintf=function(str){
	var rv='';
	if(str&&MU.isString(str)){
		rv=str;
		var argv=arguments;
		var i,r;
		for(i=1;i<argv.length;i++){
			r=new RegExp('%'+i+'\\$s','g');
			rv=rv.replace(r,argv[i]);
		}
	}
	return(rv);
};

MU.stringCount=function(haystack,needle){
	var rv=0;
	if(haystack.length&&needle.length){
		var i,l=needle.length;
		while((i=haystack.indexOf(needle))!=-1){
			haystack=haystack.substr(0,i)+haystack.substr(i+l);
			rv++;
		}
	}
	return rv;
};

MU.stringLengthCheck=function(str,min,max){
	var rv=false;
	if(str&&MU.isString(str)){
		if(min&&MU.isArray(min)&&min.length==2){
			max=min[1];
			min=min[0];
		}
		var l=str.length;
		if(typeof(min)=='undefined'||min=='') min=0;
		else if(MU.isNumber(min)) min=parseInt(min);
		if(typeof(max)=='undefined'||max=='') max=Math.pow(2,32);
		else if(MU.isNumber(max)) max=parseInt(max);
		if(typeof(min)=='number'&&typeof(max)=='number'){
			rv=(l>=min&&l<=max);
		}
	}
	return(rv);
};

MU.trim=function(str){
	var rv=str.replace(/(^\s+)|(\s+$)/g,'');
	return(rv);
};

MU.unserialize=function(txt){
	var p=/s:(\d+):"((.|\n)*?)";/;
	eval('var t=txt.match('+p+'g);');
	var i,n,r;
	for(i in t){
		if(!i.match(/^[0-9]$/)) continue;
		r=t[i].match(p);
		n=r[0].replace('s:'+r[1],'s:'+r[2].length);
		txt=txt.replace(r[0],n);
	}
	var level=0,arrlen=new Array(),del=0,final=new Array(),key=new Array(),save=txt;
	while(1){
		switch(txt.substr(0,1)){
			case 'N':
				del=2;
				ret=null;
				break;
			case 'b':
				del=txt.indexOf(';')+1;
				ret=(txt.substring(2,del-1)=='1')?true:false;
				break;
			case 'i':
				del=txt.indexOf(';')+1;
				ret=Number(txt.substring(2,del-1));
				break;
			case 'd':
				del=txt.indexOf(';')+1;
				ret=Number(txt.substring(2,del-1));
				break;
			case 's':
				del=txt.substr(2,txt.substr(2).indexOf(':'));
				ret=txt.substr( 1+txt.indexOf('"'),del);
				del=txt.indexOf('"')+1+ret.length+2;
				break;
			case 'a':
				del=txt.indexOf(':{')+2;
				ret=new Array();
				arrlen[level+1]=Number(txt.substring(txt.indexOf(':')+1,del-2))*2;
				break;
			case 'O':
				txt=txt.substr(2);
				var tmp=txt.indexOf(':"')+2;
				var nlen=Number(txt.substring(0, txt.indexOf(':')));
				name=txt.substring(tmp, tmp+nlen );
				txt=txt.substring(tmp+nlen+2);
				del=txt.indexOf(':{')+2;
				ret=new Object();
				arrlen[level+1]=Number(txt.substring(0, del-2))*2;
				break;
			case '}':
				txt=txt.substr(1);
				if(arrlen[level]!=0){
					alert('var missed : '+save);
					return undefined;
				};
				level--;
			continue;
			default:
				if(level==0) return final;
				alert('syntax invalid(1) : '+save+"\nat\n"+txt+"level is at "+level);
				return undefined;
		}
		if(arrlen[level]%2==0){
			if(typeof(ret)=='object'){
				alert('array index object no accepted : '+save);
				return undefined;
			}
			if(ret==undefined){
				alert('syntax invalid(2) : '+save);
				return undefined;
			}
			key[level]=ret;
		}else{
			var ev='';
			for(var i=1;i<=level;i++){
				if(typeof(key[i])=='number'){
					ev+='['+key[i]+']';
				}else{
					ev+='["'+key[i]+'"]';
				}
			}
			eval('final'+ev+'= ret;');
		}
		arrlen[level]--;
		if(typeof(ret)=='object') level++;
		txt=txt.substr(del);
		continue;
	}
};

MU.visibility=function(elm){
	var rv=null;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		var argv=arguments;
		var swap='swap';
		var show=(typeof(argv[1])!='undefined')?argv[1]:swap;
		var disp=(show==true||(show==swap&&elm.style.visibility=='hidden'))?'visible':'hidden';
		elm.style.visibility=disp;
		rv=(disp=='');
	}
	return rv;
};

MU.wordwrap=function(str,cutAt,breakStr,cut){
	var m=cutAt,b=breakStr,c=cut;
	var i,j,l,s,r;
	if(m<1) return(str);
	for(i=-1,l=(r=str.split('\n')).length;++i<l;r[i]+=s){
		for(s=r[i],r[i]='';s.length>m;r[i]+=s.slice(0,j)+((s=s.slice(j)).length?b:'')){
			j=c==2||(j=s.slice(0,m+1).match(/\S*(\s)?$/))[1]?m:j.input.length-j[0].length||c==1&&m||j.input.length+(j=s.slice(m).match(/^\S*/)).input.length;
		}
	}
	return(r.join('\n'));
};

/**
*  MD5 (Message-Digest Algorithm)
*/
MU.md5=function(string){

	function RotateLeft(lValue, iShiftBits) {
		return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
	}

	function AddUnsigned(lX,lY) {
		var lX4,lY4,lX8,lY8,lResult;
		lX8 = (lX & 0x80000000);
		lY8 = (lY & 0x80000000);
		lX4 = (lX & 0x40000000);
		lY4 = (lY & 0x40000000);
		lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
		if (lX4 & lY4) {
			return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
		}
		if (lX4 | lY4) {
			if (lResult & 0x40000000) {
				return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
			} else {
				return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
			}
		} else {
			return (lResult ^ lX8 ^ lY8);
		}
 	}

 	function F(x,y,z) { return (x & y) | ((~x) & z); }
 	function G(x,y,z) { return (x & z) | (y & (~z)); }
 	function H(x,y,z) { return (x ^ y ^ z); }
	function I(x,y,z) { return (y ^ (x | (~z))); }

	function FF(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function GG(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function HH(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function II(a,b,c,d,x,s,ac) {
		a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
		return AddUnsigned(RotateLeft(a, s), b);
	};

	function ConvertToWordArray(string) {
		var lWordCount;
		var lMessageLength = string.length;
		var lNumberOfWords_temp1=lMessageLength + 8;
		var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
		var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
		var lWordArray=Array(lNumberOfWords-1);
		var lBytePosition = 0;
		var lByteCount = 0;
		while ( lByteCount < lMessageLength ) {
			lWordCount = (lByteCount-(lByteCount % 4))/4;
			lBytePosition = (lByteCount % 4)*8;
			lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
			lByteCount++;
		}
		lWordCount = (lByteCount-(lByteCount % 4))/4;
		lBytePosition = (lByteCount % 4)*8;
		lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
		lWordArray[lNumberOfWords-2] = lMessageLength<<3;
		lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
		return lWordArray;
	};

	function WordToHex(lValue) {
		var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
		for (lCount = 0;lCount<=3;lCount++) {
			lByte = (lValue>>>(lCount*8)) & 255;
			WordToHexValue_temp = "0" + lByte.toString(16);
			WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
		}
		return WordToHexValue;
	};

	function Utf8Encode(string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	};

	var x=Array();
	var k,AA,BB,CC,DD,a,b,c,d;
	var S11=7, S12=12, S13=17, S14=22;
	var S21=5, S22=9 , S23=14, S24=20;
	var S31=4, S32=11, S33=16, S34=23;
	var S41=6, S42=10, S43=15, S44=21;

	string = Utf8Encode(string);

	x = ConvertToWordArray(string);

	a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

	for (k=0;k<x.length;k+=16) {
		AA=a; BB=b; CC=c; DD=d;
		a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
		d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
		c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
		b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
		a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
		d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
		c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
		b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
		a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
		d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
		c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
		b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
		a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
		d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
		c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
		b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
		a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
		d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
		c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
		b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
		a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
		d=GG(d,a,b,c,x[k+10],S22,0x2441453);
		c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
		b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
		a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
		d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
		c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
		b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
		a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
		d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
		c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
		b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
		a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
		d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
		c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
		b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
		a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
		d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
		c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
		b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
		a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
		d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
		c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
		b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
		a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
		d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
		c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
		b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
		a=II(a,b,c,d,x[k+0], S41,0xF4292244);
		d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
		c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
		b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
		a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
		d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
		c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
		b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
		a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
		d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
		c=II(c,d,a,b,x[k+6], S43,0xA3014314);
		b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
		a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
		d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
		c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
		b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
		a=AddUnsigned(a,AA);
		b=AddUnsigned(b,BB);
		c=AddUnsigned(c,CC);
		d=AddUnsigned(d,DD);
	}
	var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
	return temp.toLowerCase();
}

MU._init=function(){
	MU.loaded=true;
};




/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

   MFC (MdsFormControl)

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

if(typeof(MFC)=='undefined'){
	var MFC={};
}

MFC={
	'fieldClassName':new RegExp('(^|[ ])mfc-([^_ ]+)(_([^ ]+))?([ ]|$)','i'), /* $2=type, $4=options */
	'formClassName':'mfc-form',
	'formInitialCheckClassName':'mfc-initialCheck',
	'formInitializedClassName':'mfc-initialized',
	'formLiveCheckClassName':'mfc-liveCheck',
	'formElementErrorClassName':'mfc-error',
	'returnValueNoCheck':'A string which can not be a return value of MFC.formElementCheck(). I think I\'m good with this one. :)'
};

MFC.postCheckFunctions={
};

MFC.fieldsTypes={
	/*
		Boolean
	*/
	'binaryNumber':{
		'regExp':new RegExp('^[01]$'),
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var rv=(elm.readOnly||MU.is_(MFC.fieldsTypes.binaryNumber.regExp,v));
		        	return rv;
		        }
	},
	/*
		Checked
			Check if a checkbox is checked.
			Use only with checkboxes or radio.
	*/
	'checked':{
		'check':function(elm,liveCheck){
		        	var rv=(typeof(elm.checked)!='undefined'&&elm.checked);
		        	return rv;
		        }
	},
	/*
		Email
	*/
	'email':{
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var p=MFC.formElementCheckGetParams(elm);
		        	var allowEmpty=false,i;
		        	for(i in p){
		        		if(p[i]=='allowEmpty'){
		        			allowEmpty=true;
		        			break;
		        		}
		        	}
		        	var rv=(elm.readOnly||MU.isEmail(v)||(v.length==0&&allowEmpty));
		        	return rv;
		        }
	},
	/*
		Email contact
			Email or contact format like "Me <email>" (without ").
			Options:
				full	The value must match the contact format.
	*/
	'emailContact':{
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var p=MFC.formElementCheckGetParams(elm);
		        	var rv=false;
		        	var i,allowEmpty=false,full=false;
		        	for(i in p){
		        		if(p[i]=='full') full=true;
		        		if(p[i]=='allowEmpty') allowEmpty=true;
		        	}
		        	if(!full){
		        		rv=MU.isEmail(v);
		        	}
		        	if(!rv){
		        		var r=new RegExp('^(.+)<([a-z0-9@_.-]*)>$','i');
		        		var a=r.exec(v);
		        		if(a&&typeof(a[2])!='undefined'){
		        			rv=MU.isEmail(a[2]);
		        		}
		        	}
		        	if((!rv)&&allowEmpty&&v.length==0) rv=true;
		        	return rv;
		        }
	},
	/*
		Float
			Zero included
	*/
	'float':{
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var p=MFC.formElementCheckGetParams(elm);
		        	var decMin='1';
		        	var decMax='64';
		        	var i,r;
		        	for(i in p){
		        		if(r=p[i].match(/^([0-9]*)-([0-9]*)$/)){
		        			if(MU.is_(/^[0-9]+$/,r[1])) decMin=r[1];
		        			if(MU.is_(/^[0-9]+$/,r[2])) decMax=r[2];
		        		}
		        	}
		        	r=new RegExp(MU.sprintf('^-?([0-9]+)([.]([0-9]{%1$s,%2$s}))$',decMin,decMax));
		        	var rv=(elm.readOnly||MU.is_(r,v));
		        	return rv;
		        }
	},
	/*
		Positive float
			Zero included
	*/
	'floatPos':{
		'check':function(elm,liveCheck){
		        	var rv=MFC.fieldsTypes.float.check(elm);
		        	if(rv){
		        		var v=MU.formTagGetValue(elm);
		        		var vm=parseFloat(v);
		        		if((!liveCheck)&&v!=vm.toString()) MU.formTagSetValue(elm,vm);
		        		rv=(vm>=0);
		        	}
		        	return rv;
		        }
	},
	/*
		Strictly positive float
			Zero excluded
	*/
	'floatPosStr':{
		'check':function(elm,liveCheck){
		        	var rv=MFC.fieldsTypes.float.check(elm);
		        	if(rv){
		        		var v=MU.formTagGetValue(elm);
		        		var vm=parseFloat(v);
		        		if((!liveCheck)&&v!=vm.toString()) MU.formTagSetValue(elm,vm);
		        		rv=(vm>0);
		        	}
		        	return rv;
		        }
	},
	/*
		Negative float
			Zero included
	*/
	'floatNeg':{
		'check':function(elm,liveCheck){
		        	var rv=MFC.fieldsTypes.float.check(elm);
		        	if(rv){
		        		var v=MU.formTagGetValue(elm);
		        		var vm=parseFloat(v);
		        		if((!liveCheck)&&v!=vm.toString()) MU.formTagSetValue(elm,vm);
		        		rv=(vm<=0);
		        	}
		        	return rv;
		        }
	},
	/*
		Strictly negative float
			Zero excluded
	*/
	'floatNegStr':{
		'check':function(elm,liveCheck){
		        	var rv=MFC.fieldsTypes.float.check(elm);
		        	if(rv){
		        		var v=MU.formTagGetValue(elm);
		        		var vm=parseFloat(v);
		        		if((!liveCheck)&&v!=vm.toString()) MU.formTagSetValue(elm,vm);
		        		rv=(vm<0);
		        	}
		        	return rv;
		        }
	},
	/*
		Integer
			Zero included
	*/
	'int':{
		'regExp':new RegExp('^(-)?([0-9]+)$'),
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var rv=(elm.readOnly||MU.is_(MFC.fieldsTypes.int.regExp,v));
		        	return rv;
		        }
	},
	/*
		Positive integer
			Zero included
	*/
	'intPos':{
		'regExp':new RegExp('^([0-9]+)$'),
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var rv=(elm.readOnly||MU.is_(MFC.fieldsTypes.intPos.regExp,v));
		        	return rv;
		        }
	},
	/*
		Strictly positive integer
			Zero excluded
	*/
	'intPosStr':{
		'regExp':new RegExp('^([123456789]{1}[0-9]*)$'),
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var p=MFC.formElementCheckGetParams(elm);
		        	var allowEmpty=false,i;
		        	for(i in p){
		        		if(p[i]=='allowEmpty'){
		        			allowEmpty=true;
		        			break;
		        		}
		        	}
		        	var rv=(elm.readOnly||MU.is_(MFC.fieldsTypes.intPosStr.regExp,v)||(v.length==0&&allowEmpty));
		        	return rv;
		        }
	},
	/*
		Negative integer
			Zero included
	*/
	'intNeg':{
		'regExp':new RegExp('^-([0-9]+)$'),
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var rv=(elm.readOnly||MU.is_(MFC.fieldsTypes.intNeg.regExp,v));
		        	return rv;
		        }
	},
	/*
		Strictly negative integer
			Zero excluded
	*/
	'intNegStr':{
		'regExp':new RegExp('^-([123456789]{1}[0-9]*)$'),
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var rv=(elm.readOnly||MU.is_(MFC.fieldsTypes.intNegStr.regExp,v));
		        	return rv;
		        }
	},
	/*
		Link
	*/
	'link':{
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var p=MFC.formElementCheckGetParams(elm);
		        	var allowEmpty=false,i;
		        	for(i in p){
		        		if(p[i]=='allowEmpty') allowEmpty=true;
		        	}
		        	var rv=(elm.readOnly||MU.isLink(v)||(v.length==0&&allowEmpty));
		        	return rv;
		        }
	},
	/*
		Number
			Zero, integer and float accepted.
	*/
	'number':{
		'regExp':new RegExp('^(-)?([0-9]+)([.]([0-9]+))?$'),
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var rv=(elm.readOnly||MU.is_(MFC.fieldsTypes.number.regExp,v));
		        	return rv;
		        }
	},
	/*
		Positive number
			Zero included
	*/
	'numberPos':{
		'check':function(elm,liveCheck){
		        	var rv=MFC.fieldsTypes.number.check(elm);
		        	if(rv){
		        		var v=MU.formTagGetValue(elm);
		        		var vm=Number(v);
		        		if((!liveCheck)&&v!=vm.toString()) MU.formTagSetValue(elm,vm);
		        		rv=(vm>=0);
		        	}
		        	return rv;
		        }
	},
	/*
		Strictly positive integer
			Zero excluded
	*/
	'numberPosStr':{
		'check':function(elm,liveCheck){
		        	var rv=MFC.fieldsTypes.number.check(elm);
		        	if(rv){
		        		var v=MU.formTagGetValue(elm);
		        		var vm=Number(v);
		        		if((!liveCheck)&&v!=vm.toString()) MU.formTagSetValue(elm,vm);
		        		rv=(vm>0);
		        	}
		        	return rv;
		        }
	},
	/*
		Negative number
			Zero included
	*/
	'numberNeg':{
		'check':function(elm,liveCheck){
		        	var rv=MFC.fieldsTypes.number.check(elm);
		        	if(rv){
		        		var v=MU.formTagGetValue(elm);
		        		var vm=Number(v);
		        		if((!liveCheck)&&v!=vm.toString()) MU.formTagSetValue(elm,vm);
		        		rv=(vm<=0);
		        	}
		        	return rv;
		        }
	},
	/*
		Strictly negative integer
			Zero excluded
	*/
	'numberNegStr':{
		'check':function(elm,liveCheck){
		        	var rv=MFC.fieldsTypes.number.check(elm);
		        	if(rv){
		        		var v=MU.formTagGetValue(elm);
		        		var vm=Number(v);
		        		if((!liveCheck)&&v!=vm.toString()) MU.formTagSetValue(elm,vm);
		        		rv=(vm<0);
		        	}
		        	return rv;
		        }
	},
	/*
		Text
			Options:
				x-y	Text length range.	x and y are integers, y>=x.
				allowEmpty	Keyword.	Allow to leave the field empty. This parameter override the range.
			Examples:
				mfc-text_2-8	Text length must be between 2 and 8 chars long.
				mfc-text_2-8_allowEmpty	Text length can be 0 or between 2 and 8 chars long.
	*/
	'text':{
		'regExp':null,
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var p=MFC.formElementCheckGetParams(elm);
		        	if(!liveCheck){
		        		v=MU.trim(v);
		        		var r=new RegExp(' {2,}','g');
		        		v=v.replace(r,' ');
		        		var r=new RegExp('^\\s+');
		        		v=v.replace(r,'');
		        		MU.formTagSetValue(elm,v);
		        	}
		        	var allowEmpty=false;
		        	var i,range=new Array('','');
		        	var r=new RegExp('^([0-9]*)(-([0-9]*))?$');
		        	for(i in p){
		        		if(p[i]=='allowEmpty'){
		        			allowEmpty=true;
		        		}else if(p[i].match(r)){
		        			var rr=r.exec(p[i]);
		        			range=new Array(rr[1],rr[3]);
		        			if(!range[0]) range[0]=0;
		        			if(!range[1]) range[1]=999999999;
			        		if(MU.isNumber(range[1])){
			        			if(range[1]!=elm.maxLength){
			        				elm.maxLength=range[1];
			        				if(!MU.formTagIsSelect(elm)){
			        					v=v.substr(0,parseInt(range[1]));
			        					MU.formTagSetValue(elm,v);
			        				}
			        			}
			        		}
		        		}
		        	}
		        	var rv=false;
		        	if(allowEmpty&&MU.isString(v)&&v.length==0) rv=true;
		        	else rv=MU.stringLengthCheck(v,range);
		        	return rv;
		        }
	}
};

MFC.formCheck=function(f,func,silent){
	var rv=false;
	var elm,err=new Array(),errElm=new Array(),i,m,r;
	for(i=0;i<f.elements.length;i++){
		elm=f.elements[i];
		if(MU.classNameGet(elm).match(MFC.fieldClassName)){
			if(!elm.name) elm.name='__formElement'+i;
			if(elm.title&&MU.isString(elm.title)&&elm.title.length>0){
				r=MFC.formElementCheck(elm,false);
				if(r!=MFC.returnValueNoCheck&&!r){
					m=MU.sprintf('%1$s',elm.title);
					if(!MU.arrayHasValue(err,m)){
						err[err.length]=m;
						errElm[errElm.length]=elm;
					}
				}
			}else{
				err[err.length]=MU.sprintf('[Warning] %1$s.title is missing',elm.name);
			}
		}
	}
	if(typeof(func)=='function'){
		var param={'form':f,'err':err,'errElm':errElm};
		rv=func(param);
	}else{
		if(err.length==0){
			rv=true;
		}else{
			var t='\n  - ';
			if(!silent){
				alert(MU.$lang('formPleaseCheck')+t+err.join(t));
			}
		}
	}
	return rv;
};

MFC.formElementCheck=function(elm,liveCheck){
	var rv=MFC.returnValueNoCheck;
	if(elm&&MFC.formElementMustBeChecked(elm)){
		var r=MU.classNameGet(elm).match(MFC.fieldClassName);
		if(r[2]){
			var t=r[2];
			if(MFC.fieldsTypes[t]&&MFC.fieldsTypes[t].check&&MU.isFunction(MFC.fieldsTypes[t].check)){
				t=MFC.fieldsTypes[t];
				if(typeof(liveCheck)=='undefined') liveCheck=true;
				rv=t.check(elm,liveCheck);
				if(rv) MU.classNameRemove(elm,MFC.formElementErrorClassName);
				else MU.classNameAdd(elm,MFC.formElementErrorClassName);
			}
		}
	}
	return rv;
};

MFC.formElementCheckGetParams=function(elm){
	var rv=new Array();
	var r;
	if(r=MU.classNameGet(elm).match(MFC.fieldClassName)){
		if(r[4]&&MU.isString(r[4])){
			rv=r[4].split('_');
		}
	}
	return rv;
};

MFC.formElementGetValue=function(elm){
	return MU.formTagGetValue(elm);
}

MFC.formElementMustBeChecked=function(elm){
	var rv=false,r;
	if(elm&&(r=MU.classNameGet(elm).match(MFC.fieldClassName))&&r[2]&&MU.isString(r[2])){
		var t=r[2];
		rv=(MFC.fieldsTypes[t]&&MFC.fieldsTypes[t].check&&MU.isFunction(MFC.fieldsTypes[t].check));
	}
	return rv;
};

MFC.formElementsGetList=function(f){
	var rv=new Array();
	if(f&&f.nodeName&&MU.isString(f.nodeName)&&f.nodeName.toLowerCase()=='form'){
		var elm,i;
		for(i=0;i<f.elements.length;i++){
			elm=f.elements[i];
			if(elm&&MU.classNameGet(elm).match(MFC.fieldClassName)){
				rv[rv.length]=elm;
			}
		}
	}
	return rv;
};

MFC.formInit=function(f,postCheckFunc){
	var rv=false;
	if(f&&MU.isString(f)) f=MU.$(f);
	if(f&&f.nodeName&&MU.isString(f.nodeName)&&f.nodeName.toLowerCase()=='form'){
		if(MU.classNameGet(f).length>0){
			if(MU.classNameMatch(f,MFC.formClassName)&&(!MU.classNameMatch(f,MFC.formInitializedClassName))){
				if(typeof(postCheckFunc)=='function'){
					MFC.postCheckFunctions[f.id]=postCheckFunc;
				}
				var func=function(evt){
					var elm=MU.eventGetTarget(evt);
					if(MFC.formCheck(elm)){
						if(typeof(MFC.postCheckFunctions[elm.id])=='function'){
							var param={'form':elm,'evt':evt};
							MFC.postCheckFunctions[f.id](param);
						}else{
							elm.submit();
						}
					}else{
						MU.eventPreventDefault(evt);
					}
				};
				MU.eventAddListener(f,'submit',func);
				if(MU.classNameMatch(f,MFC.formLiveCheckClassName)){
					var list=MFC.formElementsGetList(f);
					var elm,i,t;
					var func=function(evt){
						var elm=MU.eventGetTarget(evt);
						MFC.formElementCheck(elm,true);
					};
					for(i=0;i<list.length;i++){
						elm=list[i];
						t=(MU.formTagIsSelect(elm))?'change':'keyup';
						MU.eventAddListener(elm,t,func);
					}
				}
				if(MU.classNameMatch(f,MFC.formInitialCheckClassName)){
					MFC.formCheck(f,null,true);
				}
				rv=true;
				MU.classNameAdd(f,MFC.formInitializedClassName);
			}
		}
	}
	return rv;
};

MFC.formInitAll=function(){
	var i;
	var list=document.forms;
	for(i=0;i<list.length;i++){
		MFC.formInit(list[i]);
	}
};

MFC._init=function(){
	MFC.loaded=true;
};




/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

   MdsFxScroll

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

var MdsFxScroll=function(elm,cfg){
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	MdsFxScroll.items[elm.id]=this;
	this.elm=elm;
	this.id=elm.id;
	this.scrolling=true;
	this.direction=MdsFxScroll.bottom2Top;
	this.speed=20;
	this.laps=0;
	this.safeMargin=10;
	if(cfg){
		var i;
		for(i in cfg){
			if(this[i]) this[i]=this[cfg[i]];
		}
	}
	var elmText=document.createElement('div');
	elmText.id=this.id+'_container';
	elmText.innerHTML=elm.innerHTML;
	elm.innerHTML='';
	elmText=elm.appendChild(elmText);
	var ei=MU.elementGetInfo(elm);
	if(this.direction==MdsFxScroll.bottom2Top){
		elmText.style.paddingTop=(ei.height+this.safeMargin)+'px';
		elmText.style.paddingBottom=(ei.height+this.safeMargin)+'px';
	}
	this.interval=setInterval('MdsFxScroll.run("'+this.id+'");',Math.ceil(1000/this.speed));
};

MdsFxScroll.items={};
MdsFxScroll.bottom2Top='b2t';

MdsFxScroll.run=function(id){
	if(MdsFxScroll.items&&MdsFxScroll.items[id]){
		var scr=MdsFxScroll.items[id];
		var elm=scr.elm;
		if(scr.scrolling){
			var ei=MU.elementGetInfo(elm);
			if(scr.direction==MdsFxScroll.bottom2Top){
				elm.scrollTop++;
				if(elm.scrollTop+ei.height>=elm.scrollHeight){
					elm.scrollTop=0;
					scr.laps++;
				}
			}
		}
	}
}




/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

   Init objects

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
MU._init();
MFC._init();




/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

   Compatibility with previous version

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
var MdsUtils=function(){return MU;};
var _mu=MU;
var _mfc=MFC;
var MdsFormControl={};
MdsFormControl.prototype=MFC;
MdsFormControl.prototype._mu=MU;
MFC._mu=MU;
