/******************************************************************************
* extensions for native objects
******************************************************************************/


/**
* get inner size of window
* return object { int width, int height }
*/
window.getSize = function () {
	//return { width: 1000, height: 700 };
	if (self.innerHeight) return { width: self.innerWidth, height: self.innerHeight };
	else return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight };
}
/**
* get inner width of window
* return int
*/
window.getWidth = function () {
	//return 1000;
	if (self.innerWidth) return self.innerWidth;
	else return document.documentElement.clientWidth;
}
/**
* get inner height of window
* return int
*/
window.getHeight = function () {
	//return 700;
	if (self.innerHeight) return self.innerHeight;
	else return document.documentElement.clientHeight;
}


/**
* get simple info about browser
* new object properties:
* navigator.browser: name of browser
* navigator.version: version of browser
* navigator.os: operating system of client
*/
navigator.init = function () {
	this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
	this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version";
	this.OS = this.searchString(this.dataOS) || "an unknown OS";
};
navigator.searchString = function (data) {
	for (var i=0;i<data.length;i++)	{
		var dataString = data[i].string;
		var dataProp = data[i].prop;
		this.versionSearchString = data[i].versionSearch || data[i].identity;
		if (dataString) {
			if (dataString.indexOf(data[i].subString) != -1) return data[i].identity;
		} else if (dataProp) return data[i].identity;
	}
};
navigator.searchVersion = function (dataString) {
	var index = dataString.indexOf(this.versionSearchString);
	if (index == -1) return;
	return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
};
navigator.dataBrowser = [
	{ 	string: navigator.userAgent,
		subString: "OmniWeb",
		versionSearch: "OmniWeb/",
		identity: "OmniWeb"
	},
	{
		string: navigator.vendor,
		subString: "Apple",
		identity: "Safari"
	},
	{
		prop: window.opera,
		identity: "Opera"
	},
	{
		string: navigator.vendor,
		subString: "iCab",
		identity: "iCab"
	},
	{
		string: navigator.vendor,
		subString: "KDE",
		identity: "Konqueror"
	},
	{
		string: navigator.userAgent,
		subString: "Firefox",
		identity: "Firefox"
	},
	{
		string: navigator.vendor,
		subString: "Camino",
		identity: "Camino"
	},
	{		// for newer Netscapes (6+)
		string: navigator.userAgent,
		subString: "Netscape",
		identity: "Netscape"
	},
	{
		string: navigator.userAgent,
		subString: "MSIE",
		identity: "Explorer",
		versionSearch: "MSIE"
	},
	{
		string: navigator.userAgent,
		subString: "Gecko",
		identity: "Mozilla",
		versionSearch: "rv"
	},
	{ 		// for older Netscapes (4-)
		string: navigator.userAgent,
		subString: "Mozilla",
		identity: "Netscape",
		versionSearch: "Mozilla"
	}
];
navigator.dataOS = [
	{
		string: navigator.platform,
		subString: "Win",
		identity: "Windows"
	},
	{
		string: navigator.platform,
		subString: "Mac",
		identity: "Mac"
	},
	{
		string: navigator.platform,
		subString: "Linux",
		identity: "Linux"
	}
];
navigator.isIE = function () {
	if (this.browser.match (/Explorer/)) return true;
	else return false;
}
navigator.isMoz = function () {
	if (this.browser.match (/(Firefox|Mozilla|Netscape|Gecko)/)) return true;
	else return false;
}
navigator.init();


/**
* converts css-property with px into int
* return int
*/
String.prototype.px2int = function () {
	var int = parseInt (this.replace (/px/, ""));
	if (!isNaN (int)) return int;
	else return 0;
}


Math.uniqId = function () { return Math.round (Math.random () * 100000000); }


Object.prototype.typeOf = function () {
	var s = typeof this;
	if (s === 'object') {
		if (this) {
			if (typeof this.length === 'number' &&
					!(this.propertyIsEnumerable('length')) &&
					typeof this.splice === 'function') {
				s = 'array';
			}
		} else {
			s = 'null';
		}
	}
	return s;
}

/*
Object.prototype.clone = function () {
	alert ("blaaa");
	var clone = {};
	for (prop in this) {
		if (typeof this[prop] == "object" && this[prop].typeOf () != "array") {
			clone[prop] = this[prop].clone ();
		} else if (typeof this[prop] == "object" && this[prop].typeOf () == "array") {
			clone[prop] = [];
			for (var i = 0; i < this[prop].length; i = i + 1) {
				if (typeof this[prop][i] == "object") {
					alert (prop + "[" + i + "] - " + this[prop][i].id);
					clone[prop].push (this[prop][i].clone ());
				} else {
					clone[prop].push (this[prop][i]);
				}
			}
		} else if (typeof this[prop] != "function") {
			//alert (prop + " typeof " + typeof (this[prop]));
			clone[prop] = this[prop];
		}
	}
	return clone;
}
*/


/******************************************************************************
* extensions for prototype objects
******************************************************************************/


