// base.js © michael schwarz look@cydot 
// vers. beta 1.4.5 | updated 2011-10-22.

var Cy =(function () {
	var modules ={
		cursor: {},
		dom: {},
		media: {},
		addModule: function (section, name, obj) {
			if (section && section.length) {
				if (!modules[section]) modules[section] ={};
				modules[section][name] =obj;
			}
			else modules[name] =obj;
		},
		addSection: function (section) {
			if (!modules[section]) modules[section] ={};
		}
	};
	return modules;
})();

Cy.addModule(null, 'object', (function () {
	var type =function (obj) {
		var type =toString.call(obj);				
		type =type.replace('[object ', '')
		return type.replace(']', '').toLowerCase();
	},
	copy =function (obj) {
		var t =type(obj);
		if (t=='object') return Object.clone(obj);
		else if (t=='array')  return obj.clone();
		else return obj;
	},
	deepCopy =function (obj) {
		var t =type(obj), c;
		if (t=='object') {
			c ={};
			Object.keys(obj).each(function (k) {
				c[k] =copy(obj[k]);
			}); return c;
		}
		else if (t=='array') {
			var oT; c =$A([]);
			for (var i =0; i <obj.length; i++) {
				c.push(copy(obj[i]));
			}; return c;
		} else return obj;
	},
	update =function (obj1, obj2) {
		Object.keys(obj2).each(function (k2) {
			obj1[k2] =obj2[k2];
		}); return obj1;
	},
	deepMerge =function (obj1, obj2) {
		var objM1 =copy(obj1);
		var objM2 =copy(obj2);
		if (!Object.keys(obj1).length) return objM2;
		else if (!Object.keys(obj2).length) return objM1;
		
		Object.keys(objM1).each(function (k1) {
			objM1[k1] =deepCopy(objM1[k1]);
		});
		Object.keys(objM2).each(function (k2) {
			if (type(objM2[k2])=='object') {
				if (!type(objM1[k2])=='object') objM1[k2] ={};
				Object.keys(objM2[k2]).each(function (k22) {
					 if (objM2[k2][k22]) objM1[k2][k22] =copy(objM2[k2][k22]);
				});
			}
			else if (type(objM2[k2])=='array') {
				if (!type(objM1[k2])=='array') objM1[k2] =$A([]);
				$A(objM2[k2]).each(function (obj, ind) {
					objM1[k2][ind] =copy(obj);
				});
			}
			else objM1[k2] =objM2[k2];
		});
		return objM1;
	};
	return {
		type: type,
		copy: copy,
		deepCopy: deepCopy,
		update: update,
		deepMerge: deepMerge
	};
})());

Object.extend(Number.prototype, {
	constrain: function(n1, n2) {
		var min =(n1 < n2) ? n1 : n2;
		var max =(n1 < n2) ? n2 : n1;
		var num =Number(this);
		if (num < min) num =min;
		else if (num > max) num =max;
		return num;
	}
});

Object.extend(String.prototype, {
	splitURL: function() {
		var str =String(this);
		var ind =str.lastIndexOf('/');
		var folder = ind>-1 ? str.substring(0, ind +1) : '';
		var doc = ind>-1 ? str.substring(ind +1) : str;
		ind =doc.lastIndexOf('.');
		var name = ind>-1 ? doc.substring(0, ind) : doc;
		var suffix = ind>-1 ? doc.substring(ind) : '';
		return {folder: folder, name: name, suffix: suffix};
	},
	toQueryArray: function(selector) {
		return this.split(selector || '&');
	},
	toQueryObj: function(selector) {
		var str =String(this);
		var p =str.split(selector || '='), val;
		if (p.length >1) {
			val ={}; val[p[0]] = p[1].toStyleValue();
		} else val = str.toStyleValue();
		return val;
	},
	toStyleValue: function() {
		var str =String(this);
		if (str.indexOf('px') >0  || str.indexOf('em') >0) return str;
		else if (isNaN(parseInt(str))) return str=='auto' ? '' : str;
		else return parseInt(str);
	}
});

Object.extend(Array.prototype, {
	transfer: function(arr) {
		for (var i =0, len =arr.length; i <len; i++) {
			this.push(arr.shift());
		}; return this;
	}
});

Element.addMethods('img', {
	swap: function (el, newSrc, width, height) {
		el =$(el).writeAttribute({src: newSrc});
		if (width) el.writeAttribute({width: width});
		if (height) el.writeAttribute({height: height});
		return el;
	},
	resizeFactor: function (el, f1, f2) {
		el =$(el);
		if (!f1) return el;
		if (!f2) f2 =f1;
		var w =el.getWidth() *f1, h =el.getHeight() *f2;
		el.writeAttribute({width: w, height: h});
		return el;
	}
});

