var MD                        = (MD) ? MD : {};

MD.aSpecChar                  = new Array(64,35,38,33,93,91,40,41); //$ AUTORISER : @ # & ! ] [ ( )
MD.aRefuChar                  = new Array(48,79,111); //$ REFUSER : 0 o O
MD.generatePassword           = function(iLength){var iLength = (iLength) ? iLength : 0;var bNumCharOnly = (bNumCharOnly) ? bNumCharOnly : false;var strPassword = "";if (iLength == 0){iLength = Math.random();iLength = parseInt(iLength * 100);iLength = (iLength % 7) + 6;};for (var iIndex = 0; iIndex < iLength; iIndex++){var iNum = this.getPasswordNum();while(this.checkPassword(iNum)){iNum = this.getPasswordNum();};strPassword = strPassword + String.fromCharCode(iNum);}var bHasSpecChar = false;for(var iIndex = 0; iIndex < String(strPassword).length; iIndex++){if(this.checkSpecChar(String(strPassword).charCodeAt(iIndex))){bHasSpecChar=true;}}if(bHasSpecChar == false){strPassword = strPassword.substr(0,(iLength-1));strPassword+= this.getSpecChar();}return strPassword;};
MD.getPasswordNum             = function (){var iRndNum = Math.random();iRndNum = parseInt(iRndNum * 1000);iRndNum = (iRndNum % 94) + 33;return iRndNum;};
MD.getSpecChar                = function(){var iIndSpCh = Math.floor(Math.random() * this.aSpecChar.length);var strSpeCh = String.fromCharCode(this.aSpecChar[iIndSpCh]);return strSpeCh;};
MD.checkSpecChar              = function (iNum){for(var iSpC = 0; iSpC < this.aSpecChar.length; iSpC++){if(iNum == this.aSpecChar[iSpC]){return true;};}return false;};
MD.checkRefuChar              = function (iNum){for(var iRfC = 0; iRfC < this.aSpecChar.length; iRfC++){if(iNum == this.aRefuChar[iRfC]){return true;};}return false;};
MD.checkPassword              = function(iNum){if(this.checkRefuChar(iNum)){return true;};if(this.checkSpecChar(iNum)){return false;};if((iNum >=33) && (iNum <=47)){return true;};if((iNum >=58) && (iNum <=64)){return true;};if((iNum >=91) && (iNum <=96)){return true;};if((iNum >=123) && (iNum <=126)){return true;};return false;};
MD.is                         = function(a,b){if(a.constructor.toString().indexOf(b)==-1){return false;}else{return true;}};

MD.getId                      = function(){var oDate = new Date();var fRand = (Math.random() * 1000);var sId   = oDate.getTime() + parseInt(fRand);return sId;};

String.prototype.md_protect   = function(){var c=this;c=String(c).md_replace("'", '__MDQUOTE__');c=String(c).md_replace('"', '__MDDQUOTE__');c=String(c).md_replace(" ", '__MDSPACE__');return c;};
String.prototype.md_unprotect = function(){var c=this;c=String(c).md_replace('__MDQUOTE__', "'");c=String(c).md_replace('__MDDQUOTE__', '"');c=String(c).md_replace('__MDSPACE__', " ");return c;};

String.prototype.trim         = function(){var c = this.replace(/^\s+/, '');return c.replace(/\s+$/g,'');};
String.prototype.md_replace   = function(b,c){var a = this.split(b); return a.join(c)};
String.prototype.md_urladdarg = function(b){var a = this.split('?');if(a.length == 1){return this+'?'+b;}else{if(String(a[1]).trim() != ""){return this+'&'+b;}else{return this+b;}}};
String.prototype.md_urldelarg = function(b){var a = this.split('?');var c = a[0];if(a.length > 1){a = a[1].split('&');var d = [];var e = new RegExp('^'+b+'=');for(var i=0; i < a.length; i++){if((!e.test(a[i])) && (String(a[i]).trim() != "")){d[d.length] = a[i];}}return c+'?'+d.join('&');}else{return this;}};


