if(!window.ijs){
	window.ijs = {

		'options': {},
		
		// ######################### //
		
		'init': function(){
			
			this.browser_detect = 'unknown';
			
			if(navigator.userAgent.indexOf('MSIE') != -1){
				this.is_ie = true;
				if(navigator.userAgent.indexOf('MSIE 7.') != -1 )
					this.browser_detect = 'ie7';
				else if(navigator.userAgent.indexOf('MSIE 8.') != -1)
					this.browser_detect = 'ie8';
				else
					this.browser_detect = 'ie6';
				}
			else
				if(navigator.userAgent.indexOf('Firefox') != -1)
					this.browser_detect = 'firefox';
				else
					if(navigator.userAgent.indexOf('Chrome')!=-1)
						this.browser_detect = 'chrome';
					else
						if(window.opera)
							this.browser_detect = 'opera';
						else
							if( navigator.vendor && navigator.vendor.indexOf('Apple') != -1 )
								this.browser_detect = 'safari';
						
			
			// Create DOM ready event listener
			this._on_load_functions = [];
			if(document.addEventListener)
				if(this.browser_detect == 'safari')		
					this.check_document_ready();
				else
					document.addEventListener('DOMContentLoaded', this.on_dom_loaded, false);
			else 
				if(document.all && !window.opera){
					document.write("<scr" + "ipt id='DOMReady' defer=true " + "src=//:></scr" + "ipt>");
					document.getElementById("DOMReady").onreadystatechange = function(){
						if(this.readyState == 'complete')
							ijs.on_dom_loaded(window.event);
						}
					}
				else
					ijs.add_event(window, 'load', this.on_dom_loaded, false);
			
			if(document.getElementsByClassName)
				this.$$ = function(className, node, tag, limit){
					node = node || document;tag = tag ? tag.toLowerCase() : '*';var returnElements = new this.object;var i = 0;var j = 0;var c = 0;var els;var e;
					
					els = node.getElementsByClassName(className);
					for(i = 0, c = els.length; i < c && (!limit || j < limit) ; i++ ){
						e = els[i];
						if(tag != '*') {
							if(e.nodeName.toLowerCase() == tag ){
								returnElements.push(e);
								j++;
								}
							}
						else {
							returnElements.push(e);
							j++;
							}
						}
						
					return returnElements;
					
					}
			else 
				if(document.evaluate) {
					this.$$ = function(className, node, tag, limit){
						node = node || document;tag = tag ? tag.toLowerCase() : '*';var returnElements = new this.object;var i = 0;var j = 0;var c = 0;var els;var e;
						className 				= "[contains(concat(' ', @class, ' '), ' " + className + " ')]";
						var classesToCheck 		= '';
						var xhtmlNamespace		= 'http://www.w3.org/1999/xhtml';
						var namespaceResolver	= (document.documentElement.namespaceURI === xhtmlNamespace) ? xhtmlNamespace : null;
						
						try	{
							els = document.evaluate('.//' + tag + className, node, namespaceResolver, 0, null);
						}
						catch (e) {
							els = document.evaluate('.//' + tag + className, node, null, 0, null);
						}
						
						while ((e = els.iterateNext() && (!limit || j < limit) )  ) {
							returnElements.push(e);
							j++;
							}
						return returnElements;
						}
					}
				else {
					this.$$ = function(className, node, tag, limit){
						node = node || document;tag = tag ? tag.toLowerCase() : '*';var returnElements = new this.object;var i = 0;var j = 0;var c = 0;var els;var e;
						els = node.getElementsByTagName(tag);
						var pattern = new RegExp('(^|\\s)'+className+'(\\s|$)');
						for( i = 0, c = els.length ; i < c && (!limit || j < limit) ; i++){
							e = els[i];
							if (pattern.test(e.className)){
								returnElements.push(e);
								j++;
								}
							}
						return returnElements;
						}
					}
			
			},
		
		
		
		'check_document_ready': function(){
			if(document.readyState == 'loaded' || document.readyState == 'complete')
				ijs.on_dom_loaded();
			else
				setTimeout(this.check_document_ready, 10);
			},
		
		
		
		'onload': function(fn){
			if(this._dom_is_ready)	return fn.call(window);
			else					this._on_load_functions.push(fn);
			return this._on_load_functions;
			},
		
		
		
		'on_dom_loaded': function(ev){
			ijs._dom_is_ready = true;
			ev = ev || window.event;
			for(var i = 0, c = ijs._on_load_functions.length; i < c ; ++i)
				ijs._on_load_functions[i].call(ijs, ev);
			},
		
		
		// ######################### //
		
		
		'add_event': function(elm, evType, fn, useCapture){
			
			if(elm.add_eventListener)
				elm.add_eventListener(evType, fn, useCapture);
			else 
				if(elm.attachEvent)
					elm.attachEvent('on' + evType,fn);
				else
					elm['on' + evType] = fn;
			
			return true;
			
			},
		
		
		
		'remove_event': function(elm, evType, fn, useCapture){
			
			if(elm.remove_eventListener)
				elm.remove_eventListener(evType, fn, useCapture);
			else 
				if(elm.detachEvent)
					elm.detachEvent('on' + evType, fn);
				else
					delete elm['on' + evType];
			
			return true;
			
			},
		
		
		// ######################### //
		
		
		'$': function(){
			
			for(var i = 0, c = arguments.length, element, elements = new this.object; i < c ; ++i)
				elements.push(document.getElementById(arguments[i]));
			return elements;
			
			},
		
		
		// ######################### //
		
		
		'load_js': function(url, fn){
			var script = document.createElement('script');
			script.src = url;
			script.type = 'text/javascript';
			if(typeof fn == 'function')
				if(typeof script.onreadystatechange != 'undefined' && ijs.is_ie) {
					script.onreadystatechange = function(){
							if (this.readyState == "complete" || this.readyState == "loaded") 
								fn.call(this);
						};
					}
				else{
					
					script.onload = function(){
						fn.call(this);
						}
					
					}
			document.getElementsByTagName('head').item(0).appendChild(script);
			},
		
		
		
		// ######################### //
		
		'text': function(item){
			
			return item;
			
			},
		
		
		'config': function(id, default_value){
			
			if(typeof ijs.options[id] != 'undefined' && ijs.options[id] != null)
				return ijs.options[id];
			else {
				if(typeof default_value != 'undefined' && default_value != null)
				return default_value;
				}
			
			return null;
			
			},
		
		'status': function(data){
			
			if(this.config('debug'))
				alert( typeof data == 'string' ? data : data.value);
			else
				alert( this.text('oups... found a error') );
			},
			
		'delay_callback': function(data){
			
			if(data.callback.call(data.context))
				setTimeout(function(){ ijs.delay_callback(data); }, data.delay);
			else
				if(typeof data.end_callback == 'function')
					data.end_callback.call(data.context);
				
			
			}
		
		};


	window.ijs.object = function(){
		
		this.nodes = [];
		this.length = 0;
		
		// ######################### //
		
		this.push = function(node){
			
			if(node){
				++this.length;
				return this.nodes.push(node);
				}
			return false;
			
			}
		
		
		
		this.each = function(fn){
			
			for(var i = 0, c = this.nodes.length; i < c; ++i)
				fn.call(this.nodes[i]);
			return this.nodes;
			
			}
		
		
		
		this.first = function(fn){
			
			if(this.nodes.length){
				if(typeof fn == 'function')
					fn.call(this.nodes[0]);
				return this.nodes[0];
				}
				
			return false;	
			
			}
		
		
		
		this.last = function(fn){
			
			if(this.nodes.length){
				var node = this.nodes[this.nodes.length - 1];
				if(typeof fn == 'function')
					fn.call(node);
				return node;
				}
			return false;
			
			}
		
		
		
		this.toString = function(){
			
			return this.nodes.length ? this : false;
			
			}
		
		
		
		this.valueOf = function(){
			
			if(this.nodes.length == 0)
				return false;
			else
				if(this.nodes.length == 1)
					return this.nodes[0];
				else
					return this;
				
			}
		
		// ######################### //
		
		}


		
	window.ijs.ajax = {
		
		'form_to_parameters': function(form){
			var element;
			var query = [];
			for(var i = 0, c = form.elements.length; i < c; ++i){
				element = form.elements[i];
				if(element.name)
					if(element.nodeName == 'INPUT')
						switch(element.type.toLowerCase()){
							case 'text':case 'hidden':case 'password':
								query.push(element.name + '=' + encodeURIComponent(element.value));
								break;
							default:
								alert(element + ' not implemented');
								break;
							}
					else
						{
						alert(element + ' not implemented');
						}
				}
			
			return query.join('&');
			
			},
		
		'object_to_query_string': function(w, e, q){
			if(typeof w == 'string')	return w;
			else {
				var para = '';
				if(!q)	q = '';
				
				if(e){
					for(var i in w)
						if( typeof w[i] == 'string' || typeof w[i] == 'number' )
							para += ( q ? ( q + '[' + i + ']' ) : i ) + '=' + encodeURIComponent(w[i]) + '&';
						else
							if( typeof w[i] != 'function' )
								para += this.object_to_query_string( w[i], e , q ? ( q + '[' + i + ']' ) : i );
					}
				else
					for(var i in w)
						if( typeof w[i] == 'string' || typeof w[i] == 'number' )
							para += ( q ? ( q + '[' + i + ']' ) : i ) + '=' + w[i] + '&';
						else
							if( typeof w[i] != 'function' )
								para += this.object_to_query_string( w[i], q ? ( q + '[' + i + ']' ) : i );
				return para;
				}
			},
		
		'state_change': function(){
			
			if(this.controller.readyState == 4 && !this.cancel)
				if(this.controller.status != 200){
					ijs.status({
						'value': ijs.text('http_request_error_code') + ': ' + this.controller.status, 
						'type': 'error'
						});
					if(typeof this.onerror == 'function')
						this.onerror.call(this);
					}
				else
					return ijs.ajax.parse_response.call(this);
					
			return false;
			
			},
		
		'parse_response': function(){
			
			if(this.response_type == 'json'){
				var response;
				if(this.controller.responseText)
					try{
						response = eval('(' + this.controller.responseText + ')');
						}
					catch(e){
						ijs.status({
							'value': 
								ijs.text('message') + ': ' + e.message + '<br/>' +
								ijs.text('line') + ': ' + e.lineNumber + '<br/>' + 
								ijs.text('file') + ': ' + e.fileName,
							'title': ijs.text('response_error'),
							'type': 'error'
							});			
						}
				this.response = response;
				}
			else{
				this.response = this.controller.responseText;
				}
			
			if(ijs.onrequestcompleate)
				for(var i = 0, c = ijs.onrequestcompleate.length; i < c; ++i)
					ijs.onrequestcompleate[i].call(this);
			
			if(this.cancel)	
				return false;
			
			return true;
			
			},
		
		'request': function(request){
			
			if(typeof request.controller == 'undefined')
				if(window.XMLHttpRequest) 
					request.controller = new XMLHttpRequest();
				else
					if(window.ActiveXObject){
						try {request.controller = new ActiveXObject('Msxml2.XMLHTTP');}
						catch (e){
							try {request.controller = new ActiveXObject('Microsoft.XMLHTTP');}
							catch (e) {}
							}
						}
			if(!request.controller)
				return false;
			
			if(typeof request.parameters != 'undefined'){
				request.parameters = typeof request.parameters == 'string' ? request.parameters : this.object_to_query_string(request.parameters);
				request.method = 'post';
				}
			else
				request.method = 'get';
			
			if(request.query)
				request.url += '?' + this.object_to_query_string(request.query);
			request.response_type = request.response_type || 'json';
			request.controller.open(request.method, request.url, typeof request.async == 'undefined' ? true : request.async);
			if(typeof request.parameters != 'undefined'){
				request.controller.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
				request.controller.setRequestHeader('Content-length', request.parameters.length);
				}
			
			if(request.callback)
				request.controller.onreadystatechange = function(){
						if(ijs.ajax.state_change.call(request)){
							request.callback.call(request);
							}
						}
			
			if(ijs.onrequest)
				for(var i = 0, c = ijs.onrequest.length; i < c; ++i)
					ijs.onrequest[i].call(request);
			
			
			request.controller.send(request.parameters);
			
			if(typeof request.async != 'undefined' && request.async == false){
				this.parse_response.call(request);
				request.callback.call(request.response_wrapper ? request : request.response );
				}
			return request;		
			
			}
		
		}


		
	ijs.cookie = {
		
		// ######################### //
		
		'get': function(cookiename){
			var cookiestring = String(document.cookie);
			
			var index1 = cookiestring.indexOf(cookiename);
			
			if (index1==-1 || cookiename=='') return '';
			
			var index2 = cookiestring.indexOf(';',index1);
			
			if (index2==-1) index2 = cookiestring.length;
			
			return unescape(cookiestring.substring(index1 + cookiename.length + 1, index2));
			},
		
		
		
		'unset': function(cookiename){
			document.cookie = cookiename + '=' + ';EXPIRES=' + ijs.cookie.get_expire_date(-1);
			},
		
		
		
		'get_expire_date':function(nodays){
			var UTCstring;
			var Today = new Date();
			var nomilli=Date.parse(Today);
			Today.setTime(nomilli + nodays * 24 * 60 * 60 * 1000);
			UTCstring = Today.toUTCString();
			return UTCstring;
			},
		
		
		
		'set': function(name, value, duration){
			duration = duration || 30;
			document.cookie = name + '=' + escape(value) + ';EXPIRES=' + ijs.cookie.get_expire_date(duration);

			}
		
		// ######################### //
		
		}


		
	ijs.css = {
		
		// ######################### //
		
		'add_rule': function(selector, rule, index, style_sheets){
			
			index = index || -1;
			style_sheets = style_sheets || document.styleSheets[document.styleSheets.length-1];
			if(style_sheets)
				if(style_sheets.insertRule)
					style_sheets.insertRule(selector + '{' + rule + '}', index == -1 ? style_sheets.cssRules.length : index);
				else if(style_sheets.addRule)
						style_sheets.addRule(selector, rule, index);
				
			},
		
		
		
		'add_class': function(item, className){
			if(item)
				if(!item.className || item.className == '')
					item.className = className;
				else{
					var classNames = item.className.split(' ');
					var c = classNames.length;
					for(var i = 0; i < c; i++)
						if(classNames[i] == className)
							return true;
					classNames.push(className);
					item.className = classNames.join(' ');
					}
			
			return item;
			
			},
		
		
		
		'add_shadow': function(item){
			if(item)
				if(!ijs.is_safari)
					if(typeof item != 'string'){
						item.className += ' shadow_text_h'
						item.innerHTML = '<div class="shadow_text">' + item.innerHTML + '</div><div class="normal_text">' + item.innerHTML + '</div>';
						}
					else
						return '<div class="shadow_text_h"><div class="shadow_text">' +item + '</div><div class="normal_text">' + item + '</div></div>';
			
			return item;
			
			},
		
		
		
		'fix_ie_limit': function(obj, tag){
			if(ijs.is_IE6){
				obj = obj || document;
				tag = tag || 'img';
				ijs.$$('limit',obj,tag,function(item){
					var t;
					if( (t = ijs.css.get(item,'max-height')) ){
						t = parseInt(t);
						if(item.offsetHeight > t){
							if(item.nodeName == 'IMG')
								item.style.width = parseInt(item.offsetWidth-(((item.offsetHeight-t)/item.offsetHeight)*item.offsetWidth))+'px';
							item.style.height = t + 'px';
							}
						}
					if( (t = ijs.css.get(item,'max-width')) ){
						t = parseInt(t);
						if(item.offsetWidth>t){
							if(item.nodeName == 'IMG')
								item.style.height = parseInt(item.offsetHeight-(((item.offsetWidth-t)/item.offsetWidth)*item.offsetHeight))+'px';
							item.style.width = t + 'px';
							}
						}
					if( (t = ijs.css.get(item,'min-height')) ){
						t = parseInt(t);
						if(item.offsetHeight<t){
							if(item.nodeName == 'IMG')
								item.style.width = parseInt(item.offsetWidth+(((t-item.offsetHeight)/item.offsetHeight)*item.offsetWidth))+'px';
							item.style.height = t + 'px';
							}
						}
					if( (t = ijs.css.get(item,'max-width')) ){
						t = parseInt(t);
						if(item.offsetWidth < t){
							if(item.nodeName == 'IMG')
								item.style.height = parseInt(item.offsetHeight+(((t-item.offsetWidth)/item.offsetWidth)*item.offsetHeight))+'px';
							item.style.width = t + 'px';
							}
						}
					
					});
				}
			
			return obj;
			
			},
		
		
		
		'get': function(x, styleProp){
			if(x && styleProp){
				if(x.currentStyle){
					styleProp = styleProp.split('-');
					var c = styleProp.length;
					for(var i=0; i<c; i++)
						if(i!=0)
							styleProp[i] = styleProp[i].charAt(0).toUpperCase() + styleProp[i].substr(1);
					
					return x.currentStyle[styleProp.join('')];
					}
				else
					if(window.getComputedStyle){
						
						
						
						return document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
						
						}
				
				}
			
			return false;
			
			},
		
		
		
		'has_class': function(item, searchClass){
			
			var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
			
			return pattern.test(item.className)
			
			},
		
		
		
		'load': function(url, fn){
			
			switch(typeof url){
				case 'string':
					var link = document.createElement('link')
					link.setAttribute('rel','stylesheet');
					link.setAttribute('type', 'text/css');
					link.setAttribute('href', url);
					document.getElementsByTagName('head').item(0).appendChild(link);
					if(fn)
						fn(url);
					break;
				case 'object':
					if(url.length)
						for(var i=0; i<url.length; i++)
							ijs.css.load(url[i]);
					else
						for(var i in url)
							ijs.css.load(url[i]);
					break;
				default:
					ijs.status( ijs.text('unable_to_load_css') ,'error');
					break;
				}
			
			return true;
			
			},
		
		
		
		'png_bg': function(item, url, repeat){
			if(item)
				if(ijs.is_IE6)
					if(url)
						item.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + url + '\',sizingMethod=' + ( repeat ? 'scale' : 'crop') + ');';
					else
						item.style.filter = '';
				else
					if(url)
						item.style.background = 'url(' + url + ')' + ( repeat ? '' : ' no-repeat');
					else
						item.style.background = '';
			},
		
		
		'remove_class': function(item, className){
			if(item && item.className)
				if(item.className==className)
					item.className='';
				else{
					var classNames = item.className.split(' ');
					var c = classNames.length;
					for(var i=0;i<c;i++)
						if(classNames[i]==className){
							delete classNames[i];
							break;
							}
					item.className = classNames.join(' ');
					}
			
			return item;
			
			},
		
		
		
		'set_opacity': function(item, value){
			
			item.style.opacity = value / 100;
			item.style.filter = 'alpha(opacity='+ value +')';
			
			return item;
			
			}
		
		// ######################### //
		
		};

		

	ijs.position = {
		
		// ######################### //
		
		'mouse_coords': function(ev){
			if(ev.pageX || ev.pageY)
				return {
					x: ev.pageX,
					y: ev.pageY
					};
			else
				return {
					x: ev.clientX + document.body.scrollLeft - document.body.clientLeft,
					y: ev.clientY + document.body.scrollTop - document.body.clientTop
					};
			},
		
		
		
		'get_mouse_offset': function(target, ev){
			ev = ev || window.event;
			var docPos = this.get_position(target);
			var mousePos = this.mouse_coords(ev);
			
			return {
				x: mousePos.x - docPos.x,
				y: mousePos.y - docPos.y
				};
			},
		
		
		
		'get_position': function(e, parent){
			var left = 0;
			var top = 0;
			while (e.offsetParent){
				if(e == parent)
					return {
						x: left,
						y: top
						};
				left += e.offsetLeft + parseInt(ijs.css.get(e, 'padding-left'));
				top += e.offsetTop + parseInt(ijs.css.get(e, 'padding-top'));
				e = e.offsetParent;
				}

			left += e.offsetLeft;
			top += e.offsetTop;
			
			return {
				x: left,
				y: top
				};
			}
		
		// ######################### //
		
		
		}

		
	window.ijs.init();	
	}