YAHOO.namespace('POTISCOM');
//YAHOO.namespace('POTISCOM.Singletons');

(function() {

	var Dom = YAHOO.util.Dom,
		Event = YAHOO.util.Event,
		Lang = YAHOO.lang,
		Application = YAHOO.POTISCOM.Application;

	var Tools = function() {
		
		var _singleton = function() {
		}
	
		_singleton.prototype = {

			/**
			 * 
			 * @param {Object} containerId
			 */
			collectSubmittables_OLD: function(containerId) {
				var data = [];
				var item = 0;
				if(containerId) {
					Dom.getElementsByClassName('submittable', null, containerId, function(elem) {
					var elemName = elem.name;
					if(!elem.disabled && elemName) {
						elemName = encodeURIComponent(elemName) + '=';
						switch(elem.type) {
						case 'radio':
						case 'checkbox':
							if(elem.checked){
								data[item++] = elemName + encodeURIComponent(elem.value);
							}
							break;
							 default:
								 data[item++] = elemName + encodeURIComponent(elem.value); 
						 }
					 }
					 });
				}
				data = data.join('&');

				Conn.asyncRequest(method, url, {
					success: function(o)  {
						// ...
					}
				}, data);			
			},

			/**
			 * 
			 * @param {Object} containerId
			 */
			collectSubmittables: function(containerId) {
				var result = {};
				var elements = YAHOO.util.Selector.query('#'+containerId+' .submittable');
				elements.each(function(submittable) {
					if (submittable.type=='checkbox') {
						var resultKey = submittable.name || submittable.id;
						result[resultKey] = submittable.checked;
					} else if (submittable.value!=undefined) {
						var resultKey = submittable.name || submittable.id;
						result[resultKey] = submittable.value;
					} else {
						result[submittable.id] = submittable.innerHTML;
					}
				});
				return result;
			},

			/**
			 * 
			 * @param {Object} url
			 * @param {Object} method
			 * @param {Object} callback
			 * @param {Object} data
			 */
			sendRequest: function(url, method, callback, data) {
				if (!url) {
					throw new YAHOO.POTISCOM.Exception('YAHOO.POTISCOM.Tools.sendReqest(): Required parameter "url" not specified.');
				}
				if (!method) {
					var method = 'get';
				}
				
				if (data) {
					data = $H(data); // BAD Mootools function
					if (method.toLowerCase() !== 'post') {
						url = url + '?' + data.toQueryString();
						var data = undefined;
					}
					else {
						var data = data.toQueryString();
					}
				}
				YAHOO.util.Connect.asyncRequest(method, url, callback, data);
			},
			
			/**
			 * 
			 * @param {Object} element
			 * @param {Object} contents
			 */			
			cloneElement: function(element, contents) {
				var clonedElement = document.createElement('div');
				var reg = Dom.getRegion(element);
				Dom.setStyle(clonedElement, 'width', (reg.right-reg.left)+'px');
				Dom.setStyle(clonedElement, 'height', (reg.bottom-reg.top)+'px');
				Dom.addClass(clonedElement, 'draggingDummy')
				return clonedElement;
				
				/*
				// CLONE
				function removeId(element) {
					if (element.removeAttribute) {
						element.removeAttribute('id');
					}
					for (var i=0, k=element.childNodes.length; i<k; i++) {
						removeId(element.childNodes[i]);
					}
				}
				
				var clonedElement = element.cloneNode(true);
				var toRemove = [];
				for (var i = 0, k = clonedElement.childNodes.length; i < k; i++) {
					if (clonedElement.childNodes[i].className && clonedElement.childNodes[i].className.indexOf('yui-module')>=0) {
						toRemove.push(clonedElement.childNodes[i]);
					}
				}
				for (var i = 0, k = toRemove.length; i < k; i++) {
					clonedElement.removeChild(toRemove[i]);
				}
				removeId(clonedElement);
				return clonedElement;
				*/
				
				
				/*
				// OLD
				switch ($type(element)){
					case 'element':
						console.info('CLONE ELEMENT!');
						//var clonedElement = document.createElement(element.nodeName.toLowerCase());
						
						// clonedElement.setAttribute('class', 'treeItemContainer');
					
						var attributes = {};
						for (var j = 0, l = element.attributes.length; j < l; j++){
							var attribute = element.attributes[j];
							var key = attribute.nodeName.toLowerCase();
							if (YAHOO.env.ua.ie > 0 && (/input/i).test(element.tagName) && (/width|height/).test(key)) continue;
							
							var value = (key == 'style' && element.style) ? element.style.cssText : attribute.nodeValue;
							
							if (!$chk(value) || key == 'uid' || key == 'id') continue;
							if (value != 'inherit' && ['string', 'number'].contains($type(value))) {
								if (key=='style') {
	//								clonedElement.style.cssText = value;
								} else {
									// clonedElement.setAttribute(key, value);
	//								attributes[key] = value;
								}
								//console.log("trying to set "+key+" to "+value);
								//if(key == 'style') continue;
								//elem.set(key, value);
							}
							
							
							clonedElement.setAttributeNode(attribute);
						}
	
						if (contents !== false) {
							console.log('CONTENTS NOT FALSE!');
							for (var i = 0, k = element.childNodes.length; i < k; i++) {
								console.log('__CHILD ELEMENT__');
								console.log('CHILD: '+element.childNodes[i].style.positition);
								
								var child = this.cloneElement(element.childNodes[i], true);
								if (child) clonedElement.appendChild(child);
							}
						}
						return clonedElement;
					case 'textnode': 
						console.info('CLONE TEXTNODE!');
						return document.createTextNode(element.nodeValue);
					default:
						console.info('NEITHER ELEMENT NOR TEXTNODE');
				}
				return null;
				*/
			},
			
			isInputElement: function(element, autofocus) {
				if (element.tagName.toUpperCase()==='TEXTAREA') {
					if (autofocus) {
						element.focus();
					}
					return true;
				}
				
				if (element.tagName.toUpperCase()==='INPUT' && element.type.toUpperCase()==='TEXT') {
					if (autofocus) {
						element.focus();
					}
					return true;
				}
				
				if (element.tagName.toUpperCase()==='SELECT' || element.tagName.toUpperCase()==='OPTION') {
					return true;
				}
			},
			
			getCommandObject: function(elementId) {
				var element = Dom.get(elementId);
				if (!element.id) {
					Dom.generateId(element, 'yui-gen-');
				}
				return YAHOO.util.Selector.query('#'+element.id+' > div.commandobject', element.parentNode, true);
				
				/*
				var element = Dom.get(elementId);
				if (!element.id) {
					Dom.generateId(element);
				}
				console.log('get cmd object: '+element.id);

				console.log('---- GET FOR: '+element);
				
				var el = Dom.getFirstChildBy(element, function(element) {
					return Dom.hasClass(element, 'commandobject');
				});
				console.log('GOT COMMAND OBJECT: '+el);
				return el;
				*/

			},
			
			getCommando: function(commandObjectId, name) {
				var commandObject = Dom.get(this.getCommandObject(commandObjectId));
				
				if (commandObject) {
					var el = Dom.getFirstChildBy(commandObject, function(element) {
						return element.name == name;
					});
					
					if (el) {
						return (el.value) ? el.value : '';
					}
					throw new YAHOO.POTISCOM.Exception('YAHOO.POTISCOM.Module: Command with name '+name+' not found');
				}
				
				throw new YAHOO.POTISCOM.Exception('YAHOO.POTISCOM.Module: No command object found for this module');
			},

			setCommando: function(commandObjectId, name, newValue) {
				var commandObject = Dom.get(this.getCommandObject(commandObjectId));
				
				if (commandObject) {
					var el = Dom.getFirstChildBy(commandObject, function(element) {
						return element.name == name;
					});
					
					if (el) {
						el.value = newValue;
						return true;
					} else {
						var cmd = document.createElement('input');
						cmd.type = "text";
						cmd.value = newValue;
						commandObject.appendChild(cmd);
						return true;
					}
					throw new YAHOO.POTISCOM.Exception('YAHOO.POTISCOM.Module: Command with name '+name+' not found');
				}
				
				throw new YAHOO.POTISCOM.Exception('YAHOO.POTISCOM.Module: No command object found for this module');
			},

			/*
			_initElementOverlays: function() {
				alert('DEPRECATED FUNCTION "_initElementOverlays"');
				if (!PSingletons.elementOverlays) {
					PSingletons.elementOverlays = {};
				}
			},
			*/
			
			disableElement: function(id, showBusyIndicator) {
//				var element = Dom.get(id);
				Dom.addClass(id, 'containerloading');
				/*
				var element = Dom.get(id);
				var blocker = Dom.get(id+'_busyIndicator');
				if (!blocker) {
					blocker = document.createElement('div');
					blocker.id = id+'_busyIndicator';
				}
				
				(showBusyIndicator) ? Dom.addClass(blocker, 'blocker_busy') : Dom.addClass(blocker, 'blocker_plain');
				Dom.get(id).appendChild(blocker);
				
				var reg = Dom.getRegion(element);
				Dom.setStyle(blocker, 'width', (reg.right - reg.left) + 'px');
				Dom.setStyle(blocker, 'height', (reg.bottom - reg.top) + 'px');
				Dom.setStyle(blocker, 'left', reg.left + 'px');
				Dom.setStyle(blocker, 'top', reg.top + 'px');
				*/
				
			},
			
			refreshBlocker: function(element) {
				
			},
			
			enableElement: function(id) {
				Dom.removeClass(id, 'containerloading');
				/*
				var blocker = Dom.get(id+'_busyIndicator');
				if (blocker && blocker.parentNode) {
					blocker.parentNode.removeChild(blocker);
				}
				delete blocker;
				*/
			},


	
			isDoHandler: function(element, command) {
				if (!element.id) {
					return false;
				}
				var params = element.id.split('_');
				
				if (params.length <= 0) {
					return false;
				}
				
				if (params[0].toLowerCase() != 'do') {
					return false;
				}
				if (!command) {
					return true;
				}
				if (params[1].toLowerCase() === command.toLowerCase()) {
					return true;
				}
				return false;
			},
	
			getDoHandler: function(element, command) {
				if (this.isDoHandler(element, command)) {
					return element;
				}
				while (element.parentNode) {
					return this.getDoHandler(element.parentNode, command);
				}
				return undefined;
			},



			parseBeeId: function (id) {
				console.warn('USING DEPRECATED FUNCTION: YAHOO.POTISCOM.Tools.parseBeeId()');
				var elems = this.getFormattedIdAsArray(id);
				var resultArray = [];
				var resultObj = {};
				elems.each(function (elem) {
					if (elem.indexOf(':')<=0) {
						resultArray.include(elem);
					} else {
						elem = elem.split(':');
						resultObj[elem[0]] = elem[1];
					}
				});
				if(resultArray.length > 0) {
					resultArray.include(resultObj);
					return resultArray;
				}
				return resultObj;
			},
			
			getFormattedIdAsArray: function(id) {
				console.warn('USING DEPRECATED FUNCTION: YAHOO.POTISCOM.Tools.getFormattedIdAsArray()');
				var rexp = /^[a-zA-Z0-9_]+\[([a-zA-Z0-9,%\.\/_\-=\:]+)\]$/;
				var result = id.match(rexp);
				result = result[1].split(/,/);
				return result;
			},
			
			getInternalDerefer: function(href) {
				var derefer = false;
				if (href.indexOf('http://')===0) {
					var protocol = 'http';
				} else if (href.indexOf('https://')===0) {
					var protocol = 'https';
				}
				
				if (protocol) {

					var baseUrl = protocol+'://'+Application.getHost()+'/';
					if (Application.getBasePath()) {
						baseUrl += Application.getBasePath()+'/';
					}
					baseUrl += Application.getDispatcher('site');
					
					if (href.indexOf(baseUrl)===0) {
						var hrefParts = href.split(baseUrl);
						var categoryParts = hrefParts[1].split('/');
						var internalName = categoryParts[categoryParts.length-1];
						if (categoryParts[categoryParts.length-2]==='system') {
							// derefer = 'system/'+internalName; 
						} else {
							derefer = internalName;
						}
					}
					
				}
				
				if (derefer) {
					var hedgePos = derefer.indexOf('#');
					if (hedgePos !== -1) {
						derefer = derefer.substring(0, hedgePos);
					}
					var paramsPos = derefer.indexOf('?');
					if (paramsPos !== -1) {
						derefer = derefer.substring(0, paramsPos);
					}
				}
				
				return derefer;
			},
			
			showContainer: function(containerOrId) {
				Dom.removeClass(containerOrId, Application.CSS_CLASS_INVISIBLE);
			},
			
			hideContainer: function(containerOrId) {
				Dom.addClass(containerOrId, Application.CSS_CLASS_INVISIBLE);
			},
			
			isContainerVisible: function(containerOrId) {
				if (!Dom.get(containerOrId)) {
					return false;
				}
				return !Dom.hasClass(containerOrId, Application.CSS_CLASS_INVISIBLE);
			},
			
			arrayContains: function(obj) {
			     var i, listed = false;
			     for (i=0; i<this.length; i++) {
			       if (this[i] === obj) {
			         listed = true;
			         break;
			       }
			     }
			     return listed;
			},

			
			
			
			
			
			/**
			 * Executes request and updates a container.
			 * 
			 * @todo: ADD A ADDITINAL CALLBACK (like finally)
			 * @todo: generate container id automatically
			 * 
			 * @param string|element container
			 * @param string url
			 * @param string method
			 * @param object data
			 */
			execRequest: function(container, url, method, data, customCallback, customCallbackParams, scope) {
				container = Dom.get(container);
				var callback = { 
					success: function(o) {
						Tools.updateContainer(container, o.responseText);
						if (customCallback) {
							customCallback.call(this, customCallbackParams, o.responseText);
						}
						Tools.enableElement(container, true);
					}, 
					failure: function(o) {
						console.warn('REQUEST FAILED!');
					}, 
					scope: scope
				} 
				
				Tools.disableElement(container, true);
				
				if (!method) {
					var method = 'get';
				}
				
				//if (typeof(data)=='string' && data.indexOf('testform')==0) {
				if (typeof(data)=='string' && Dom.get(data).tagName && Dom.get(data).tagName.toUpperCase()=='FORM') {
					var formObject = Dom.get(data);
					YAHOO.util.Connect.setForm(formObject);
					var request = YAHOO.util.Connect.asyncRequest(method, url, callback);
				} else {
					if (data) {
						data = $H(data); // BAD Mootools function
						if (method.toLowerCase() !== 'post') {
							url = url + '?' + data.toQueryString();
							var data = undefined;
						} else {
							var data = data.toQueryString();
						}
					}
					var request = YAHOO.util.Connect.asyncRequest(method, url, callback, data);
				}
                return request;
			},

            cancelRequest: function(request) {
//                return request.abort();
//                console.log(Lang.dump(request));
                return YAHOO.util.Connect.abort(request);
            },
			
			/**
			 * Injects HTML content into a container.
			 * 
			 * @param string|element container
			 * @param string content
			 */
			updateContainer: function(container, content) {
				var div = Dom.get(container);
				if (content !== undefined) {
					div.innerHTML = content;
				}
			}
			
		}
		
		return new _singleton();
	} ();
	
	YAHOO.POTISCOM.Tools = Tools;
	
})();

YAHOO.register('POTISCOM.Tools', YAHOO.POTISCOM.Tools, {version: "0.1", build: '1'});