/**
 * file contains all default zig script
 * 
 * - onload function loader
 * - popup class
 * 
 */

Event.observe(window, 'load', doOnload);
var aOnloadFunctions = new Array();


/**
 * Onload function Load all functions stored in onloadFunctions
 * 
 * @return void
 */
function doOnload()
{
	for(var iIndex = 0; iIndex < aOnloadFunctions.length; iIndex++ )
	{
		if(aOnloadFunctions[iIndex])
		{
			aOnloadFunctions[iIndex]();
		}
	}
}

/**
 * Store a function to run in window.Onload
 * 
 * @param string sName
 * @return void
 */
function addOnloadFunction(sName)
{
	iIndex = aOnloadFunctions.length + 1;

	aOnloadFunctions[iIndex] = sName;
}


var sCurrentHash;

/**
 * call functions by change of hash
 * 
 * @param sFunc function to call
 * @param iTimeout timeout between calls of initHashExecuter
 * @param sDefault default hash to hash (#test)
 * @return void
 */
function initHashExecuter(sFunc,iTimeout, sDefault, sStop)
{
		if(location.hash == "#undefined")
		{
			location.hash = '';
			window.location.href=window.location.href.slice(0, -1);
		}
		else
		{
			if(!location.hash)
			{
				location.hash = sDefault;
			}
			
			if(location.hash)
			{
				if(sCurrentHash != location.hash)
				{
					sCurrentHash = location.hash;
					
					sFunc(location.hash.replace("#", ""));
				} 
			}
			
		
			setTimeout("initHashExecuter("+sFunc+","+iTimeout+")", iTimeout);
		}
}

/**
 * Clear default texts
 * 
 * @author Bhe
 * @version 0.1
 * @copyright Copyright (c) 2009, Zig Websoftware
 * @buildOn Prototype
 */
function initClearElementDefaults() 
{
    var aFormInputs = $$('input');
    var iInputFields = aFormInputs.length;
    
    for (var iCounter = 0; iCounter < iInputFields; iCounter++) 
    {
        var oElement = aFormInputs[iCounter];

        if ((oElement.type == 'text' || oElement.type == 'password') && oElement.className.match(/\bcleardefault\b/)) 
        {       
            oElement.observe('focus', clearDefaultText);
            oElement.observe('blur', replaceDefaultText);
            
            if (oElement.value != '') 
            {
            	oElement.defaultText = oElement.value;
            }
        }
    }
}

function clearDefaultText(e) 
{
    var oTarget = window.event ? window.event.srcElement : e ? e.target : null;
    
    if (!oTarget)
    {
    	return;
    }
    
    if (oTarget.value == oTarget.defaultText) 
    {
    	oTarget.value = '';
    }
}

function replaceDefaultText(e) 
{
    var oTarget = window.event ? window.event.srcElement : e ? e.target : null;
    
    if (!oTarget)
    {
    	return;
    }
    
    if (oTarget.value == '' && oTarget.defaultText) 
    {
    	oTarget.value = oTarget.defaultText;
    }
}

addOnloadFunction(initClearElementDefaults);

/**
 * make links work via ajax
 * 
 * @author Bhe
 * @version 0.1
 * @copyright Copyright (c) 2009, Zig Websoftware
 * @buildOn Prototype
 */
function initAjaxLinks()
{
	var aLinks = $$('.ajaxize');
	
	var iAmountOfLinks = aLinks.length;

	for(var iCounter = 0; iCounter < iAmountOfLinks; iCounter++)
	{
		var oLink = aLinks[iCounter];

		oLink.onclick = function(){

			var oRequest = new Ajax.Request(this.href,{
											method		:	'get',
											evalScripts	: 	true,
											onSuccess 	: 	function(oTransport)
															{
																//TODO: i doubt this...							
																if(oTransport.responseText.substr(0,5) == '<!DOC')
																{
																	window.document.open();
																	window.document.write(oTransport.responseText);
																	window.document.close();
																}
																else
																{
																	Popup.open({content: oTransport.responseText});
																	initAjaxPopupForm();
																}					
															},
											onFailure 	: 	function()
															{
																Popup.open({content: 'Er is een onbekende fout opgetreden'});
															}
			});

			return false;
		};
	}
}

