/*
 * copyright 
 * This is the property of Artificial Intelligence Technologies J.K. Oy
 */

NSNotFound = -1;

function AIUserAgent() {
	var b =navigator.appName;
	var v = navigator.appVersion;
	var ua = navigator.userAgent.toLowerCase();
	this.safari = ua.indexOf("safari") > -1;
	this.opera = ua.indexOf("opera") > -1;
	this.ns = !this.opera && !this.safari && (b == "Netscape");
	this.ie = !this.opera && (b == "Microsoft Internet Explorer");
	this.gecko = !this.safari && ua.indexOf("gecko") > -1;
	this.khtml = ua.indexOf("khtml") > -1;
  if (this.ns) {
    this.ns4 = (this.v == 4);
    this.v = parseInt(ua.substr(ua.indexOf("netscape") + 9, 1), 10);
    this.ns6 = (this.v == 6);
    this.ns7 = (this.v == 7);
  } else if(this.ie) {
    this.ie4 = (v.indexOf("MSIE 4") > 0);
    this.ie5 = (v.indexOf("MSIE 5") > 0);
    this.ie55 = (v.indexOf("MSIE 5.5") > 0);
    this.ie6 = (v.indexOf("MSIE 6") > 0);
    this.ie7 = (v.indexOf("MSIE 7") > 0);
  } else if(this.opera) {
    this.v = parseInt(ua.substr(ua.indexOf("opera") + 6, 1), 10);
    this.opera6 = (this.v == 6);
    this.opera7 = (this.v == 7);
    this.opera8 = (this.v == 8);
    this.opera9 = (this.v == 9);
  }
  this.win = ua.indexOf("win") > -1;
  this.mac = ua.indexOf("mac") > -1;
}
is = new AIUserAgent();

function AIGetXMLHttpRequest() {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if (is.ie) {
		if (ScriptEngineMajorVersion() >= 5) {
			return new ActiveXObject("Msxml2.XMLHTTP");
		} else {
			return new ActiveXObject("Microsoft.XMLHTTP");
		}
	} else {
		return null;
	}
}

function AIWindowInnerWidth() {
	return parseInt(window.innerWidth || document.documentElement.offsetWidth);
}
function AIWindowInnerHeight() {
	return parseInt(window.innerHeight || document.documentElement.offsetHeight);
}

function AIGetElementById(_id) {
	return document.getElementById(_id);
}
function AICreateDivElement() {
	return document.createElement("div");
}
function AICreateElement(_tagName) {
	return document.createElement(_tagName);
}
function AICreateText(_tagName) {
	return document.createTextNode(_tagName);
}
function AISetAttribute(_elm,_name,_value) {
	_elm.setAttribute(_name,_value);
}
function AIGetStyle(_elm) {
	return _elm.style;
}
function AISetScrollTop(_elm, _value) {
	_elm.scrollTop = _value;
}
function AISetScrollLeft(_elm, _value) {
	_elm.scrollLeft = _value;
}
function AIGetScrollTop(_elm) {
	return _elm.scrollTop;
}
function AIGetScrollLeft(_elm) {
	return _elm.scrollLeft;
}
function AIGetScrollHeight(_elm) {
	return _elm.scrollHeight;
}
function AIGetScrollWidth(_elm) {
	return _elm.scrollWidth;
}
function AIGetOffsetWidth(_elm) {
	return _elm.offsetWidth;
}
function AIGetOffsetHeight(_elm) {
	return _elm.offsetHeight;
}
function AIGetComputedStyle(_elm) {
	if (is.ie) {
		return _elm.currentStyle;
	} else {
		return document.defaultView.getComputedStyle(_elm, "");
	}
}

function AICamelize(_string) {
	var _stringArray =  _string.split("-");
	var l = _stringArray.length;
	if (l == 1) {
		return _stringArray[0];
	}
	var _camelizedString = _string.indexOf("-") == 0
		? _stringArray[0].charAt(0).toUpperCase() + _stringArray[0].substring(1)
		: _stringArray[0];
	var i;
	for (i = 1; i < l; i++) {
		var s = _stringArray[i];
		_camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
	}
	return _camelizedString;
}

function AISetStyleProperty(_style,_propertyName,_value) {
	if (is.ie) {
		_propertyName = AICamelize(_propertyName);
		_style[_propertyName] = _value;
	} else {
		_style.setProperty(_propertyName,_value,"");
	}
}
function AISetHTMLProperty(_elm,_propertyName,_value) {
	_elm[_propertyName] = _value;
}
function AIGetHTMLProperty(_elm,_propertyName) {
	return _elm[_propertyName];
}
function AIGetStylePropertyValue(_style,_propertyName) {
	if (is.ie) {
		_propertyName = AICamelize(_propertyName);
		return _style[_propertyName];
	} else {
		return _style.getPropertyValue(_propertyName);
	}
}
function AIAppendChild(_parentElm,_childElm) {
	_parentElm.appendChild(_childElm);
}
function AIRemoveChild(_parentElm,_childElm) {
	_parentElm.removeChild(_childElm);
}

