﻿if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement)
{
  HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode)
  { 
    switch (where)
    {
      case 'beforeBegin': 
      this.parentNode.insertBefore(parsedNode,this) 
      break; 
      case 'afterBegin': 
      this.insertBefore(parsedNode,this.firstChild);
      break; 
      case 'beforeEnd': 
      this.appendChild(parsedNode); 
      break; 
      case 'afterEnd': 
      if (this.nextSibling) 
      this.parentNode.insertBefore(parsedNode,this.nextSibling); 
      else this.parentNode.appendChild(parsedNode); 
      break; 
    } 
  } 

  HTMLElement.prototype.insertAdjacentHTML = function (where,htmlStr)
  { 
    var span= document.createElement('span');
    span.innerHTML= htmlStr;
    this.insertAdjacentElement(where,span) 
  } 

  HTMLElement.prototype.insertAdjacentText = function (where,txtStr) 
  { 
    var parsedText = document.createTextNode(txtStr);
    this.insertAdjacentElement(where,parsedText);
  } 
}
var Loco =
{
	document:
  {
  	onreadystatechange: ''
  },
	Components:
  {
  	Element:
     {
     	Mask:
        {
        	Show: function(id, message) {
        		var Elem = loco$(id);
        		if (Elem == null || Elem.value != '')
        			return;
        		Elem.maskData = Elem.className;
        		Elem.value = message;
        		Elem.className = 'input-mask';
        	},
        	Hide: function(id) {
        		var Elem = loco$(id);
        		if (Elem == null || Elem.maskData == null)
        			return;
        		Elem.value = '';
        		Elem.className = Elem.maskData;
        		Elem.maskData = null;
        	}
        },
     	Fading:
        {
        	Start: 1.5,
        	Speed: 20,
        	Alpha: 0,
        	Show: function(clientId, now) {
        		Loco.Components.Element.Fading.Hide();
        		Loco.Components.Element.Fading.Box = loco$(clientId);
        		if (Loco.Components.Element.Fading.Box == null)
        			return;
        		Loco.Components.Element.Fading.Timeout = setTimeout('Loco.Components.Element.Fading.Interval= setInterval( "Loco.Components.Element.Fading.IncreaseAlpha();", ' + (now ? 10 : 'Loco.Components.Element.Fading.Speed* 10') + ');', (now ? 10 : Loco.Components.Element.Fading.Start * 750));
        	},
        	IncreaseAlpha: function() {
        		if (Loco.Components.Element.Fading.Box == null)
        			return;
        		if (Loco.Components.Element.Fading.Alpha > 90 && Loco.Components.Element.Fading.Timeout != null) {
        			Loco.Components.Element.Fading.ClearFadingProcess();
        			Loco.Components.Element.Fading.Alpha = 0;
        			return;
        		}
        		Loco.Components.Element.Fading.Box.style.filter = "alpha(opacity=" + Loco.Components.Element.Fading.Alpha + ")";
        		if (Loco.Components.Element.Fading.Box.style.display == 'none')
        			Loco.Components.Element.Fading.Box.style.display = 'block';
        		Loco.Components.Element.Fading.Alpha += Loco.Components.Element.Fading.Speed;
        	},
        	Hide: function() {
        		if (Loco.Components.Element.Fading.Box == null)
        			return;
        		Loco.Components.Element.Fading.Box.style.display = "none";
        		Loco.Components.Element.Fading.ClearFadingProcess();
        		Loco.Components.Element.Fading.Alpha = 0;
        		Loco.Components.Element.Fading.Box = null;
        	},
        	ClearFadingProcess: function() {
        		clearTimeout(Loco.Components.Element.Fading.Timeout);
        		clearInterval(Loco.Components.Element.Fading.Interval);
        		Loco.Components.Element.Fading.Timeout = null;
        		Loco.Components.Element.Fading.Interval = null;
        	}
}//fading
     }, //element
  	Language:
     {
     	initialize: function(placeHolder, template, hidden, select) {
     		this.placeHolder = loco$(placeHolder);
     		this.template = loco$(template);
     		this.hidden = loco$(hidden);
     		this.select = loco$(select);
     		this.template.style.display = 'none';
     	},
     	add: function() {
     		var item = this.select.item(this.select.selectedIndex);
     		if (loco$(item.value + '_form') != null)
     			return;
     		var HTML = this.template.innerHTML;
     		HTML = Loco.Text.Replace(HTML, '[%LanguageId%]', item.value);
     		HTML = Loco.Text.Replace(HTML, '[%LanguageName%]', item.text);
     		HTML = Loco.Text.Replace(HTML, '[%Delete%]', 'javascript:Loco.Component.Language.del(\'' + item.value + '\');');
     		//HTML= Loco.Text.Replace( HTML, '[%Add%]', 'javascript:Loco.Component.Language.add();');
     		var Panel = document.createElement('span');
     		Panel.innerHTML = HTML;
     		Panel.id = item.value + '_form';
     		this.placeHolder.insertAdjacentElement('beforeEnd', Panel);
     		this.updateHidden();
     	},
     	del: function(lang) {
     		loco$(lang + '_form').outerHTML = '';
     		this.updateHidden();
     	},
     	updateHidden: function() {
     		var result = '';
     		for (var i = 0; i < this.select.length; i++) {
     			var lang = this.select.item(i).value;
     			if (loco$(lang + '_form') != null)
     				result += lang + ',';
     		}
     		if (result != '')
     			result = result.substring(0, result.length - 1);

     		this.hidden.value = result;
     	}
}//Language
  }, //Components
	Image:
  {
  	Fade: function(ImageElem, Src) {
  		ImageElem.style.filter = 'blendTrans(duration=2)';
  		if (ImageElem.filters.blendTrans.status != 2) {
  			ImageElem.insertAdjacentHTML('afterEnd', '<img id="' + ImageElem.id + '_Fadding" src="' + Src + '" style="display:none"/>');
  			loco$(ImageElem.id + '_Fadding').onreadystatechange = function() {
  				var Status = loco$(ImageElem.id + '_Fadding').readyState;
  				loco$(ImageElem.id + '_Fadding').outerHTML = '';
  				if (Status != 'complete')
  					return Loco.Image.Fade(ImageElem, Src);

  				ImageElem.filters.blendTrans.apply();
  				ImageElem.src = Src;
  				ImageElem.filters.blendTrans.play();
  			}
  		}
  	} //Fade
  }, //Image
	Text:
  {
  	Fade: function(TextElem, innerText) {
  		TextElem.innerText = innerText;
  	},
  	Summerize: function(Source, length) {
  		if (Source.length <= length)
  			return Source;
  		return Source.substr(0, length - 3) + '...';
  	},
  	Replace: function(String, Pattern, Value) {
  		while (String.indexOf(Pattern) != -1)
  			String = String.replace(Pattern, Value);
  		return String;
  	},
  	Length: function(str, style) {
  		var sp = loco$('Ruler');
  		if (sp == null) {
  			var sp = document.createElement('span');
  			sp.id = 'Ruler';
  			document.body.insertBefore(sp);
  		}

  		if (style != null)
  			sp.style.cssText = style;
  		sp.style.visibility = "hidden";
  		sp.innerHTML = str;
  		return sp.offsetWidth;
  	}
  }, //Text
	Language: function(element, formats) {
		element.formats = formats;
		element.onkeypress = function() {
			for (var i = 0; i < this.formats.length; i++) {
				switch (this.formats[i]) {
					case Loco.LanguageType.Farsi:
						this.dir = 'rtl';
						event.keyCode = Loco.String.Farsi(event.keyCode);
						break;
					case Loco.LanguageType.English:
						this.dir = 'ltr';
						event.keyCode = Loco.String.English(event.keyCode);
						break;
				}
			}
		}
	}, //Language
	Format: function(element, formats) {
		element.formats = formats;
		element.onkeyup = function() {
			for (var i = 0; i < this.formats.length; i++) {
				switch (this.formats[i]) {
					case Loco.FormatType.Number:
						this.value = Loco.String.Number(this.value);
						break;
					case Loco.FormatType.Price:
						this.value = Loco.String.Number(this.value);
						this.value = Loco.String.Price(this.value);
						break;
					case Loco.FormatType.SSN:
						this.value = Loco.String.Number(this.value);
						this.value = Loco.String.SSN(this.value);
						break;
					case Loco.FormatType.PostalCode:
						this.value = Loco.String.PostalCode(this.value);
						break;
					case Loco.FormatType.Alphabet:
						if (this.Language == Loco.LanguageType.Farsi)
							this.value = Loco.String.Alphabet(this.value, Loco.LanguageType.Farsi);
						else
							this.value = Loco.String.Alphabet(this.value, Loco.LanguageType.English);
						break;
					case Loco.FormatType.CertificateNumber:
						this.value = Loco.String.CertificateNumber(this.value);
						break;
					case Loco.FormatType.DashNumber:
						this.value = Loco.String.DashNumber(this.value);
						break;
				}
			}
		}
		element.rawValue = function() {
			var result = this.value;
			for (var i = 0; i < this.formats.length; i++) {
				switch (this.formats[i]) {
					case Loco.FormatType.Number:
						break;
					case Loco.FormatType.Price:
						result = Loco.String.removePrice(result);
						break;
					case Loco.FormatType.SSN:
						result = Loco.String.removeSSN(result);
						break;
				}
				return result;
			}
		}
	}, //Format
	FormatType:
  {
  	Number: 'Number',
  	Price: 'Price',
  	SSN: 'SSN',
  	PostalCode: 'PostalCode',
  	CertificateNumber: 'CertificateNumber',
  	DashNumber: 'DashNumber'
  },
	LanguageType:
  {
  	Farsi: 'fa',
  	English: 'en'
  },
	String:
  {
  	Alphabet: function(source, languageType) {
  		source += '';
  		switch (languageType) {
  			case Loco.LanguageType.Farsi:
  				var regexp = new RegExp("[^a-z';,`\\[\\]]");
  				do {
  					source = source.replace(regexp, '');
  				}
  				while (source.search(regexp) >= 0)
  				break;
  			case Loco.LanguageType.English:
  				var regexp = new RegExp("[^a-zA-Z]");
  				do {
  					source = source.replace(regexp, '');
  				}
  				while (source.search(regexp) >= 0)
  				break;
  		}
  		return source;
  	},
  	Number: function(source) {
  		source += '';
  		var regexp = new RegExp("\\D");
  		do {
  			source = source.replace(regexp, '');
  		}
  		while (source.search(regexp) >= 0)
  		return source;
  	},
  	Price: function(source) {
  		source += '';
  		source = source.replace(new RegExp(',', 'g'), '');
  		var regexp = new RegExp("\\B(\\d{3})(,|$)");
  		do {
  			source = source.replace(regexp, ",$1");
  		}
  		while (source.search(regexp) >= 0)
  		return source;
  	},
  	removePrice: function(source) {
  		return source.replace(new RegExp(',', 'g'), '');
  	},
  	DashNumber: function(source) {
  		source += '';
  		var regexp = new RegExp("[^0-9\\-]");
  		do {
  			source = source.replace(regexp, '');
  		}
  		while (source.search(regexp) >= 0)
  		return source;
  	},
  	CertificateNumber: function(source) {
  		source += '';
  		var regexp = new RegExp("[^0-9/\\-\\\\]");
  		do {
  			source = source.replace(regexp, '');
  		}
  		while (source.search(regexp) >= 0)
  		return source;
  	},
  	SSN: function(source) {
  		source += '';
  		source = source.replace(new RegExp('-', 'g'), '');
  		regexp = new RegExp("^(\\d{3})(\\d{1})");
  		if (source.search(regexp) >= 0)
  			source = source.replace(regexp, "$1-$2");

  		regexp = new RegExp("^(\\d{3})(-)?(\\d{6})(\\d{1})");
  		if (source.search(regexp) >= 0)
  			source = source.replace(regexp, "$1-$3-$4");

  		regexp = new RegExp("^(\\d{3})(-)?(\\d{6})(-)?(\\d)(\\d)+");
  		if (source.search(regexp) >= 0)
  			source = source.replace(regexp, "$1-$3-$5");

  		return source;
  	},
  	removeSSN: function(source) {
  		return source.replace(new RegExp('-', 'g'), '');
  	},
  	PostalCode: function(source) {
  		source += '';
  		source = source.replace(new RegExp('-', 'g'), '');
  		regexp = new RegExp("^(\\d{5})(\\d{1})");
  		if (source.search(regexp) >= 0)
  			source = source.replace(regexp, "$1-$2");

  		regexp = new RegExp("^(\\d{5})(-)?(\\d{5})(\\d)+");
  		if (source.search(regexp) >= 0)
  			source = source.replace(regexp, "$1-$3");

  		return source;
  	},
  	NavigationKey: function(key) {
  		switch (key) {
  			case 8: //backspace
  			case 9: //tab
  			case 13: //enter
  			case 16: //shift tab
  			case 17: //ctrl
  			case 18: //alt
  			case 33: //pageup
  			case 34: //pagedown
  			case 35: //end
  			case 36: //home
  			case 37: //left
  			case 38: //up
  			case 39: //right
  			case 40: //down
  			case 45: //insert
  			case 46: //delete
  				return true;
  		}
  		return false;
  	},
  	FaConvertibleKey: function(key) {
  		return (key != Loco.String.Farsi(key));
  	},
  	EnConvertibleKey: function(key) {
  		return (key != Loco.String.English(key));
  	},
  	Fa: function(source) {
  		var result = "";
  		for (var i = 0; i < source.length; i++)
  			result += String.fromCharCode(Loco.String.Farsi(source.charCodeAt(i)));
  		return result;
  	},
  	En: function(source) {
  		var result = "";
  		for (var i = 0; i < source.length; i++)
  			result += String.fromCharCode(Loco.String.English(source.charCodeAt(i)));
  		return result;
  	},
  	Farsi: function(Key) {
  		if (Key > 127)
  			return Key;
  		switch (Key) {
  			case 72:
  				return 1570;
  			case 104:
  				return 1575;
  			case 102:
  			case 70:
  				return 1576;
  			case 96:
  				return 1662;
  			case 106:
  			case 74:
  				return 1578;
  			case 101:
  			case 69:
  				return 1579;
  			case 91:
  				return 1580;
  			case 93:
  				return 1670;
  			case 112:
  			case 80:
  				return 1581;
  			case 111:
  			case 79:
  				return 1582;
  			case 110:
  			case 78:
  				return 1583;
  			case 98:
  			case 66:
  				return 1584;
  			case 118:
  			case 86:
  				return 1585;
  			case 99:
  			case 67:
  				return 1586;
  			case 92:
  				return 1688;
  			case 115:
  			case 83:
  				return 1587;
  			case 97:
  			case 65:
  				return 1588;
  			case 119:
  			case 87:
  				return 1589;
  			case 113:
  			case 81:
  				return 1590;
  			case 120:
  			case 88:
  				return 1591;
  			case 122:
  			case 90:
  				return 1592;
  			case 117:
  			case 85:
  				return 1593;
  			case 121:
  			case 89:
  				return 1594;
  			case 116:
  			case 84:
  				return 1601;
  			case 114:
  			case 82:
  				return 1602;
  			case 59:
  				return 1603;
  			case 39:
  				return 1711;
  			case 103:
  			case 71:
  				return 1604;
  			case 108:
  			case 76:
  				return 1605;
  			case 107:
  			case 75:
  				return 1606;
  			case 44:
  				return 1608;
  			case 105:
  			case 73:
  				return 1607;
  			case 100:
  				return 1610;
  			case 68:
  				return 1609;
  			case 109:
  			case 77:
  				return 1574;
  			default:
  				return Key;
  		}
  	},
  	English: function(Key) {
  		if (Key < 128)
  			return Key;
  		switch (Key) {
  			case 1570:
  				return 72;
  			case 1575:
  				return 104;
  			case 102:
  			case 1576:
  				return 70;
  			case 1662:
  				return 96;
  			case 106:
  			case 1578:
  				return 74;
  			case 101:
  			case 1579:
  				return 69;
  			case 1580:
  				return 91;
  			case 1670:
  				return 93;
  			case 112:
  			case 1581:
  				return 80;
  			case 111:
  			case 1582:
  				return 79;
  			case 110:
  			case 1583:
  				return 78;
  			case 98:
  			case 1584:
  				return 66;
  			case 118:
  			case 1585:
  				return 86;
  			case 99:
  			case 1586:
  				return 67;
  			case 1688:
  				return 92;
  			case 115:
  			case 1587:
  				return 83;
  			case 97:
  			case 1588:
  				return 65;
  			case 119:
  			case 1589:
  				return 87;
  			case 113:
  			case 1590:
  				return 81;
  			case 120:
  			case 1591:
  				return 88;
  			case 122:
  			case 1592:
  				return 90;
  			case 117:
  			case 1593:
  				return 85;
  			case 121:
  			case 1594:
  				return 89;
  			case 116:
  			case 1601:
  				return 84;
  			case 114:
  			case 1602:
  				return 82;
  			case 1603:
  				return 59;
  			case 1711:
  				return 39;
  			case 103:
  			case 1604:
  				return 71;
  			case 108:
  			case 1605:
  				return 76;
  			case 107:
  			case 1606:
  				return 75;
  			case 1608:
  				return 44;
  			case 105:
  			case 1607:
  				return 73;
  			case 1610:
  				return 100;
  			case 1609:
  				return 68;
  			case 109:
  			case 1574:
  				return 77;
  			default:
  				return Key;
  		}
  	}

}//String:
}//Loco
if( typeof(document.onreadystatechange)=="undefined")
{
  window.setTimeout( "eval( Loco.document.onreadystatechange);", 2000);
}
else
{
  document.onreadystatechange= function()
  {
    if( document.readyState== 'complete')
      eval( Loco.document.onreadystatechange);
  }
}