function initAjaxPopupForm()
{
	var oForm = $$('#'+Popup.aOptions.id+' form').first();
	
	if(oForm)
	{									
		oForm.observe('submit',function(e){ 
			
			var oPostedForm = Event.element(e);
			var sForminput 	= oPostedForm.serialize();
			var sFormaction = oPostedForm.action;
			var sFormmethod = oPostedForm.method;	
			
			Event.stop(e);
			
			new Ajax.Request(
					sFormaction,
					{
						evalScripts	: true,
						method		: sFormmethod,
						parameters	: sForminput,
						onSuccess	: function(oTransport)
									{		
										//TODO: i doubt this...							
										if(oTransport.responseText.substr(0,5) == '<!DOC')
										{
											window.document.open();
											window.document.write(oTransport.responseText);
											window.document.close();
										}
										else
										{
											Popup.setOptions({content: oTransport.responseText});
											initAjaxPopupForm();
										}
									},
						onFailure 	: function()
									{
										Popup.setOptions({content: 'Er is een onbekende fout opgetreden'});
									}
					}
				);
			}
		);
	}
}

addOnloadFunction(initAjaxLinks);

/**
 * show loading image in element
 * 
 * @param mElement
 * @return void
 */
function showLoading(mElement)
{
	$(mElement).innerHTML = '<img src="/images/loading_small.gif" alt="bezig met laden..." class="loading" />';
}

function showLoadingLayer()
{
	Popup.showOverlay();
}

/**
 * Zig-Popup
 * 
 * @author Bhe
 * @version 0.1
 * @copyright Copyright (c) 2009, Zig Websoftware
 * @buildOn Scriptaculous, Prototype
 */
