;(function($){
		  
	var __elems = document.getElementsByTagName("script"),
	__rootUrl,
	__baseUrl,
	__baseScriptUrl,
	__home     = $('link[rel="home"]'),
	__template = $('link[rel="template"]');
	
	var __uri   = window.location;
	__rootUrl = __baseUrl   =  __uri.protocol +'//'+ __uri.hostname  + ((__uri.port)?':'+__uri.port:'');
		
	if(__home.length>0){
		   __baseUrl      = __home.attr('href');	
	}
	__template      = (__template.length>0)? __template.attr('href'):__baseUrl;	
	
	for(var i=0; i<__elems.length ;i++)
	{
		var src= __elems[i].src;
		var re = new RegExp("(.*)/js/jqarta.core(([0-9\\-\\.]+)|).js$",'ig');
		if( m = src.match (re))
		{
			__baseScriptUrl = RegExp.$1 + '/js';
			break;
		}
	}

	var __loaded_src = [];
	function __linkNotExists(src,tag) 
	{
		if(!String(src).isUrl())
		{
			var slashPos =src.indexOf('/');
			src =(slashPos!=0)?  __baseScriptUrl + '/' + src: __baseUrl  + src;
		}
		if(__loaded_src[src])
		{
			return false;
		}
		var elems = document.getElementsByTagName(tag);
		for(var i=0;i<elems.length;i++)
		{
			var url = (tag=='script')? elems[i].src : elems[i].href;
			if(url== src || url == __rootUrl + src)
			{
				return false;
			}
		}
		return src;
	}
	function __include(sources,tag) 
	{
		
		for(var i=0; i<sources.length; i++)
		{
			var src = __linkNotExists(sources[i],tag);
			if( src )
			{
				if(tag=='script')
				{
					document.write('<script language="javascript" type="text/javascript" src="'+src+'"></script>');
				}else if(tag=='link')
				{
					document.write('<link rel="stylesheet" type="text/css"  href="'+src +'" />');
				}
				__loaded_src[src]=true;
			}
		}
	}
////////// GLOBAL FUNCTIONS ///////////////// 
	window.isObject = function(obj)
	{
		return Object.prototype.toString.call(obj) === "[object Object]";
	};
	window.isArray = function(obj)
	{
		return obj.constructor == Array;
	};
	window.isNull = function(obj)
	{
		return obj == null;
	};
	window.isEmpty = function(obj)
	{
		return obj == 0 || obj == "" || isNull(obj) ;
	};
	window.isString = function(obj)
	{
		return  typeof obj=="string";
	};
	window.isNumeric = function(obj) 
	{
		return  typeof obj=="number";
	};
	window.isElement = function(obj)
	{
		return obj.tagName?true:false;
	};
	window.isDate = function(obj)
	{
		return !/Invalid|NaN/.test(new Date(obj));
	};
	window.isUndefined = function(obj)
	{
		return typeof obj=="undefined";
	};
///////////////////////////////////////////
	var uid =[];
	var ja = window.ja =
	{
		uniqueName      :  function(prefix){
			prefix = prefix|| '_je';
			if(uid[prefix]==undefined)	
				uid[prefix]=-1;
			
			return prefix + (++uid[prefix]);
		},
		//enableFormValidator: true,
		baseUrl      :  __baseUrl,
		baseScriptUrl:__baseScriptUrl,
		templateUrl  :  __template,
		include      : function(sources) 
		{
			__include(isArray(sources)?sources: arguments,'script');
		},
		includeCss : function(sources) 
		{
			__include(isArray(sources)?sources: arguments,'link');
		},
		loadCss    : function(src) 
		{
			if(!$.browser.msie)
			{
				$("head").append('<link rel="stylesheet" type="text/css"  href="'+src +'" />');
			}else
			{
				var head = document.getElementsByTagName("head")[0],
				css = document.createElement("link");
				css.type = "text/css";
				css.rel = "stylesheet";
				css.href = src;
				head.insertBefore( css, head.firstChild );
				head.removeChild( css );
			}
		},
		getMeta : function(name)
		{
			var tags = document.getElementsByTagName('meta');
			name = name.toLowerCase();
			for(var i in tags){
				var m = tags[i];
				if( String(m['name']).toLowerCase() == name || String(m['httpEquiv']).toLowerCase() == name)
					return  m.content;
			}
			return null;
		},
		
		ui:{
			popup:
			{
				getDisplayRect:function (popup, a,b,margin)
				{
					var rpopup = popup.rectangle();
					var rwnd   = $(window).rectangle(),
					rtarget,dock = 'bl';
					margin = margin==undefined?0: margin;
					
					if(typeof(a)=='object')
					{
						rtarget = a.rectangle();
						dock  = b;
					}else
						rtarget = new ja.drawing.rectangle(a,b,0,0);
	
					var __ = function(x,y) {
						return new ja.drawing.rectangle(x,y,rpopup.width,rpopup.height);
					};
					var rect;
					switch (dock)
					{
						case "br": rect=__(rtarget.right() - rpopup.width,rtarget.bottom()); break;
						case "tr": rect=__(rtarget.right() - rpopup.width, rtarget.top - rpopup.height); break;	
						case "tl": rect=__( rtarget.left ,rtarget.top - rpopup.height); break;
						case "lt": rect=__( rtarget.left-rpopup.width ,rtarget.top); break;	
						case "rt": rect=__( rtarget.right() ,rtarget.top); break;
						case "rb": rect=__( rtarget.right() , rtarget.bottom()-rpopup.height); break;
						//case "lb": rect=__( rtarget.right() , rtarget.bottom()-rpopup.height); break;
						case "r" : 
						case "l" : 
							rect=__( rtarget.right() ,rtarget.top  - ((rpopup.height/2) - (rtarget.height/2)) ); break;
						case "b" : 
						case "t" : 
							rect=__( rtarget.left  - ((rpopup.width/2) - (rtarget.width/2)),rtarget.bottom()); break;
						default  : rect=__(rtarget.left,rtarget.bottom());dock ='bl';
					}
					if(dock=='t') rect.top  =  rtarget.top - rpopup.height;
					if(dock=='l') rect.left =  rtarget.left - rpopup.width;
					rect.dock = dock;
					
					if( margin>0 ){
						if(dock=='bl' || dock=='b'  || dock=='br')
							rect.top += margin;
						else if(dock=='t' || dock=='tl' || dock=='tr')
							rect.top -= margin;	
						else if(dock=='r' || dock=='rt' || dock=='rb')
							rect.left += margin;	
						else if(dock=='l' || dock=='lt' || dock=='lb')
							rect.left -= margin;
					}
					var fl = function(flip)
					{
						if(rect.left< rwnd.left)
						{
							if(flip)
							{
								var xr = rtarget.right();
								if( xr + rect.width<= rwnd.right())
								{
									rect.left = xr;
									return true;
								}
							}else
								rect.left = rwnd.left;
						}
					};
					var fr = function(flip)
					{
						if(rect.right()> rwnd.right())
						{
							if(flip)
							{
								var xr = rtarget.left-rect.width;
								if(xr >= rwnd.left)
								{
									rect.left = xr;
									return true;
								}
							}else
								rect.left = rwnd.right()-rect.width;
						}
					};
					var ft = function(noflip){
						if(rect.top < rwnd.top)
						{
							if(noflip)
								rect.top = rwnd.top;
							else{
								if((rtarget.bottom() + rect.height) <= rwnd.bottom())
								{
									rect.top = rtarget.bottom();
									return true;
								}
							}
						}
					};
					var fb = function(noflip){
						if(rect.bottom() > rwnd.bottom())
						{
							if(noflip)
							{
								rect.top = rwnd.bottom() - rect.height;
							}else{
								if(rtarget.top- rect.height >= rwnd.top)
								{
									rect.top = rtarget.top - rect.height;
									return true;
								}
							}
						}
					};
					if(dock=='bl'){
						fr(); rect.dock= fb()?'tl':'bl';
					}else if(dock=='br'){
						fl(); rect.dock= fb()?'tr':'br';
						
					/////////////////////////
					}else if(dock=='tl'){
						fr(); rect.dock= ft()?'bl':'tl';
					}else if(dock=='tr'){
						fr(); rect.dock= ft()?'br':'tr';
					}
					////////////////////////   
					else if(dock=='lt'){//// LETT TOP 
						fb(true); rect.dock= fl(true)?'rt':'lt';
					}else if(dock=='rt'){//  RIGHT TOP
						fb(true); rect.dock= fr(true)?'lt':'rt';
					}
					////////////////////////   
					else if(dock=='lb'){//// LETT BOTTOM 
						ft(true); rect.dock = fl(true)?'rb':'lb';
					}else if(dock=='rb'){//  RIGHT BOTTOM
						ft(true); rect.dock = fr(true)?'lb':'rb';
					}
					/////////////////////////
					else if(dock=='t'){
						rect.dock= ft()?'b':'t';
						fl();fr();
					}else if(dock=='b'){
						rect.dock= fb()?'t':'b';
						fl();fr();
					}
					/////////////////////////
					else if(dock=='r'){
						fb(true);rect.dock= fr(true)?'l':'r';
					}else if(dock=='l'){
						fb(true);rect.dock= fl(true)?'r':'l';
					}
				
					if( margin>0 && rect.dock!=dock)
					{
						if(dock=='bl' || dock=='b' || dock=='br')
							rect.top -= margin;
						else if(dock=='tl' || dock=='t' || dock=='tr')
							rect.top += margin;
						else if(dock=='r' || dock=='rt' || dock=='rb')
							rect.left -= margin;	
						else if(dock=='l' || dock=='lt' || dock=='lb')
							rect.left += margin;
					}
					return rect;
				}
			}
		},
		drawing:
		{
			point:function (x,y)
			{
				this.x= x || 0;
				this.y= y || 0;
				this.offset=function(x,y)
				{
					this.x += x || 0;
					this.y += y || 0; 
				};
			},
			rectangle:function (a,b,c,d)
			{
				var self=this;
				if(arguments.length==1 && a.length)
				{
					if(a[0] == window)
					{
						this.update = function()
						{
							this.left   = a.scrollLeft();
							this.top    = a.scrollTop();
							this.width  = a.width();
							this.height = a.height();
						};
					}else{
						this.update = function()
						{
							var of    = a.offset();
							this.left = of.left;
							this.top  = of.top;
							this.width  = a.outerWidth();
							this.height = a.outerHeight();
						};
					}
					this.update();
				}
				else
				{
					this.left   = a?a:0;
					this.top    = b?b:0;
					this.width  = c?c:0;
					this.height = d?d:0;
				}
				
				this.right  = function() {return this.width + this.left;};
				this.bottom = function() {return this.height + this.top;};
	
				this.pointInRect = function(x,y)
				{
					return (x>=this.left && x<= this.right()) && (y>=this.top && y<= this.bottom());
				};
				var obj  =this;
				function _inRect(rc)
				{
					return rc.pointInRect(obj.left,obj.top)
					+ rc.pointInRect(obj.right(),obj.top)
					+ rc.pointInRect(obj.left,obj.bottom())
					+ rc.pointInRect(obj.right(),obj.bottom()); 
				}
				this.inRect = function(a)
				{
					return  _inRect(a)==4;// : this.pointInRect(a.left,a.top);
				};
				this.intersectsWith = function(rc)
				{
					var p= _inRect(rc);
					return (p>0 && p<4);
				};
				this.clone = function()
				{
					return new ja.drawing.rectangle(self.left,self.top,self.width,self.height);
				};
				this.offset = function(x,y)
				{
					this.left  += x;
					this.top   += y || 0;
				};
				this.toCenterOfRect = function(rectOuter)
				{
					this.left  = (rectOuter.width - this.width)/2;
					this.top   = (rectOuter.height - this.height)/2;
				};
				this.scale = function(scale,centerPivot)
				{
					var pivot = centerPivot==undefined? true : centerPivot;
					var r =new ja.drawing.rectangle(self.left,self.top,
						self.width * (scale/100),
						self.height * (scale/100));
					if(centerPivot)
					{
						r.left = self.left -  ((r.width-self.width) /2);
						r.top  = self.top -  ((r.height-self.height) /2);
					}
					return r;
				};
			},
			color:
			{
				rgb: function(r,g,b)
				{
					this.r = r | 0;
					this.g = g | 0;
					this.b = b | 0;
					var self=this;
					this.toString = function()
					{
						return 'rgb('+this.r+','+this.g+','+this.b+')';
					};
					this.getHex = function()
					{
						return  self.r.toString(16).padLeft(2,"0")
						+self.g.toString(16).padLeft(2,"0")
						+self.b.toString(16).padLeft(2,"0");
					};
					this.getDec =function()
					{
						return parseInt(self.toHex(),16);
					};
				},
				hexFromDec: function(num)
				{
					num = Math.max(0,Math.min(num,16777215));
					return num.toString(16).padLeft(6,"0");
				}
				,
				decFromHex: function(hex)
				{
					hex = hex.indexOf('#')== 0? hex.substring(1):hex;
					if(hex.length==3)
					{
						return parseInt(
						"0"+hex.charAt(0)+
						"0"+hex.charAt(1)+
						"0"+hex.charAt(1)
						,16);
					}
					else if(hex.length==6)
						return parseInt(hex,16);
					return 0;
				}
			}
		}
	};
	ja.drawing.color.rgb.fromDec =function(num)
	{
		num = Math.max(0,Math.min(num,16777215));
		return ja.drawing.color.rgb.fromHex(num.toString(16).padLeft(6,"0"));
	};
	ja.drawing.color.rgb.fromHex =function(hex)
	{
		hex = hex.indexOf('#')== 0? hex.substring(1):hex;
		if(hex.length==3)
		{
			return new ja.color.rgb(
			"0"+hex.charAt(0),
			"0"+hex.charAt(1),
			"0"+hex.charAt(1));
		}
		else if(hex.length==6)
		{
			return new ja.color.rgb(
				parseInt(hex.substring(0,2),16),
				parseInt(hex.substring(2,4),16),
				parseInt(hex.substring(4,6),16)
			);
		}
		return new ja.drawing.color.rgb();
	};
	$.extend(Array.prototype,
	{
		clone: function()
		{	
			return this.concat();
		},
		each: function(callback)
		{	
			for(i=0;i<this.length;i++)
			{
				callback(i,this[i]);
			}
		},
		indexOf: function(value)
		{	
			for(i=0;i<this.length;i++)
			{
				if(this[i]==value)
					return i;
			}
			return -1;
		},
		getKeys: function()
		{	
			var retval=[];
			for(key in this)
			{
				if( typeof this[key] != "function")
					retval.push(key);
			}
			return retval;
		},
		getValues: function()
		{	
			var retval=[];
			for(key in this)
			{
				if( typeof this[key] != "function")
					retval.push(this[key]);
			}
			return retval;
		},
		clean: function()
		{	
			var retval=[];
			for(i=0;i<this.length;i++)
			{
				if( this[i] !== undefined || this[i] != null)
					retval.push(this[i]);
			}
			//this. = retval;
		},
		shuffle:function()
		{	
			var len = this.length;
			if(len<=1) return this;
			var ar     = this.concat();
			var retval = [];
			for(i=0;i<len;i++)
			{
				var ind = Math.random() * ar.length;
				retval.push(ar[Math.floor(ind)]);
				ar.splice (ind,1);
			}
			return retval;
		}
	});

	///// PROTOTYPE : Number ///////////////////////
	
	Number.prototype.formatCurrency = function(useSymbol, culture)
	{
		var locale = culture? (ja.globalization.cultures[culture]?ja.globalization.cultures[culture]:ja.globalization.locale):ja.globalization.locale;
		var patern = locale.currency.paterns[(this<0?0:1)];
		var numStr = __format(Math.abs(this),locale.number.decimalDigits, locale.currency);
		
		return patern.replace(/[\$n]/g, function ($0) {
			return $0=='$'? (useSymbol?locale.currency.symbol:""): numStr;
		});
	};
	Number.prototype.formatNumber = function(precision, culture)
	{
		var locale = culture? (ja.globalization.cultures[culture]?ja.globalization.cultures[culture]:ja.globalization.locale):ja.globalization.locale;
		var patern = locale.number.paterns[(this<0?0:1)];
		precision  =  precision || (this == parseFloat(this)?0:locale.number.decimalDigits);
		
		var numStr = __format(Math.abs(this),precision, locale.number);
		return patern.replace(/n/g, numStr);
	};
	function __format(number,precision,formatInfo)
	{
		var groupSizes = formatInfo.groupSizes,
			curSize = groupSizes[ 0 ],
			curGroupIndex = 1,
			factor = Math.pow( 10, precision ),
			rounded = Math.round( number * factor ) / factor;
			
		if ( !isFinite(rounded) ) {
			rounded = number;
		}
		number = rounded;
		var numberString = number+"",
			right = "",
			split = numberString.split(/e/i),
			exponent = split.length > 1 ? parseInt( split[ 1 ], 10 ) : 0;
		numberString = split[ 0 ];
		split = numberString.split( "." );
		numberString = split[ 0 ];
		right = split.length > 1 ? split[ 1 ] : "";
	
		var l;
		if ( exponent > 0 ) {
			right = zeroPad( right, exponent, true );
			numberString += right.slice( 0, exponent );
			right = right.substr( exponent );
		}
		else if ( exponent < 0 ) {
			exponent = -exponent;
			numberString = zeroPad( numberString, exponent + 1,false );
			right = numberString.slice( -exponent, numberString.length ) + right;
			numberString = numberString.slice( 0, -exponent );
		}
		if ( precision > 0 ) {
			right = formatInfo.separators[1] +
				((right.length > precision) ? right.slice( 0, precision ) : zeroPad( right, precision ,true));
		}
		else {
			right = "";
		}
		var stringIndex = numberString.length - 1,
			sep = formatInfo.separators[0],
			ret = "";
	
		while ( stringIndex >= 0 ) {
			if ( curSize === 0 || curSize > stringIndex ) {
				return numberString.slice( 0, stringIndex + 1 ) + ( ret.length ? ( sep + ret + right ) : right );
			}
			ret = numberString.slice( stringIndex - curSize + 1, stringIndex + 1 ) + ( ret.length ? ( sep + ret ) : "" );
	
			stringIndex -= curSize;
	
			if ( curGroupIndex < groupSizes.length ) {
				curSize = groupSizes[ curGroupIndex ];
				curGroupIndex++;
			}
		}
		return numberString.slice( 0, stringIndex + 1 ) + sep + ret + right;

	}
	function zeroPad(val, count, right) 
	{
		var str = String(val);
		count = count || 2;
		for (var l=str.length; l < count; l++) {
			str = (!right ? ('0' + str) : (str + '0'));
		}
		return str;
	}
	///// PROTOTYPE : String ///////////////////////
	
	$.extend(String.prototype,
	{
		isUrl: function ()
		{
			//var re = /^(http|https):\/\/[A-Za-z0-9\.-]{3,}\.[A-Za-z]{3}/;
			var re = /^(http|https):\/\/[A-Za-z0-9\.-]{3,}/;
			return re.test(this);
		},
		isEmail : function ()
		{
			var re = /([A-Za-z0-9\.-_]+)@([A-Za-z0-9\.-_])/;
			return re.test(this);
		},
		shuffle : function () 
		{
			if(this.length<=1) return this;
			var ar = (this.split('')).shuffle();
			return ar.join('');
		},
		padLeft : function (len,_char) 
		{
			_char = _char || " ";
			len = len || 1;
			val = this;
			while (val.length < len){ val =  _char + val;}
				return val;
		},
		padRight : function (len,_char) 
		{
			_char = _char || " ";
			len = len || 1;
			val = this;
			while (val.length < len) {val =  val + _char;}
				return val;
		},
		trim : function () 
		{
			return (this || "").replace(/^\s+|\s+$/g, "" );
		},
		trimLeft : function () 
		{
			return (this || "").replace(/^\s+/g, "" );
		},
		trimRight: function () 
		{
			return (this || "").replace(/\s+$/g, "" );
		},
		repeat : function (n,separator) 
		{
			if (n > 0){
				separator = separator || "";
				var s = [this];
				for (var i = 1; i < n; i++){
					s.push(this);
				}
				return s.join(separator);
			}
			return this;
		},
		regSlashes : function () 
		{
			return this.addSlashes(/[\(\)\*\[\]\|\{\}\-\*\+\$\!\.\'\"\:\?\\]/g);
		},
		addSlashes : function (rg) 
		{
			if(rg=="")
				return "\\"+ (this.split("").join("\\"));
			else
			{
				rg =  rg ||  "\"\'\\\\";
				var re = typeof rg=='string'? new RegExp("(["+rg+"]+)","g"):rg;
				return this.replace(re, function ($0) 
				{
					return "\\"+ $0;
				});
			}
		},
		startWidth : function (str) 
		{
			return this.indexOf(str)==0;
		},
		endWidth : function (str) 
		{
			return this.lastIndexOf(str)==this.length-str.length;
		},
		capitalize : function()
		{
			return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
		},
		format : function () 
		{
			var params = arguments;
			if ( params.length > 0 )
			{
				if (params.length==1 && isArray(params[0]))
					params =  isArray(params[0]) ? params[0] : [params[0]];
			}else
				return this;
			var i=-1;
			return this.replace(/\{([0-9]+)\}/g, function ($0) 
			{
				return  params[++i];
			});
		}
	});
	

///// PROTOTYPE : Date ///////////////////////
////////////////////////////////////////////////

	var num_months = [31,0,31,30,31,30,31,31,30,31,30,31];
	Date.isLeapYear = function (year, boolReturnDays)
	{
		var days = (year % 4 == 0)? 29 : 28;
		return (boolReturnDays)? days:days==29;
	};
	Date.daysInMonths = function (year)
	{
		var ar = num_months.slice();
		ar[1]  = Date.isLeapYear(year,true);
		return  ar;
	};
	Date.daysInMonth = function (a,b)
	{
		var m,y;
		if(arguments.length==1){
			m = a.getMonth();
			y = a.getFullYear();
		}else{
			m= b;
			y= a;
		}
		return m==1?Date.isLeapYear(y,true): num_months[m];
	};
	Date.daysInYear = function (year)
	{
		return Date.isLeapYear(y)?367:365;
	};
	Date.msToDays  = function(ms)
	{
		return ms/1000/60/60/24;
	};
	Date.msToHours  = function(ms)
	{
		return ms/1000/60/60;
	};
	Date.msToMinutes  = function(ms)
	{
		return ms/1000/60;
	};
	Date.msToSeconds  = function(ms)
	{
		return ms/1000;
	};
	$.extend(Date.prototype,
	{
		getWeek : function()
		{
			//var jan = new Date(this.getFullYear(),0,1);
			//return Math.ceil((((this - jan) / 86400000) + jan.getDay()+1)/7);
			var d = new Date(this);
			var D = d.getDay();
			if(D == 0) D = 7;
			d.setDate(d.getDate() + (4 - D));
			var YN = d.getFullYear();
			var ZBDoCY = Math.floor((d.getTime() - new Date(YN, 0, 1, -6)) / 86400000);
			var WN = 1 + Math.floor(ZBDoCY / 7);
			return WN;
		},
		getDaysInMonth : function()
		{
			return Date.daysInMonth(this);
		},
		getOffset : function( date)
		{
			var ms1    = this.getTime();
			var ms2    = Date.parse(date);
			//return Math.abs(ms2 - ms1);
			return (ms2 - ms1);
		},
		add   : function( mills)
		{
			return  new Date( this.getTime() + mills);
		},
		addDays : function( days)
		{
			return  this.add((days * 24 * 60 * 60 *1000));
		},
		addHours: function( hours)
		{
			return  this.add( (hours * 60 * 60 *1000));
		},
		addMinutes: function(minutes)
		{
			return  this.add((minutes * 60 *1000));
		},
		addSeconds :function(seconds)
		{
			return  this.add((seconds *1000));
		},
		addMonths : function(months, boolNumDaysInMonth)
		{
			if(months==0) return this;
			var y  = this.getFullYear();
			var m  = this.getMonth();
			
			if(months>0){
				for(i=0;i<months;i++){
					m++;
					if(m>11){
						m=0;y++;
					}	
				}
			}else{
				months *= -1;
				for(i=0;i<months;i++){
					m--;
					if(m<0){ 
						m=11; y--;
					}
				}
			}
			var d;
			var days = d = Date.daysInMonth(y,m);
			
			if(!boolNumDaysInMonth)
			{
				d = this.getDate();
				days -=1;
				d = d> days? days: d;
			}
			return new Date(y+'/'+(m+1)+'/' + d);
		},
		addYear : function(years)
		{
			return  this.setYear(this.year+years);
		},
		rangeOfMonths : function(months)
		{
			var retval=[];
			var y  = this.getFullYear();
			var m  = this.getMonth();
	
			for(i=0;i<months;i++)
			{
				if(m>11){ 
					m=0;	
					y++;
				}	
				var d = (m==1? Date.isLeapYear(y,true):num_months[m]);
				retval.push(new Date(y+'/'+(m+1)+'/1'));
				m++;
			}
			return retval;
		},
		friendlyDate: function(dayslimit)
		{
			dayslimit = dayslimit || 0;
			var cal = ja.globalization.locale.calendar;
			var conv =ja.globalization.getConversation('friendlydate');
			var diff = Math.ceil(this.getOffset(new Date())/1000),
			day_diff = Math.floor(diff / 86400),
			year_diff = Math.floor(diff / 86400 /365);
			
			if(dayslimit>0){
				if(day_diff>dayslimit)
					return this.format(cal.paterns.longDateTime);
			}
			//return day_diff;
			
			//if(day_diff<0)
			//{
			//		diff >= 60      && conv.textOneMinuteAgo ;
			//}else{
				return day_diff == 0 && (
				diff <= 60      && conv.textOneMinuteAgo ||
				diff < 3600     && conv.textMinutesAgo.format(Math.ceil( diff / 60 )) ||
				//////// hourly
				diff < 7200     && conv.textOneHourAgo ||
				diff < 86400    && conv.textHoursAgo.format(Math.ceil( diff / 3600 ))) ||
				//////// daily
				day_diff == 1   &&  conv.textYesterdayAt.format( this.format(cal.paterns.shortTime)) ||
				day_diff < 7    &&  conv.textDayAt.format(this.format("dddd"), this.format(cal.paterns.shortTime)) ||
				day_diff == 7   &&  conv.textOneWeekAgo ||
				day_diff < 30   &&  conv.textDaysAgo.format(day_diff) ||
				day_diff == 30  &&  conv.textOneMonthAgo ||
				day_diff <= 365 &&  conv.textMonthsAgo.format(Math.round( day_diff / 30 )) ||
				/////////////yearly
				year_diff == 1 &&  conv.textOneYearAgo ||
				conv.textYearsAgo.format(Math.round( year_diff ));
			//}
		},
		toShortDate :  function (culture)
		{
			return this.format("shortDate",culture,true);
		},
		toLongDate :  function (culture)
		{
			return this.format("longDate",culture,true);
		},
		toLongDateTime :  function (culture)
		{
			return this.format("longDateTime",culture,true);
		},
		toShortTime :  function (culture)
		{
			return this.format("shortTime",culture,true);
		},
		toLongTime :  function (culture)
		{
			return this.format("longTime",culture,true);
		},
		toYearMonth :  function (culture)
		{
			return this.format("yearMonth",culture,true);
		},
		toMonthDay :  function (culture)
		{
			return this.format("monthDay",culture,true);
		},
		format :  function (patern,culture, ptrnIsName)
		{
			var locale = ja.globalization.cultures[culture]?ja.globalization.cultures[culture]:ja.globalization.locale;
			if(ptrnIsName)
				patern = locale.calendar.paterns[patern];
	
			var date = this,
			token    = /d{1,4}|M{1,4}|y{1,4}|f{1,3}|z{1,3}|([Hhmst])\1?|"[^"]*"|'[^']*'/g;

			var	d = date.getDate(),
			D = date.getDay(),
			M = date.getMonth(),
			y = date.getFullYear(),
			H = date.getHours(),
			m = date.getMinutes(),
			s = date.getSeconds(),
			L = date.getMilliseconds(),
			z = function(l){ hour = date.getTimezoneOffset() / 60; return (hour <= 0 ? '+' : '-') + zeroPad( Math.floor( Math.abs( hour ) ), l ); },
			Z = function(){ 
				hour = date.getTimezoneOffset() / 60;
				return ( (hour <= 0 ? '+' : '-') + zeroPad( Math.floor( Math.abs( hour ) ), 2 ) +
                    ":" + zeroPad( Math.abs( date.getTimezoneOffset() % 60 ), 2 ) );
			};
			flags = {
				d:    d,
				dd:   zeroPad(d),
				ddd:  locale.calendar.abbrDayNames[D],
				dddd: locale.calendar.dayNames[D],
				M:    M + 1,
				MM:   zeroPad(M + 1),
				MMM:  locale.calendar.abbrMonthNames[M],
				MMMM: locale.calendar.monthNames[M],
				y:    String(y).slice(3),
				yy:   String(y).slice(2),
				yyyy: y,
				h:    H % 12 || 12,
				hh:   zeroPad(H % 12 || 12),
				H:    H,
				HH:   zeroPad(H),
				m:    m,
				mm:   zeroPad(m),
				s:    s,
				ss:   zeroPad(s),
				f:    zeroPad(L, 3).substr( 0, 1 ), 
				ff:   zeroPad(L, 3).substr( 0, 2 ), 
				fff:  zeroPad(L, 3).substr( 0, 3 ), 
				//t:    H < 12 ? "a"  : "p",
				//tt:   H < 12 ? "am" : "pm",
				t:    H < 12 ? locale.calendar.AM[0] : locale.calendar.PM[0],
				tt:   H < 12 ? locale.calendar.AM[1] : locale.calendar.PM[1],
				z :   z(1),
				zz :  z(2),
				zzz:  Z()
			};
			return patern.replace(token, function ($0) {
				return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
			});
		}
	});
////////////////////////////////////////////////
	var je_evtlist = {'themeChange':[],'cultureChange':[]};
	ja.addEventListener= function(evt, callback)
	{
		evt = evt.toLowerCase();
		if(je_evtlist[evt])
			je_evtlist[evt].push(callback);
		else
			je_evtlist[evt] = [callback];
	};
	ja.dispatchEvent= function(evt,args)
	{
		evt = evt.toLowerCase();
		if(je_evtlist[evt])
		{
			var ar = je_evtlist[evt];
			for(i=0;i<ar.length;i++)
			{
				ar[i].apply(args);
			}
		}
	};
	
////////////////////////////////////////////////
	var cultureID = 'en';
	//Accept-Language
	if(l = ja.getMeta("Content-language"))
		cultureID=l;
	else
	{
		var html = document.getElementsByTagName('html')[0];
		if(l = html.getAttribute('lang'))
			cultureID=l;
	}
	
	//cultureID='en-AU'
	///////////////////////////////
	/// fix cultureID if contains lowercase region id
	var baseLang    = cultureID;
	var lang_regpos = cultureID.indexOf('-');
	if(lang_regpos>0)
	{
		baseLang = cultureID.substring(0,lang_regpos);
		cultureID     = baseLang + cultureID.substring(lang_regpos).toUpperCase();
	}
	////////////////////////////////
	//alert(cultureID);
	var localizeTexts = {};
	ja.globalization  =
	{
		defaultCulture:
		{

			englishName      : "English (Australia)",
			nativeName       : "English (Australia)",
			language         : "en",
			number: 
			{
				separators      : [",","."],
				groupSizes      : [3],
				decimals        : 2,
				paterns         : ["-n","n"]
			},
			percent: 
			{
				separators      : [",","."],
				groupSizes      : [3],
				decimals        : 2,
				paterns         : ["-n %","n"],
				symbol          : "%"
			},
			currency: 
			{
				separators      : [",","."],
				groupSizes      : [3],
				decimals        : 2,
				paterns         : ["-$n","$n"],
				symbol          : "$"
			},
			calendar:
			{
				firstDayOfWeek     : 1,
				dayNames           : ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
				abbrDayNames       : ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],
				shortDayNames      : ["Su","Mo","Tu","We","Th","Fr","Sa"],
				monthNames         : ["January","February","March","April","May","June","July","August","September","October","November","December"],
				abbrMonthNames     : ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
				AM                 : ["am","AM"],
				PM                 : ["pm","PM"],
				paterns :{
					shortDate    : "d/M/yyyy",
					longDate     : "dddd, d MMMM yyyy",
					shortTime    : "h:mm tt",
					longTime     : "h:mm:ss tt",
					shortDateTime: "d/M/yyyy h:mm tt",
					longDateTime : "dddd, d MMMM yyyy h:mm tt",
					fullDateTime : "dddd, d MMMM yyyy h:mm:ss tt",
					yearMonth    : "MMMM yyyy",
					monthDay     : "dd MMMM"
                     
				}
			}

		},
		
		addCulture: function (lcid, cultureObj)
		{
			
			cultureObj.lcid = lcid;
			ja.globalization.cultures[lcid] = ja.globalization.locale = $.extend(true, {}, ja.globalization.defaultCulture, cultureObj);
			
		},
		setCulture: function (lcid)
		{
			if(ja.globalization.cultures[lcid])
				ja.globalization.locale = ja.globalization.cultures[lcid];
			else
			{
				
				$.getScript(__baseUrl +'/data/js-culture?id='+ lcid, function() 
				{
					ja.dispatchEvent('cultureChange',lcid);
				});
			}
		},
		getConversation: function (name)
		{
			var lang =ja.globalization.locale.language;
			//if(name=='button' || name=='validator'  || name=='friendlydate' )
			//	return localizeTexts[lang][name];
			//alert(lang)
			var loadjs=false;
			
			if(!localizeTexts[lang])
			{
				localizeTexts[lang]={};
				loadjs=true;
			}else{
				if(!localizeTexts[lang][name])
				{
					localizeTexts[lang][name]={};
					loadjs=true;
				}
			}
			if(loadjs){
				
				if(localizeTexts['en'][name])
				{
					localizeTexts[lang][name]=localizeTexts['en'][name];
				}
				if(name=='button' || name=='validator'  || name=='friendlydate' )
					ja.include(__baseUrl +'/data/js-lang');
				else
					ja.include(__baseUrl +'/data/js-lang?section='+ name);
			}
			return localizeTexts[lang][name];
		},
		localize:function (baselang, name,obj)
		{
			
			if(!localizeTexts[baselang])
			{
				localizeTexts[baselang]= {};
			}
			localizeTexts[baselang][name] = obj;
			
		}
	};
	ja.globalization.cultures = {"en": ja.globalization.defaultCulture,"en-US": ja.globalization.defaultCulture};
	if(ja.globalization.cultures[cultureID])
	{
		ja.globalization.locale = ja.globalization.cultures[cultureID];
	}else
	{
		ja.include(__baseUrl +'/data/js-culture?id='+ cultureID);
	}
	ja.include(__baseUrl +'/data/js-lang');
	
  ///////////////////////////////////////////////////

	ja.encoder = {EncodeType:"entity",isEmpty:function(a){if(a){return((a===null)||a.length==0||/^\s+$/.test(a))}else{return true}},arr1:new Array('&nbsp;','&iexcl;','&cent;','&pound;','&curren;','&yen;','&brvbar;','&sect;','&uml;','&copy;','&ordf;','&laquo;','&not;','&shy;','&reg;','&macr;','&deg;','&plusmn;','&sup2;','&sup3;','&acute;','&micro;','&para;','&middot;','&cedil;','&sup1;','&ordm;','&raquo;','&frac14;','&frac12;','&frac34;','&iquest;','&Agrave;','&Aacute;','&Acirc;','&Atilde;','&Auml;','&Aring;','&Aelig;','&Ccedil;','&Egrave;','&Eacute;','&Ecirc;','&Euml;','&Igrave;','&Iacute;','&Icirc;','&Iuml;','&ETH;','&Ntilde;','&Ograve;','&Oacute;','&Ocirc;','&Otilde;','&Ouml;','&times;','&Oslash;','&Ugrave;','&Uacute;','&Ucirc;','&Uuml;','&Yacute;','&THORN;','&szlig;','&agrave;','&aacute;','&acirc;','&atilde;','&auml;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;','&ecirc;','&euml;','&igrave;','&iacute;','&icirc;','&iuml;','&eth;','&ntilde;','&ograve;','&oacute;','&ocirc;','&otilde;','&ouml;','&divide;','&Oslash;','&ugrave;','&uacute;','&ucirc;','&uuml;','&yacute;','&thorn;','&yuml;','&quot;','&amp;','&lt;','&gt;','&oelig;','&oelig;','&scaron;','&scaron;','&yuml;','&circ;','&tilde;','&ensp;','&emsp;','&thinsp;','&zwnj;','&zwj;','&lrm;','&rlm;','&ndash;','&mdash;','&lsquo;','&rsquo;','&sbquo;','&ldquo;','&rdquo;','&bdquo;','&dagger;','&dagger;','&permil;','&lsaquo;','&rsaquo;','&euro;','&fnof;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;','&sigmaf;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;','&thetasym;','&upsih;','&piv;','&bull;','&hellip;','&prime;','&prime;','&oline;','&frasl;','&weierp;','&image;','&real;','&trade;','&alefsym;','&larr;','&uarr;','&rarr;','&darr;','&harr;','&crarr;','&larr;','&uarr;','&rarr;','&darr;','&harr;','&forall;','&part;','&exist;','&empty;','&nabla;','&isin;','&notin;','&ni;','&prod;','&sum;','&minus;','&lowast;','&radic;','&prop;','&infin;','&ang;','&and;','&or;','&cap;','&cup;','&int;','&there4;','&sim;','&cong;','&asymp;','&ne;','&equiv;','&le;','&ge;','&sub;','&sup;','&nsub;','&sube;','&supe;','&oplus;','&otimes;','&perp;','&sdot;','&lceil;','&rceil;','&lfloor;','&rfloor;','&lang;','&rang;','&loz;','&spades;','&clubs;','&hearts;','&diams;'),arr2:new Array('&#160;','&#161;','&#162;','&#163;','&#164;','&#165;','&#166;','&#167;','&#168;','&#169;','&#170;','&#171;','&#172;','&#173;','&#174;','&#175;','&#176;','&#177;','&#178;','&#179;','&#180;','&#181;','&#182;','&#183;','&#184;','&#185;','&#186;','&#187;','&#188;','&#189;','&#190;','&#191;','&#192;','&#193;','&#194;','&#195;','&#196;','&#197;','&#198;','&#199;','&#200;','&#201;','&#202;','&#203;','&#204;','&#205;','&#206;','&#207;','&#208;','&#209;','&#210;','&#211;','&#212;','&#213;','&#214;','&#215;','&#216;','&#217;','&#218;','&#219;','&#220;','&#221;','&#222;','&#223;','&#224;','&#225;','&#226;','&#227;','&#228;','&#229;','&#230;','&#231;','&#232;','&#233;','&#234;','&#235;','&#236;','&#237;','&#238;','&#239;','&#240;','&#241;','&#242;','&#243;','&#244;','&#245;','&#246;','&#247;','&#248;','&#249;','&#250;','&#251;','&#252;','&#253;','&#254;','&#255;','&#34;','&#38;','&#60;','&#62;','&#338;','&#339;','&#352;','&#353;','&#376;','&#710;','&#732;','&#8194;','&#8195;','&#8201;','&#8204;','&#8205;','&#8206;','&#8207;','&#8211;','&#8212;','&#8216;','&#8217;','&#8218;','&#8220;','&#8221;','&#8222;','&#8224;','&#8225;','&#8240;','&#8249;','&#8250;','&#8364;','&#402;','&#913;','&#914;','&#915;','&#916;','&#917;','&#918;','&#919;','&#920;','&#921;','&#922;','&#923;','&#924;','&#925;','&#926;','&#927;','&#928;','&#929;','&#931;','&#932;','&#933;','&#934;','&#935;','&#936;','&#937;','&#945;','&#946;','&#947;','&#948;','&#949;','&#950;','&#951;','&#952;','&#953;','&#954;','&#955;','&#956;','&#957;','&#958;','&#959;','&#960;','&#961;','&#962;','&#963;','&#964;','&#965;','&#966;','&#967;','&#968;','&#969;','&#977;','&#978;','&#982;','&#8226;','&#8230;','&#8242;','&#8243;','&#8254;','&#8260;','&#8472;','&#8465;','&#8476;','&#8482;','&#8501;','&#8592;','&#8593;','&#8594;','&#8595;','&#8596;','&#8629;','&#8656;','&#8657;','&#8658;','&#8659;','&#8660;','&#8704;','&#8706;','&#8707;','&#8709;','&#8711;','&#8712;','&#8713;','&#8715;','&#8719;','&#8721;','&#8722;','&#8727;','&#8730;','&#8733;','&#8734;','&#8736;','&#8743;','&#8744;','&#8745;','&#8746;','&#8747;','&#8756;','&#8764;','&#8773;','&#8776;','&#8800;','&#8801;','&#8804;','&#8805;','&#8834;','&#8835;','&#8836;','&#8838;','&#8839;','&#8853;','&#8855;','&#8869;','&#8901;','&#8968;','&#8969;','&#8970;','&#8971;','&#9001;','&#9002;','&#9674;','&#9824;','&#9827;','&#9829;','&#9830;'),HTML2Numerical:function(s){return this.swapArrayVals(s,this.arr1,this.arr2)},NumericalToHTML:function(s){return this.swapArrayVals(s,this.arr2,this.arr1)},numEncode:function(s){if(this.isEmpty(s))return"";var e="";for(var i=0;i<s.length;i++){var c=s.charAt(i);if(c<" "||c>"~"){c="&#"+c.charCodeAt()+";"}e+=c}return e},htmlDecode:function(s){var c,m,d=s;if(this.isEmpty(d))return"";d=this.HTML2Numerical(d);arr=d.match(/&#[0-9]{1,5};/g);if(arr!=null){for(var x=0;x<arr.length;x++){m=arr[x];c=m.substring(2,m.length-1);if(c>=-32768&&c<=65535){d=d.replace(m,String.fromCharCode(c))}else{d=d.replace(m,"")}}}return d},htmlEncode:function(s,a){if(this.isEmpty(s))return"";a=a||false;if(a){if(this.EncodeType=="numerical"){s=s.replace(/&/g,"&#38;")}else{s=s.replace(/&/g,"&amp;")}}s=this.XSSEncode(s,false);if(this.EncodeType=="numerical"||!a){s=this.HTML2Numerical(s)}s=this.numEncode(s);if(!a){s=s.replace(/&#/g,"##AMPHASH##");if(this.EncodeType=="numerical"){s=s.replace(/&/g,"&#38;")}else{s=s.replace(/&/g,"&amp;")}s=s.replace(/##AMPHASH##/g,"&#")}s=s.replace(/&#\d*([^\d;]|$)/g,"$1");if(!a){s=this.correctEncoding(s)}if(this.EncodeType=="entity"){s=this.NumericalToHTML(s)}return s},XSSEncode:function(s,a){if(!this.isEmpty(s)){a=a||true;if(a){s=s.replace(/\'/g,"&#39;");s=s.replace(/\"/g,"&quot;");s=s.replace(/</g,"&lt;");s=s.replace(/>/g,"&gt;")}else{s=s.replace(/\'/g,"&#39;");s=s.replace(/\"/g,"&#34;");s=s.replace(/</g,"&#60;");s=s.replace(/>/g,"&#62;")}return s}else{return""}},hasEncoded:function(s){if(/&#[0-9]{1,5};/g.test(s)){return true}else if(/&[A-Z]{2,6};/gi.test(s)){return true}else{return false}},stripUnicode:function(s){return s.replace(/[^\x20-\x7E]/g,"")},correctEncoding:function(s){return s.replace(/(&amp;)(amp;)+/,"$1")},swapArrayVals:function(s,a,b){if(this.isEmpty(s))return"";var c;if(a&&b){if(a.length==b.length){for(var x=0,i=a.length;x<i;x++){c=new RegExp(a[x],'g');s=s.replace(c,b[x])}}}return s},inArray:function(a,b){for(var i=0,x=b.length;i<x;i++){if(b[i]===a){return i}}return-1}};

	String.prototype.htmlEntites = function()
	{
		ja.encoder.EncodeType = "entity";
		if(this!='')
			return ja.encoder.htmlEncode(this);
		return this;
	};
	
	////////////////////////////////////////////////
	$.extend($.fn,
	{
		rectangle:function() 
		{
			return new ja.drawing.rectangle( this);
		},
		visible :function(bool) 
		{
			return this.css( 'visibility',bool?'':'hidden');
		},
		friendlyDate: function(dayDiffLimit) 
		{
			return this.each(function()
			{
				var strDate = this.getAttribute('dateiso');// this.innerHTML.trim();
				if(strDate){
					var d = new Date(strDate);
					if(isDate(d))
					{
						if(this.title==undefined)
							this.title = this.innerHTML;
						this.innerHTML= d.friendlyDate(dayDiffLimit);
					}
					//else
					//	this.innerHTML=strDate;
				}
			});
		}
		
	});
	$(document).ready(function()
	{
		/*
		var elems = document.getElementsByTagName('script');
		var str='LOADED SCRIPTS:\n';
		for(var i=0;i<elems.length;i++)
		{
			if(elems[i].src)
				str += i + " = "+  elems[i].src +"\n";
		}
		console.log(str);
	*/
		var vers    = parseFloat($.browser.version);
		$('body').addClass($.browser.msie && vers<9 ? '-msie-' + vers + ' -msie-lt9' :'-right-css');
		

		$('form[name=login]').submit(function()
		{
			if($('#timezone',this).length==0)
			{
				$(this).append('<input type="hidden" id="timezone" name="timezone" value="'+ (-(new Date().getTimezoneOffset()) / 60) +'" />');
			}
		});
		
		var csrfName = ja.getMeta('csrfName'),
		csrfToken = ja.getMeta('csrfToken');
		if( csrfName && csrfToken)
		{
			$('form').each(function()
			{
				if(this.action=='' || this.action.indexOf(ja.baseUrl)==0)
				{
					var csrf = String(this.getAttribute('csrf')).toLowerCase();
					if(!(csrf =='false' || csrf =='0' || csrf =='no')){
						$(this).append('<input type="hidden" name="'+csrfName+'" value="'+ csrfToken  +'" />');
					}
				}
			});
			
			$("body").bind("ajaxSend", function(e, xhr, s){
				
				if (s.type == "POST") {
					if(s.url.indexOf(ja.baseUrl)==0)
					{
						s.data  +=  (s.data==''? '?':'&') + csrfName + '=' + csrfToken;
					}
				}
			});
		}
	});

})(jQuery);