Element.addMethods ({
	setid: function (element, id) {
		element.id = id;
		return element;
	},


	/**************************************************************************
	* extensions for native methods
	*/
	firstDescendant: function (element) { return element.immediateDescendants ().first (); },
	lastDescendant: function (element) { return element.immediateDescendants ().last (); },


	/**************************************************************************/
	getLMargin: function (element) { return String (element.getStyle ("marginLeft")).px2int (); },
	getRMargin: function (element) { return String (element.getStyle ("marginRight")).px2int (); },
	getTMargin: function (element) { return String (element.getStyle ("marginTop")).px2int (); },
	getBMargin: function (element) { return String (element.getStyle ("marginBottom")).px2int (); },
	getHMargin: function (element) { return (element.getLMargin () + element.getRMargin ()); },
	getVMargin: function (element) { return (element.getTMargin () + element.getBMargin ()); },
	/**************************************************************************/
	getLBorder: function (element) { return String (element.getStyle ("borderLeftWidth")).px2int (); },
	getRBorder: function (element) { return String (element.getStyle ("borderRightWidth")).px2int (); },
	getTBorder: function (element) { return String (element.getStyle ("borderTopWidth")).px2int (); },
	getBBorder: function (element) { return String (element.getStyle ("borderBottomWidth")).px2int (); },
	getHBorder: function (element) { return (element.getLBorder () + element.getRBorder ()); },
	getVBorder: function (element) { return (element.getTBorder () + element.getBBorder ()); },
	/**************************************************************************/
	getLPadding: function (element) { return String (element.getStyle ("paddingLeft")).px2int (); },
	getRPadding: function (element) { return String (element.getStyle ("paddingRight")).px2int (); },
	getTPadding: function (element) { return String (element.getStyle ("paddingTop")).px2int (); },
	getBPadding: function (element) { return String (element.getStyle ("paddingBottom")).px2int (); },
	getHPadding: function (element) { return (element.getLPadding () + element.getRPadding ()); },
	getVPadding: function (element) { return (element.getTPadding () + element.getBPadding ()); },
	/**************************************************************************/
	getLSpacing: function (element) { return (element.getLMargin () + element.getLBorder () + element.getLPadding ()); },
	getRSpacing: function (element) { return (element.getRMargin () + element.getRBorder () + element.getRPadding ()); },
	getTSpacing: function (element) { return (element.getTMargin () + element.getTBorder () + element.getTPadding ()); },
	getBSpacing: function (element) { return (element.getBMargin () + element.getBBorder () + element.getBPadding ()); },
	getHSpacing: function (element) { return (element.getLSpacing () + element.getRSpacing ()); },
	getVSpacing: function (element) { return (element.getTSpacing () + element.getBSpacing ()); },
	/**************************************************************************/
	getInnerWidth: function (element) { return (element.getWidth () - element.getHBorder () - element.getHPadding ()); },
	getInnerHeight: function (element) { return (element.getHeight () - element.getVBorder () - element.getVPadding ()); },
	getInnerDimensions: function (element) { return [element.getInnerWidth (), element.getInnerHeight ()]; },

	setInnerWidth: function (element, width) { if (width < 0) return element; else return element.setStyle ({ width: width + "px" }); },
	setInnerHeight: function (element, height) { if (height < 0) return element; else return element.setStyle ({ height: height + "px" }); },
	setInnerDimensions: function (element, dimensions) { element.setInnerWidth (dimensions[0]); element.setInnerHeight (dimensions[1]); return element; },
	/**************************************************************************/
	getOuterWidth: function (element) { return (element.getHSpacing () + element.getInnerWidth ()); },
	getOuterHeight: function (element) { return (element.getVSpacing () + element.getInnerHeight ()); },
	getOuterDimensions: function (element) { return ([element.getOuterWidth (), element.getOuterHeight ()]); },

	setOuterWidth: function (element, width) { if (width <= element.getHSpacing ()) return element; else return element.setStyle ({ width: (width - element.getHSpacing ()) + "px" }); },
	setOuterHeight: function (element, height) { if (height <= element.getVSpacing ()) return element; else return element.setStyle ({ height: (height - element.getVSpacing ()) + "px" }); },
	setOuterDimensions: function (element, dimensions) { element.setOuterWidth (dimensions[0]); element.setOuterHeight (dimensions[1]); return element; },


	/**************************************************************************
	* get absolute position of element based on body
	* return object { int x, int y }
	*/
	getPosition: function (element) {
		var pos = Position.positionedOffset (element);
		pos[0]-= element.getLMargin () + element.getLBorder ();
		pos[1]-= element.getTMargin () + element.getTBorder ();
		return pos;
	},

	getInnerPosition: function (element) {
		var pos = Position.positionedOffset (element);
		pos[0]-= element.getLBorder ();
		pos[1]-= element.getTBorder ();
		return pos;
	},

	getPagePosition: function (element) {
		var pos = Position.cumulativeOffset (element);
		pos[0]-= (element.getLMargin () / 2);
		pos[1]-= (element.getTMargin () / 2);
		return pos;
	},

	getRealOffset: function (element) {
		return Position.realOffset (element);
	},

	/**
	* set absolute position of element based on body
	* return object
	*/
	setPosition: function (element, pos) {
		element.style.position = "absolute";
		element.style.left = pos[0] + "px";
		element.style.top = pos[1] + "px";
		return element;

		return element.setStyle ({ position: "absolute", left: pos[0] + "px", top: pos[1] + "px" });
	},
	/**
	* set the relative position of element based on his parent-node
	* return object
	*/
	setRPosition: function (element, pos) {
		var parentPos = element.parentNode.getPosition ();
		return element.setPosition ({ x: (parentPos.x + pos.x), y: (parentPos.y + pos.y) });
	},


	setAbsolute: function (element, pos) {
		if (pos == undefined) return element.setPosition (element.getPosition ());
		else return element.setPosition (pos);
	},

	resetAbsolute: function (element) {
		return element.setStyle ({ position: "static", top: "auto", left: "auto" });
	},


	/**************************************************************************
	* scroll in element to top
	* return void
	*/
	scrollToTop: function (element) {
		element.scrollToOffset (0);
	},
	/**
	* scroll in element to offset
	* return void
	*/
	scrollToOffset: function (element, offset) {
		scroller.scrollTo (element, offset);
	},


	setOpacity: function (element, opacity) {
		//return element.setStyle ({ opacity: opacity });
		element.style.opacity = opacity;
		return element;
	}
});


