/*
	Widgets Code
	Datum: 				8-8-2006
	Laatst Gewijzigd: 	8-8-2006
	Door:				Marijn van Aerle
*/

YAHOO.namespace ("modules");

//Events



//Classes
YAHOO.modules.Manager = function() {
	//PROPERTIES
	//METHODS
	//CONSTRUCTOR
	return {
		init: function () {
			var htmlHooks = YAHOO.util.Dom.getElementsByClassName('module','div','content');
			YAHOO.util.Dom.batch(htmlHooks, YAHOO.modules.Module.init);
		}
	}
}();

YAHOO.modules.Module = function() {
	//METHODS
	var renderModule = function(div,eventrules,title,content,loader) {
		if (typeof content != "undefined") { //als we wel content meesturen
			var titleNode = div.getElementsByTagName("h1")[0];
			var txtNode = YAHOO.util.Dom.getElementsByClassName("txt","div",div)[0];
			titleNode.innerHTML = title;
			txtNode.innerHTML = content;
			
			var fLoader = new YAHOO.util.Anim(loader);
			fLoader.attributes.opacity = { to: 0 };
			fLoader.duration = 1;
			fLoader.method = YAHOO.util.Easing.easeOut;
			fLoader.animate();
			fLoader.onComplete.subscribe(hideLoader); 
		}
		
		YAHOO.tooltip.hideTooltip();
	
		//scroll(0,0);
		applyEvents(div,eventrules);
		//activeer de widgets in deze module
		if (typeof YAHOO.widget != "undefined") {
			YAHOO.widgets.Widget.init(div);		
		}
		
		//init helpteksten
		YAHOO.tooltip.checkElements(div);
	};

	var submitModule = function(e) {
		//alert('voor');
		var parentModule = YAHOO.util.Dom.getParentElement(YAHOO.util.Event.getTarget(e),"div","class","module");
		//alert('na'); 
		var trigger = YAHOO.util.Event.getTarget(e).getAttribute('widgetName');
		
		//disable andere events
		//var eventRuleNameNodes = YAHOO.util.Dom.getElementsByClassName('eventnames','div',parentModule)[0];
  
		//var widgets = YAHOO.util.Dom.getElementsByAttribute("widgetName", null, parentModule);
		//console.log(parentModule);   
		if (parentModule.getAttribute("leaveEvents") == null) { 
			//YAHOO.util.Event.purgeElement(parentModule, true);   
		}
		/*for (i in widgets) {
			for (n in eventRuleNameNodes.childNodes) {
				if (eventRuleNameNodes.childNodes[n]) { //van undefines af in firefox
					if (widgets[i].getAttribute("widgetName") == eventRuleNameNodes.childNodes[n].innerHTML) {
						//remove event van deze node
						YAHOO.util.Event.purgeElement(widgets[i], false);
					}
				};
			}	
		}*/
		
		//console.log(eventrules); 
		
		//YAHOO.util.Event.purgeElement(parentModule, true);
		
		YAHOO.modules.Module.refreshModule(parentModule,trigger);
	};

	var applyEvents = function(div,events) {
		var eventNamesNodes = YAHOO.util.Dom.getElementsByClassName("eventnames", null, div);
		if (eventNamesNodes.length == 0) {
			var eventnamesdiv = YAHOO.ext.DomHelper.append(div,{tag: "div", cls: "eventnames"});	
		} else {			
			var eventnamesdiv = eventNamesNodes[0];
			eventnamesdiv.innerHTML = "";
		}
		
		var tags = YAHOO.util.Dom.getElementsByAttribute("widgetName", null, div);

		for(i in tags) {
			//voor iedere tag check of we een event hebben met deze widgetName
			
			for (eventName in events) {
				//als een van deze eventNames overeenkomt met de naam van de huidige widget dan apply
				if (eventName == tags[i].getAttribute('widgetName')) {
					applyEvent(tags[i],events[eventName]);
					YAHOO.ext.DomHelper.append(eventnamesdiv,{tag: "div", html: tags[i].getAttribute('widgetName')});
				}
			}
		}
	};

	var applyEvent = function(tag,eventName) {
		if (tag.getAttribute("widgettype") == null) {		
			switch(eventName) {
				default:
					YAHOO.util.Event.addListener(tag, eventName, submitModule);
					//console.log(tag + ", " + eventName);
					return true;
					break;
			}
		} else {
			//widgettype is defined
			tag.setAttribute("event",eventName);
		}
	}

	var getValues = function(div) {

		var tags = YAHOO.util.Dom.getElementsByAttribute("widgetName", null, div);

		var values = new Object();
		for (i in tags) {
			values[tags[i].getAttribute("widgetName")] = escape(getValue(tags[i]));
		}
		return values;
	};

	var getValue = function(tag) {
		switch (tag.tagName.toLowerCase()) {
			case "input":
				switch(tag.getAttribute('type')) {
					case "checkbox":
						return tag.checked;
						break;
					case "radio":
						return tag.checked;
						break;
					default:
						return tag.value;
						break
				};

				break;
			case "div":
				if (tag.getAttribute("widgetType") == "tinymce") {
				  for (i in tinyMCE.instances) {
            if (tinyMCE.instances[i].formTargetElementId == tag.textAreaId) {
              var mceInstance = tinyMCE.instances[i];
              var mceBody = mceInstance.getBody();
              var content = mceInstance.getBody().innerHTML;
              
              tinyMCE.execCommand("mceRemoveControl", false, i);   
            }
          }
          
				  return content;
				}
			  else if (tag.getAttribute("widgetType")) {
					var nodes = YAHOO.util.Dom.getElementsByAttribute("widgetParam", "div", tag);
					for (i in nodes) {
						if (nodes[i].getAttribute("widgetParam") == "returnValue")
							return nodes[i].innerHTML;
					}
					return "empty";
				}
				else {
					return tag.innerHTML;
				}
				break;
			case "select":
				if (tag.getAttribute("multiple")) {
					var selectedValues = new Array();
					for (var i=0, l=tag.options.length;i<l;i++) {
						if (tag.options[i].selected)
							selectedValues.push(tag.options[i].value);
					}
					return selectedValues;
				}
				return tag.value;
				break;
			default:
				return tag.value;
				break;
		}
	}

	var displayLoading = function(moduleNode) {
		//maak een loading message en positioneer die absoluut over het midden van het element
		var moduleRegion = YAHOO.util.Dom.getRegion(moduleNode);
		
		if (!YAHOO.util.Dom.get("loader")) {
			var loading = document.createElement("div");
			loading.setAttribute("loader",1);
			loading.id = "loader";
			loading.style.position = "absolute";
	
			loading.style.font = "12px/21px 'Trebuchet MS',Verdana, sans-serif";
			loading.style.background = "#333";
			loading.style.color = "#fff";
			loading.style.width = "100px";
			loading.style.height = "40px";
		} else {
			var loading = YAHOO.util.Dom.get("loader"); 
		}
		
		loading.style.top = moduleRegion["top"] + (moduleRegion["bottom"] - moduleRegion["top"])/2 - 20 + "px";
		loading.style.left = moduleRegion["left"] + (moduleRegion["right"] - moduleRegion["left"])/2 - 50 + "px";
		loading.style.textAlign = "center";

		loading.innerHTML = "Bezig...<br/><img src='img/widgets/loading.gif' />";


		document.body.appendChild(loading);

		YAHOO.util.Dom.setStyle(loading,"opacity",0);

		//fade in loading
		var fLoading = new YAHOO.util.Anim(loading);
		fLoading.attributes.opacity = { to: 1 };
		fLoading.duration = 1;
		fLoading.method = YAHOO.util.Easing.easeOut;
		fLoading.animate();
		
		return loading;
	};
	
	var hideLoader = function() {
		var loading = YAHOO.util.Dom.get("loader");
		loading.style.top = "-10000px";
		loading.style.left = "-10000px";
	};

	//publicc
	return {
		init: function(div) {
			//YAHOO.log(YAHOO.util.Dom.getElementsByClassName('widgetevents','div',div));
			eval(YAHOO.util.Dom.getElementsByClassName('moduleevents','div',div)[0].innerHTML);
			if (typeof events != "undefined") {
				var eventrules = events; //vage workaround wegens 'invalid label' error
			}
			renderModule(div, eventrules);
		},
		refreshModule: function(parentModule, trigger) {
			//alert('refreshModule');  
			//YAHOO.util.Connect.createFrame();
			//uploadFile:function(id, callback, uri){
			
			//get values
			var trigger = trigger;
			var valueArray = getValues(parentModule);

			var sendObject = new Object();
			sendObject['trigger'] = trigger;
			sendObject['values'] = valueArray;
			sendObject['moduleType'] = parentModule.getAttribute("moduleType");

			var sendString = JSONstring.make(sendObject);

			//Set up animations
			var loader = displayLoading(parentModule);

			//Set up request/response
			var callback = { //reactie op onderstaande request
				success: function(o) {
					if (typeof(o.responseText) == "undefined") {
						YAHOO.log("geen respons");
					} else {
						var returnObj = eval( '(' + o.responseText + ')' );
						renderModule(o.argument[0],returnObj["events"],returnObj["title"],returnObj["content"],o.argument[1]);
					}
				},
				failure: function(o) { YAHOO.log('failed to render module') },
				argument: [parentModule, loader]
			}

			
			var connectionObject = YAHOO.util.Connect.asyncRequest('POST',YAHOO.settings.moduleUrl+'sendModule', callback, 'sendString='+sendString);
		}
	}
}();

//Init
//YAHOO.util.Event.onAvailable('main', YAHOO.widgets.Manager.init(), YAHOO.widgets.Manager, true);
YAHOO.util.Event.addListener(window, "load", YAHOO.modules.Manager.init);