/**
 * Red JavaScript Library
 *
 * @author Kamiaka
 * @version 0.2
 */
(function(window, undefined){

var Red = window.Red = function(o) {
	return new Red.fn(o);
};

Red.fn = Red.prototype = {
	
};

Red.extend = Red.fn.extend = function() {
	var target  = arguments[0] || {}
	  , i       = 1
	  , length  = arguments.length
	  , deep	= false
	  , options
	  , isArray
	;
	//deep copy
	if (true === target || false === target) {
		deep = target;
		target = arguments[1];
		i = 2;
	}
	
	if ('object' !== typeof target && 'function' !== typeof target) {
		target = {};
	}
	//extend Red itself if only one argument is passed
	if (length === i) {
		target = this;
		i--;
	}
	isArray = '[object Array]' === this.toString.call(target);
	
	for (; i<length; i++) {
		if (null != (options = arguments[i])) {
			for (var k in options) {
				var src  = target[k]
				  , copy = options[k]
				  , tmp;
				
				//prevent never-ending loop
				if (target === copy) {
					continue;
				}
				
				if (deep && copy && 'object' === typeof copy && !copy.nodeType) {
					tmp = Red.extend(deep, (src || (null != copy.length ? [] : {})), copy);
				} else {
					tmp = copy;
				}
				
				if (undefined !== tmp) {
					if (isArray && null !== k.match(/^[0-9]+$/)) {
						target.push(copy);
					} else {
						target[k] = copy;
					}
				}
			}
		}
	}
	return target;
};

Red.prototype = Red.fn = {
	'init': function(o) {
		
	},
	'validate': function(params){
		var target = ['input', 'textarea', 'select']
		  , c = target.length;
		for (var k in this) {
			var parent = this[k]
			  , childs = [];
			//
			
			for (var i=0; i<c; i++) {
				
			}
		}
	}
};

Red.extend({
	/**
	 * get IE version
	 *
	 * @return int|undefined
	 */
	'ie': function() {
		var v = 3,
			d = document.createElement('div'),
			a = d.getElementsByTagName('i');
		while (
			d.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
			a[0]
		);
		return v > 4 ? v : undefined;
	},
	/**
	 * Is argument an array
	 *
	 * @return bool
	 */
	'isArray': function(o) {
		return '[object Array]' === toString.call(o);
	},
	/**
	 * get / set cookie value
	 *
	 * @param string name
	 * @param string value
	 * @param array|int options
	 * @return void|string:cookieValue
	 */
	'cookie': function(name, value, options) {
		if (undefined === value) {
			//Get cookie
			
			if (document.cookie && '' !== document.cookie) {
				var cookies = document.cookie.split(';')
				  , offset = name.length
				;
				for (var i=0,c=cookies.length; i<c; i++) {
					var cookie = cookies[i].replace(/(^\s+|\s+$)/, '');
					if (cookie.substring(0, offset) === name) {
						return decodeURIComponent(cookie.substring(offset+1));
					}
				}
			}
			return null;
		} else {
			//Set cookie
			
			//3rd argument MAY be used as expire option
			options = 'number' === typeof options ? ({'expires': options}) : (options || {});
			
			var expires = '';
			if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
				var date;
				if (typeof options.expires == 'number') {
					date = new Date();
					date.setTime(date.getTime() + (options.expires * 1000));
				} else {
					date = options.expires;
				}
				expires = '; expires=' + date.toUTCString();
			}
			
			var path   = options.path   ? '; path='   + (options.path)   : '';
			var domain = options.domain ? '; domain=' + (options.domain) : '';
			var secure = options.secure ? '; secure' : '';
			
			document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
		}
	},
	'void': undefined
});


})(window);