document.mdgskin = '###gskin###';
document.mdskin = '###skin###';
document.mdalias = '###alias###';
document.mdcgi = '###cgi###';

MD.changeURL                  = function(c){window.location="#mdtoajax"+c;};
MD.realAjaxURL                = function()
{
	var sURL = window.location;
	var aTmp = String(sURL).split('#');
	if(aTmp.length > 1)
	{
		sQuery = aTmp[1];
		var oRegExp = new RegExp('^mdtoajax');
		if(oRegExp.test(sQuery))
		{
			sQuery = String(sQuery).replace(oRegExp,'');
			document.location = window.location.protocol+'//'+window.location.host+sQuery;
		}
	}
};
MD.realAjaxURL();

window.addEvent('domready', function()
{
	$$('.mdcaptcha').each(function(el, i)
	{
		var sSrc = String(el.get('src')).md_urladdarg('nc='+MD.getId());
		el.addEvent('click',function(e)
    {
      e.stop();
      var aTmp = String(el.get('src')).split('&nc=');
      var aTmp = String(aTmp[0]).split('?nc=');
      var sSrc = String(aTmp[0]).md_urladdarg('nc='+MD.getId());
      this.set('src', sSrc);
    }.bind(el));
    el.set('src', sSrc);
    el.setStyle('cursor', 'pointer');
	});
});

MD.frmAjax=new Class(
{
  Implements: [Options,Events],
  options: {
    classFrm          : 'toajax',
    classError        : 'error',
    classErrorInput   : 'inputcheckerror',
    onError           : $empty,
    onSuccess         : $empty,
    checkBeforeSubmit : function(id){return true;}
  },
  initialize: function(options)
  {
    this.setOptions(options);
    var obj = this;
    $$('form.'+this.options.classFrm).each(function(o,i)
    {

      o.mdsubmit=function(){obj.sendAjax(this);};
      o.addEvent('submit',function(e)
      {
          
        e.stop();
        obj.clearError(this);
        obj.sendAjax(this);
      });
    });
  },
  sendAjax: function(el)
  {
      
    obj     = this;
    if(obj.options.checkBeforeSubmit(el.id))
    {
        
	    el.set('send',
	    {
	      onComplete: function(xml)
	      {
	      	var oRegExp = new RegExp('\s*<xml>.*');
	      	if(oRegExp.test(xml))
	      	{
	      		var oJson = xml2json.parser(xml);
		        oJson     = oJson.xml;

		        if(oJson.success == 1)
		        {
		          var c = 'ERRORS-'+el.get('id');
		          if($(c)){$(c).setStyle('display','none');}
		          var c = 'SUCCESS-'+el.get('id');
		          if($(c)){$(c).setStyle('display','block');}
		          obj.fireEvent("onSuccess",[el,oJson]);
		        }
		        else
		        {
		          var aErr=oJson.errors.error;
		          if(MD.is(aErr,'Array'))
		          {
		            for(var i=0;i<aErr.length;i++)
		            {
		            obj.traiteError(aErr[i],el.id, el);
		            }
		          }
		          else
		          {
		            obj.traiteError(aErr,el.id,el);
		          }
		          var c = 'SUCCESS-'+el.get('id');
		          if($(c)){$(c).setStyle('display','none');}
		          var c = 'ERRORS-'+el.get('id');
		          if($(c)){$(c).setStyle('display','block');}
		          obj.fireEvent("onError",[el,oJson]);
		        }
	      	}
	      	else
	      	{
	      		var c = 'ERRORS-'+el.get('id');
		        if($(c)){$(c).setStyle('display','none');}
		        var c = 'SUCCESS-'+el.get('id');
		        if($(c)){$(c).setStyle('display','block');}
		        obj.fireEvent("onSuccess",[el,xml]);
	      	}
	      }
		  });
		  el.send();
		}
  },
  clearError:function(win)
  {
    var clsError = this.options.classError;
    var clsErrorInput = this.options.classErrorInput;
    $$('input.'+clsErrorInput).removeClass(clsErrorInput);
    $$('textarea.'+clsErrorInput).removeClass(clsErrorInput);
    $$('select.'+clsErrorInput).removeClass(clsErrorInput);
    $$('.'+clsError).setStyle('display','none');
    var c = 'ERRORS-'+win.get('id');
    if($(c)){$(c).setStyle('display','none');}
	  var c = 'SUCCESS-'+win.get('id');
    if($(c)){$(c).setStyle('display','none');}
  },
  traiteError:function(c,id,win)
  {
    var aTmp=String(c).split('_');
    var clsError = this.options.classErrorInput;
    var strInpId=aTmp[0].toLowerCase();
    if($(strInpId))
    {
      if($(strInpId).get('tag')=="div")
      {
        $$('#'+strInpId+' select').addClass(clsError);
      }
      else
      {
        $(strInpId).addClass(clsError);
      }
    }
    var c = 'ERROR-'+win.get('id')+'_'+String(c).toLowerCase();
    if($(c)){$(c).setStyle('display','block');}
    else
    {
      var c = 'ERROR-'+win.get('id')+'_'+String(aTmp[0]).toLowerCase()+'_'+String(aTmp[1]).toLowerCase();
      if($(c)){$(c).setStyle('display','block');}
      else
      {
        var c = 'ERROR-'+win.get('id')+'_'+String(aTmp[0]).toLowerCase();

        if($(c)){$(c).setStyle('display','block');}
        else if($('ERROR-'+win.get('id'))){$('ERROR-'+win.get('id')).setStyle('display','block');}
      }
    }

  }
});

