/*
	Javascript Object oriented dream by ArtVolk :)
	
*/


// Namespace emulation
var CrispStudio = new Object();

/*
	Utils Singleton

	some code taken from:
	http://www.javaportal.ru/javascript/articles/bestfunctions.html

*/
CrispStudio.JsUtils = new function() 
{
	this.$ = function(id)
	{
		if (document.getElementById != null)
		{
			return document.getElementById(id);
		}
		if (document.all != null )
		{
			return document.all[id];
		}
	}		

	this.GetEventSrc = function(e)
	{
		if (!e) 
		{
			e = window.event;
		}
    
		if (e.originalTarget)
		{
			return e.originalTarget;
		}
    
		else 
		{	
			if (e.srcElement)
			{
	    	return e.srcElement;
			}
		}
	}


	this.AddEvent = function(objObject, strEventName, fnHandler)
	{
		if (objObject.addEventListener)
		{
			objObject.addEventListener(strEventName, fnHandler, false);
		}	
	    else 	
		{
			if (objObject.attachEvent)
			{
				objObject.attachEvent("on" + strEventName, fnHandler);
			}
		}
	}

	this.RemoveEvent = function(obj, evType, fn, useCapture)
	{
		if (obj.removeEventListener)
		{
		    obj.removeEventListener(evType, fn, useCapture);
		    return true;
		} 
		else 
		{
			if (obj.detachEvent)
			{
				var r = obj.detachEvent("on"+evType, fn);
				return r;
			} 
			else 
			{
		    	alert("Handler could not be removed");
			}
		}
	}

	this.AddLoadEvent = function(func) 
	{
        var oldonload = window.onload;
        if (typeof window.onload != 'function') 
		{
                window.onload = func;
        }
        else 
		{
			window.onload = function() 
			{
				oldonload();
                func();
			}
        }
	}

	this.Toggle = function(obj)
	{
		if (obj.style.display != 'none') 
		{
			obj.style.display = 'none';
		}
		else 
		{
			obj.style.display = 'block';
		}
	}

	this.GetElementsByClassName = function(searchClass,node,tag) 
	{
        var classElements = new Array();
        if (node == null)
		{
			node = document;
		}
        if (tag == null)
		{
               tag = '*';
		}
        var els = node.getElementsByTagName(tag);
        var elsLen = els.length;
        var pattern = new RegExp("(^|\\s)" + searchClass+ "(\\s|$)");
        for (var i = 0, j = 0; i < elsLen; i++) 
		{
			if (pattern.test(els[i].className)) 
			{
				classElements[j] = els[i];
				j++;
			}
        }
        return classElements;
	}

} //CrispJsUtils

/*
	Menu Class
*/
CrispStudio.Menu = function(options)
{
	this.options = options;
	this.links = CrispStudio.JsUtils.GetElementsByClassName(options.className);
	this.waitingElement = CrispStudio.JsUtils.$(options.waitingId);
	this.debugElement = CrispStudio.JsUtils.$(options.debugId);
	this.placeholderElement = CrispStudio.JsUtils.$(options.placeholderId);
	this.MENU_ITEM_ACTIVE_CLASS = options.activeClassName;
	this.REQUEST_URL = options.ajaxUrl;
	this.initialize();
}


CrispStudio.Menu.prototype = {

	initialize : function() 
	{
		this.toggleWaiting();
		this.addListeners();		
	},

	addListeners : function()
	{	
		for (var key in this.links)
		{
			CrispStudio.JsUtils.AddEvent(this.links[key], "click", this.loadBlock);
			this.links[key].modelObj = this;
		} 	
	},

	removeListeners : function()
	{
		for (var key in this.links)
		{
			CrispStudio.JsUtils.RemoveEvent(this.links[key], "click", this.loadBlock);
		} 	
	},

	toggleWaiting : function()
	{
	    CrispStudio.JsUtils.Toggle(this.waitingElement);
	},
	

	loadBlock : function(e)
	{
	var selectedElement = CrispStudio.JsUtils.GetEventSrc(e);
	var blockId = selectedElement.id;	
	var modelObj = selectedElement.modelObj; //tricky part!

	modelObj.toggleWaiting();
	modelObj.removeListeners();

	JsHttpRequest.query(
			modelObj.REQUEST_URL,
            {
            	'block_id': blockId
            },
	        function(result, errors) 
			{
				// debug
                modelObj.debugElement.innerHTML = errors; 
                // Write the answer.
                modelObj.placeholderElement.innerHTML = result["html"];
				// setting current active 	
				for (key in modelObj.links)
				{
					modelObj.links[key].parentNode.className = "";
				}
				selectedElement.parentNode.className  = modelObj.MENU_ITEM_ACTIVE_CLASS;
				modelObj.addListeners();
				modelObj.toggleWaiting();
				initLightBoxLight();
            },
			false
        );
	return false;
	}
};

/*
	Search form validation singleton
*/
CrispStudio.PsyolSearchForm = new function() 
{
	this.SEARCH_ID = 'search_phrase';
	this.CheckIfEmptySearch = function()
	{
		if (CrispStudio.JsUtils.$(this.SEARCH_ID).value == '')
		{
			return false; 
		}
		else
		{
			return true;
		}
	}
}

/* 
	Adding onLoad event with Constructor
*/
CrispStudio.JsUtils.AddLoadEvent(function () 
	{
	var menuOptions = {
		className		: 'submenu_click',
		waitingId		: 'waiting',
		debugId			: 'debug',
		placeholderId	: 'placeholder',
		activeClassName	: 'current_submenu',
		ajaxUrl			: '/blocks.php'
	};
    var currentMenu = new CrispStudio.Menu(menuOptions);
	})