var PopupOpen = false;
var Popup = 
{	
	/**
	 * Config Options
	 * 
	 * @param array aOptions
	 * 
	 */
	setOptions: function(aOptions)
	{
		this.aOptions = {

			//Popup options
	    	id					: 'popup',	// id of popup
			popupShowDuration	: 0.6,		// Window fade in/out duration
			popupHideDuration	: 0.6,		// Window fade in/out duration
			
	    	//Overlay options
	    	overlayId			: 'overlay',	// id of overlay element
	    	showOverlay			: true,			// show overlay
			overlayShowDuration	: 0.3,			// Overlay fade in/out duration
			overlayHideDuration	: 0.3,			// Overlay fade in/out duration
			overlayFadeFrom		: 0.0,			// From where must the fade-in start? 0.0 = transparent
			overlayFadeTo		: 0.6,			// From where must the fade-in end? 1.0 = solid
			
			//Content options
			url					: '',			// url to load content with
			urlSuccess			: null,			// callback function onSuccess
			Image				: '',			// url to show single image
	    	title				: '',			// title of content
	    	content				: '',			// content in popup
	    	showClose			: true,			// show close button
	    	showConfirmSuccess	: false, 		// show OK button
	    	showConfirmCancel	: false, 		// show cancel button
	    	textConfirmSucces	: 'OK',			// text OK button
	    	textConfirmCancel	: 'Annuleer', 	// text Cancel button
	      	onConfirmSuccess	: null,			// callback function onConfirmSuccess
	      	onConfirmCancel		: null			// callback function onConfirmCancel
		}

	    Object.extend(this.aOptions, aOptions || {});
		
		$(this.aOptions.id).removeClassName('popupAlbum');
		
	    //empty content
		$(this.aOptions.id+'_content').innerHTML = '';

		//add ajax content
		if(this.aOptions.url)
		{
			new Ajax.Request(	this.aOptions.url, 
								{
									method:'get',
									onSuccess: function(oTransport){
				
										if(this.aOptions.urlSuccess)
										{
											this.aOptions.urlSuccess(oTransport);
										}
										else
										{
											$(this.aOptions.id+'_content').innerHTML = oTransport.responseText;
											initAjaxPopupForm();
										}
									}.bind(this)
								}
			);
		}

		//add image
		if(this.aOptions.image)
		{
			$(this.aOptions.id+'_content').innerHTML  = '<img id="'+ this.aOptions.id +'_image" src="'+this.aOptions.image+'" alt="Vergroting van afbeelding" />';
		}

		//add image
		if(this.aOptions.album)
		{
			$(this.aOptions.id).addClassName('popupAlbum');
			
			var oNavigation = document.createElement('ul');			
				oNavigation.className = 'albumNavigation';
						
			var oMarkedNavigation = document.createElement('ul');			

			var iCounter = 0;	
			var sActiveImage = this.aOptions.image;
				
			var aLinks = $$('a[rel='+this.aOptions.album+']');		

			var iAmountOfLinks = aLinks.size();

			var sAlbum = this.aOptions.album;
			
			var oPrevImage = document.createElement('a');
			var oNextImage = document.createElement('a');
			var oFirstLi;
			var oLastLi;
			
			var oTempPrevImage;
			var iGetNext = 0;
			var sImageSuffix = 'Active';
			var isFirst = false;
			var isLast = false;
			
			aLinks.each(function(oEl)
			{	
				iCounter++;
				
				var oLi = document.createElement('LI');
				
				var oElement = oEl.cloneNode(true);

				oElement.innerHTML = iCounter;
				
				
				if(iGetNext == 1)
				{
					oNextImage = oEl.cloneNode(true);
					iNextImage = new Image();
					iNextImage.src = oNextImage;
					iGetNext = 0;
				}
				
				if(oElement.href.match(sActiveImage))
				{
					if(iCounter > 1)
					{
						oPrevImage = oTempPrevImage;
						iPrevImage = new Image();
						iPrevImage.src = oPrevImage;
					}
					oElement.className = 'active';
					
					iGetNext = 1;
					if(iCounter == 1)
						isFirst = true;
					if(iCounter == iAmountOfLinks)
						isLast = true;
					
				}
				oNavigation.appendChild(oLi);
				
				oTempPrevImage = oEl.cloneNode(true);
				
				
				oLi.appendChild(oElement);
				
				if(iCounter == 1)
				{
					var oFirstElement = oElement.cloneNode(true);
					
					if(oElement.href.match(sActiveImage))
						oFirstElement.innerHTML = '<img src="/images/pageSelectFirst.png" alt="&lt;&lt;" />';
					else
						oFirstElement.innerHTML = '<img src="/images/pageSelectFirst'+sImageSuffix+'.png" alt="&lt;&lt;" />';
						oFirstElement.setAttribute('id','first'+sAlbum);
					
						oFirstLi = document.createElement('LI');			
						oFirstLi.appendChild(oFirstElement);
						
					}
				
				if(iCounter == iAmountOfLinks)
				{			
					var oLastElement = oElement.cloneNode(true);
					
					if(oElement.href.match(sActiveImage))
						oLastElement.innerHTML = '<img src="/images/pageSelectLast.png" alt="&gt;&gt;" />';
					else
						oLastElement.innerHTML = '<img src="/images/pageSelectLast'+sImageSuffix+'.png" alt="&gt;&gt;" />';
						oLastElement.setAttribute('id', 'last'+sAlbum);
						
						oLastLi = document.createElement('LI');			
						oLastLi.appendChild(oLastElement);
				}	

			});
			
			
			// Create first two icons and insert them on top
			if(isFirst)
				oPrevImage.innerHTML = '<img src="/images/pageSelectPrev.png" alt="&lt;" />';
			else
				oPrevImage.innerHTML = '<img src="/images/pageSelectPrev'+sImageSuffix+'.png" alt="&lt;" />';
			oPILi = document.createElement('li');			
			oPILi.appendChild(oPrevImage);
			
			oNavigation.insertBefore(oPILi, oNavigation.firstChild);
			oNavigation.insertBefore(oFirstLi, oNavigation.firstChild);
			
			// Create last two icons
			if(isLast)
				oNextImage.innerHTML = '<img src="/images/pageSelectNext.png" alt="&gt;" />';
			else
				oNextImage.innerHTML = '<img src="/images/pageSelectNext'+sImageSuffix+'.png" alt="&gt;" />';
			oNILi = document.createElement('li');			
			oNILi.appendChild(oNextImage);
			
			oNavigation.appendChild(oNILi);
			oNavigation.appendChild(oLastLi);
			
			$(this.aOptions.id+'_content').appendChild(oNavigation);		
		}
		
		
		
		//add title
		if(this.aOptions.title)
		{
			$(this.aOptions.id+'_content').innerHTML  += this.aOptions.title;
		}

		//add content
		$(this.aOptions.id+'_content').insert(this.aOptions.content);
		
		//show confirm
		if(this.aOptions.showConfirmSuccess || this.aOptions.showConfirmCancel)
		{
			$(this.aOptions.id+'_confirm').style.display = 'block';	
			$(this.aOptions.id+'_confirmSuccess').innerHTML = this.aOptions.textConfirmSucces;
			$(this.aOptions.id+'_confirmCancel').innerHTML = this.aOptions.textConfirmCancel;

			if(this.aOptions.showConfirmSuccess)
			{
				$(this.aOptions.id+'_confirmSuccess').style.display = 'inline';
			}
			else
			{
				$(this.aOptions.id+'_confirmSuccess').style.display = 'none';				
			}
			
			if(this.aOptions.showConfirmCancel)
			{
				$(this.aOptions.id+'_confirmCancel').style.display = 'inline';
			}
			else
			{
				$(this.aOptions.id+'_confirmCancel').style.display = 'none';				
			}
			
			if(this.aOptions.onConfirmSuccess)
			{
				var sOnConfirmSuccess = this.aOptions.onConfirmSuccess;
				$(this.aOptions.id+'_confirmSuccess').onclick = sOnConfirmSuccess;
			}
			else
			{
				$(this.aOptions.id+'_confirmSuccess').onclick = function(){ Popup.close();return false; }
			}
			
			if(this.aOptions.onConfirmCancel)
			{
				var sOnConfirmCancel = this.aOptions.onConfirmCancel;
				$(this.aOptions.id+'_confirmCancel').onclick = sOnConfirmCancel;
			}
			else
			{
				$(this.aOptions.id+'_confirmCancel').onclick = function(){ Popup.close();return false;  }
			}
		}
		else
		{
			$(this.aOptions.id+'_confirm').style.display = 'none';
		}
		
		if(this.aOptions.showClose)
		{
			$(this.aOptions.id+'_close').style.display = 'block';
		}
		else
		{
			$(this.aOptions.id+'_close').style.display = 'none';
		}
	},

	/**
	 * Open popup
	 */
	open: function(aOptions)
	{	
		if(PopupOpen == false)
		{
			this.setOptions(aOptions);
			this.PopupOpen = true;
			this.showOverlay();

			setTimeout("Effect.Appear('"+this.aOptions.id+"')", this.aOptions.popupShowDuration);
			setTimeout(function() { this.adjustSize(); }.bind(this), 100);
		}
		this.adjustSize();
		this.adjustPosition();
	},

	/**
	 * Close popup
	 */
	close: function(aOptions)
	{
		oPopup = this;
		
		new Effect.Fade(this.aOptions.id, {	
											duration: this.aOptions.popupHideDuration, 
											afterFinish: function(){oPopup.setOptions(aOptions);}
											}
						);
		
		this.hideOverlay();
		PopupOpen = false;
	},

	/**
	 * Show overlay
	 */
	showOverlay: function()
	{
		if(this.aOptions.overlayId && $(this.aOptions.overlayId) && this.aOptions.showOverlay)
		{
			var aPageSize = this.getPageSize();
			$(this.aOptions.overlayId).style.height = aPageSize[1]+'px';

			if($(this.aOptions.overlayId).style.display == 'none')
			{
				new Effect.Appear(this.aOptions.overlayId, {duration: this.aOptions.overlayShowDuration, from: this.aOptions.overlayFadeFrom, to: this.aOptions.overlayFadeTo});
			}
		}
	},

	/**
	 * Hide overlay
	 */
	hideOverlay: function()
	{
		if(this.aOptions.overlayId && $(this.aOptions.overlayId))
		{
			document.getElementsByTagName("body")[0].style.overflow = "auto"; 
			new Effect.Fade(this.aOptions.overlayId, {duration: this.aOptions.overlayHideDuration});
		}
	},

	/**
	 * adjust popup size
	 * adjust position
	 */
	adjustSize: function()
	{
		var aPage 			= this.getPageSize();			
		var iPopupHeight 	= $(this.aOptions.id).getHeight();	
		var iWindowHeight	= aPage[3];
		var iExtraSpace 	= 0;

		if(iPopupHeight < iWindowHeight)
		{		
			var iExtraSpace = parseInt((iWindowHeight - iPopupHeight) / 2);
		}
		
		var iHeight = parseInt((aPage[1] - aPage[3]) + iExtraSpace);

		$(this.aOptions.id).style.top = iHeight + 'px';
	},

	/**
	 * adjust popup window to show him correct vertically
	 * 
	 * - fix to do this in asjustSizem sow we now size of new popup
	 */
	adjustPosition: function()
	{


	},

	/**
	 * get scroll size
	 * @return array
	 */
	getScrollSize: function () 
	{
		
		  var iScrollX = 0, iScrollY = 0;
		  if( typeof( window.pageYOffset ) == 'number' ) 
		  {
			  iScrollY = window.pageYOffset;
			  iScrollX = window.pageXOffset;
		  } 
		  else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) 
		  {
			  iScrollY = document.body.scrollTop;
			  iScrollX = document.body.scrollLeft;
		  } 
		  else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) 
		  {
			  iScrollY = document.documentElement.scrollTop;
			  iScrollX = document.documentElement.scrollLeft;
		  }
		  
		  return [ iScrollX, iScrollY ];
	},
	/**
	 * get page size
	 * @return array
	 */
	getPageSize: function()
	{
		var aScrollSize = this.getScrollSize();
		
		var xScroll = aScrollSize[0];
		var yScroll = aScrollSize[1];
		
		var windowWidth, windowHeight;
		if (self.innerHeight) {	// all except Explorer
			windowWidth = self.innerWidth;
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}	
		
		var pageHeight = yScroll + windowHeight;
		var pageWidth = xScroll + windowWidth;


		aArrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
		return aArrayPageSize;
	}

}