MD.linkAjax=new Class(
{
  Implements: [Options,Events],
  options: {
    classFrm          : 'toajax',
		duration          : 1000,
		methodSend        : 'get',
    onBefore          : $empty,
    onAfter           : $empty,
    onWrite           : $empty

  },
  getOption : function(sName)
  {
  	if(!this.options[sName]){return '';}
  	else
  	{
  		return this.options[sName];
  	}
  },
	init : function()
	{

		$$('a.'+this.getOption('classFrm')).each(function(oElm,iInd) {
    	var sHref = oElm.get('href');
    	var sDest = oElm.get('toajaxdest');
    	var sLoader = (oElm.get('toajaxloader')) ? oElm.get('toajaxloader') : '';

			var oDest = $(sDest);
			if((String(sHref).trim() != "") && (String(sHref).trim() != "#") && (oDest))
			{
				oElm.setProperty('href', 'javascript:;');
				oElm.addEvent('click', function()
				{
					this.fireEvent("onBefore",[$(oElm)]);
					if(sLoader != '')
					{
						var oLoader = $(sLoader);
						if(oLoader)
						{
							oLoader.setStyle('display','block');
						}
					}
					var oTh = this;
					var oRequest = new Request(
					{
						url: sHref,
						onSuccess : function(responseText, responseXML)
						{
							var oAnim = new Fx.Tween(oDest,
							{
								duration:oTh.getOption('duration')
							});
							oAnim.addEvent('complete', function()
							{
								oDest.innerHTML = responseText;
								oTh.fireEvent("onWrite",[$(oElm)]);
								var oAnim = new Fx.Tween(oDest,
								{
									duration:oTh.getOption('duration')
								});
								oAnim.addEvent('complete', function()
								{
									if(sLoader != '')
									{
										var oLoader = $(sLoader);
										if(oLoader)
										{
											oLoader.setStyle('display','none');
										}
									}
									oTh.fireEvent("onAfter",[$(oElm)]);
								});
								oAnim.start('opacity',1);

							});
							oAnim.start('opacity',0);
						}
					});
					oRequest.send(
					{
				    method: this.getOption('methodSend'),
				    data: 'mdfromajax=1'
					});
				}.bind(this));
			}

    }.bind(this));
	},
  initialize: function(options)
  {
    this.setOptions(options);
    window.addEvent('domready', function()
    {
			this.init();
    }.bind(this));
  }
});



