window.ijs = {


	// ######################### //
	
	'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);
		
		},
	
	
	
	'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.nodes.length == 1 ? elements.nodes[0] : elements;
		
		},
	
	
	
	'$$': 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;
		
		if(document.getElementsByClassName){
			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++;
					}
				}
			}
		else 
			if(document.evaluate) {
				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++;
					}
				}
			
			else {
				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;
		
		},
	
	// ######################### //
	
	'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){
		
		alert( typeof data == 'string' ? data : data.value);
		
		}
	
	};


window.ijs.object = function(){
	
	this.nodes = [];
	
	// ######################### //
	
	this.push = function(node){
		
		if(node)
			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(typeof fn == 'function' && this.nodes.length){
			var node = this.nodes[this.nodes.length - 1];
			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 = {
	
	'object_to_query_string': function(w, q){
		if(typeof w == 'string')	return w;
		else {
			var para = '';
			if(!q)	q = '';
			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], 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.controller.setRequestHeader('Content-length', request.parameters.length);
			request.controller.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			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 || 'text';
		request.controller.open(request.method, request.url, typeof request.async == 'undefined' ? true : request.async);
		
		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.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.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();