function AIAddEventListener(_elm,_event,_function) {
	if (is.ie) {
		_elm.attachEvent("on"+_event,_function);
	} else {
		_elm.addEventListener(_event,_function,false);
	}
}
function AIRemoveEventListener(_elm,_event,_function) {
	if (is.ie) {
		_elm.detachEvent("on"+_event,_function);
	} else {
		_elm.removeEventListener(_event,_function,false);
	}
}
function AIStopPropagation(_event) {
	if (_event.stopPropagation) {
		_event.stopPropagation();
	} else {
		_event.cancelBubble = true;
	}
}
function AIPreventDefault(_event) {
	if (_event.preventDefault) {
		_event.preventDefault();
	} else {
		_event.returnValue = false;
	}
}
function AIGetEventX(_event) {
	return _event.pageX || _event.clientX + document.documentElement.scrollLeft;
}
function AIGetEventY(_event) {
	return _event.pageY || _event.clientY + document.documentElement.scrollTop;
}
function AIGetEventButton(_event) {
	if (is.safari) {
		return _event.button - 1;
	} else {
		return _event.button
	}
}
function HGetPageLocation(_element) {
	var _pageX = 0, _pageY = 0;
	var _offsetParent;
	var _orig = _element;
	if (is.opera) {
		if (is.opera9) {
			do {
				_offsetParent = _element.offsetParent;
				_pageX += _element.offsetLeft;
				_pageY += _element.offsetTop;
				_element = _offsetParent;
			} while(_element);
		} else {
			if (_element.tagName.toLowerCase() == "body") {
				return [0, 0];
			}
			var _previous;
			do {
				_offsetParent = _element.offsetParent;
				if(_element.tagName.toLowerCase() == "body" &&
					 _previous &&
					 (_previous.style.position == "absolute" ||
						_previous.style.position == "relative" ||
						_previous.style.position == "fixed")) {
				} else {
					_pageX += _element.offsetLeft;
					_pageY += _element.offsetTop;
				}
				if (_offsetParent &&
						_offsetParent.tagName.toLowerCase() == "body" &&
						(_element.style.position == "absolute" ||
						 _element.style.position == "relative" ||
						 _element.style.position == "fixed" ||
						 _element.tagName.toLowerCase() == "input" ||
						 _element.tagName.toLowerCase() == "button" ||
						 _element.tagName.toLowerCase() == "select" ||
						 _element.tagName.toLowerCase() == "textarea")) {
				} else if (_offsetParent) {
					_pageX += _offsetParent.clientLeft;
					_pageY += _offsetParent.clientTop;
				}
				_previous = _element;
				_element = _offsetParent;
			} while(_element);
		}
	} else if (is.safari) {
		
		if (_element.tagName.toLowerCase() == "body") {
			return [0, 0];
		}
		var _previous;
		do {
			_offsetParent = _element.offsetParent;
			// We should have previous variable, because that way we can count also body location
			if(_element.tagName.toLowerCase() == "body" ||
				 (_element.tagName.toLowerCase() == "body" &&
				 _previous &&
				 (_previous.style.position == "absolute" ||
					_previous.style.position == "fixed"))) {
			} else {
				_pageX += _element.offsetLeft;
				_pageY += _element.offsetTop;
			}
			_previous = _element;
			_element = _offsetParent;
		} while(_element);
	} else if (is.ns) {
		// Firefox doesn't count offsets right if container element has scrolls
		do {
			_offsetParent = _element.offsetParent;
			if(_element.tagName.toLowerCase() == "body") {
			} else {
				_pageX += _element.offsetLeft;
				_pageY += _element.offsetTop;
			}
			if (_offsetParent &&
					_offsetParent.tagName.toLowerCase() == "body" &&
					(_element.style.position == "absolute" ||
					 _element.style.position == "fixed")) {
			} else if (_offsetParent) {
				_pageX += (_offsetParent.offsetWidth - _offsetParent.clientWidth) / 2;
				_pageY += (_offsetParent.offsetHeight - _offsetParent.clientHeight) / 2;
			}
			_element = _offsetParent;
		} while(_element);
	} else if (is.ie) {
		if (_element.tagName.toLowerCase() == "body") {
			return [0, 0];
		}
		do {
			_offsetParent = _element.offsetParent;
			_pageX += _element.offsetLeft;
			_pageY += _element.offsetTop;
			if (_offsetParent &&
					_offsetParent.tagName.toLowerCase() == "html" &&
					_element.style.position == "relative") {
				_pageX -= 2;
				_pageY -= 2;
			}
			if(_offsetParent &&
				 _offsetParent.tagName.toLowerCase() == "html" &&
				 _element.style.position == "absolute") {
			} else if (_offsetParent) {
				_pageX += _offsetParent.clientLeft;
				_pageY += _offsetParent.clientTop;
			}
			_element = _offsetParent;
		} while(_element);
		
	}
	
	//if (_scroll) {
		_element = _orig;
		do {
			if (!_element.tagName || _element.tagName.toLowerCase() == "body") {
				break;
			}
			if(_element.style.position == "fixed") {
				_pageX += window.pageXOffset || document.documentElement.scrollLeft;
				_pageY += window.pageYOffset || document.documentElement.scrollTop;
			}
			_offsetParent = _element.parentNode;
			if (_element != _orig) {
				if (is.opera && _element.tagName.toLowerCase() == "tr") {
					
				} else {
					_pageX -= _element.scrollLeft;
					_pageY -= _element.scrollTop;
				}
			}
			_element = _offsetParent;
		} while(_element);
	//}
	
	return {x:_pageX,y:_pageY};
}

