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

   MU (MdsUtils)

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

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

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(className,elm,tag){
	var r=new RegExp(this.sprintf(this.regExp.classNameSearch,className),'g');
	var tag=tag||'*';
	var elm=elm||document;
	var l=(tag=='*'&&elm.all)?elm.all:elm.getElementsByTagName(tag);
	var rv=[];
	var i,c;
	for(i=0;i<l.length;i++){
		c=l[i];
		if(r.test(c.className)){
			rv.push(c);
		}
	}
	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&&typeof(elm.className)!='undefined'&&MU.isString(elm.className)){
		if(rv=!MU.classNameMatch(elm,cn)){
			var c=elm.className;
			c+=((c.length>0)?' ':'')+cn;
			elm.className=c;
		}
	}
	return rv;
};

MU.classNameMatch=function(elm,cn){
	var rv=false;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&typeof(elm.className)!='undefined'&&MU.isString(elm.className)&&MU.isString(cn)){
		var c,i;
		c=elm.className.split(' ');
		for(i=0;i<c.length;i++){
			if(rv=(c[i]==cn)) break;
		}
	}
	return rv;
};

MU.classNameRemove=function(elm,cn){
	var rv=false;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&typeof(elm.className)!='undefined'&&MU.isString(elm.className)){
		if(rv=MU.classNameMatch(elm,cn)){
			var c=elm.className;
			var r=new RegExp(MU.sprintf(MU.regExp.classNameReplace,cn),'g');
			c=c.replace(r,'$1$3');
			elm.className=MU.trim(c);
		}
	}
	return rv;
};

MU.classNameSwitch=function(elm,cn,force){
	var rv=false;
	if(elm&&MU.isString(elm)) elm=MU.$(elm);
	if(elm&&typeof(elm.className)!='undefined'&&MU.isString(elm.className)){
		var c=elm.className;
		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.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.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){
	var rv=null;
	if(MU.isString(elm)) elm=MU.$(elm);
	if(elm){
		if(document.createEvent){
			var evt=document.createEvent('Events');
			evt.initEvent(type,false,false);
			rv=elm.dispatchEvent(evt);
		}else{
			rv=elm.fireEvent('on'+type);
		}
	}
	return rv;
};

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){
		var t=MU.formTagGetType(elm);
		if(t!=MU.typeUnknown){
			var n=(elm.name)?elm.name:'';
			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(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){
	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.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.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'));
};

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={
	'binaryNumber':{ /* Bool */
		'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':{ /* For checkboxes */
		'check':function(elm,liveCheck){
		        	var rv=(typeof(elm.checked)!='undefined'&&elm.checked);
		        	return rv;
		        }
	},
	'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;
		        }
	},
	'float':{ /* Float */
		'regExp':new RegExp('^([0-9]{%1$s})(\.([0-9]{%2$s}))$'), /* sprintf will modify the pattern. */
		'check':function(elm,liveCheck){
		        	var v=MU.formTagGetValue(elm);
		        	var p=MFC.formElementCheckGetParams(elm);
		        	var n1='1,',n2='0,';
		        	var i,r,s;
		        	for(i in p){
		        		if(r=p[i].match(/^([0-9]*)-([0-9]*)$/)){
		        			if(MU.is_(/^[0-9]+$/,r[1])) n1=r[1];
		        			if(MU.is_(/^[0-9]+$/,r[2])) n2=r[2];
		        		}
		        	}
		        	r=new RegExp(MU.sprintf(MFC.fieldsTypes.float.regExp,n1,n2));
		        	var rv=(elm.readOnly||MU.is_(r,v));
		        	return rv;
		        }
	},
	'int':{ /* Integer */
		'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;
		        }
	},
	'intPos':{ /* Positive integer (0 included) */
		'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;
		        }
	},
	'intPosStr':{ /* Strictly positive integer */
		'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;
		        }
	},
	'intNeg':{ /* Negative integer (0 included) */
		'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;
		        }
	},
	'intNegStr':{ /* Strictly negative integer */
		'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;
		        }
	},
	'number':{ /* Number (int, float) */
		'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;
		        }
	},
	'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(MU.isNumber(range[1])){
			        			if(range[1]) elm.maxLength=range[1];
			        			if((!MU.formTagIsSelect(elm))&&elm.value&&MU.isString(elm.value)){
			        				elm.value=v.substr(0,parseInt(range[1]));
			        			}
			        		}
		        		}
		        	}
		        	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(elm.className&&MU.isString(elm.className)&&elm.className.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=elm.className.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=elm.className.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&&elm.className&&MU.isString(elm.className)&&(r=elm.className.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&&elm.className&&MU.isString(elm.className)&&elm.className.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(f.className&&MU.isString(f.className)&&f.className.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;
