
/*
 * Copyright (C) 2010/2011 Im-At-Home BV
 * All Rights Reserved
 * No copying, duplication or replication of code permitted without
 * express permission of Im-At-Home BV
 * 
 */

if (typeof console == 'undefined') {
	var console = {
		info: function() {},
		dir: function() {},
		group: function() {},
		groupEnd: function() {}
	};
};

jQuery.fn.sort = function() {  
    return this.pushStack( [].sort.apply( this, arguments ), []);  
}; 

String.prototype.bool = function() {
    return (/^true$/i).test(this);
};

String.prototype.format = function() {
    var s = this;
    if ((s == null) || (s == 'undefined')) return s;
    if (arguments==null) return s;
    var i = arguments.length;
    if (i>0) {
    		while (i--) {
    			s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
    		}
    }
    return s;
};

if(!Array.indexOf){
    Array.prototype.indexOf = function(obj){
        for(var i=0; i<this.length; i++){
            if(this[i]==obj){
                return i;
            }
        }
        return -1;
    };
};

Array.prototype.find = function(searchStr) {
  var returnArray = false;
  for (i=0; i<this.length; i++) {
    if (typeof(searchStr) == 'function') {
      if (searchStr.test(this[i])) {
        if (!returnArray) { returnArray = []; }
        returnArray.push(i);
      }
    } else {
      if (this[i]===searchStr) {
        if (!returnArray) { returnArray = []; }
        returnArray.push(i);
      }
    }
  }
  return returnArray;
};

String.prototype.formatArray = function(args) {
    var s = this;
    if ((s == null) || (s == 'undefined')) return s;
    if (args==null) return s;
    var i = args.length;
    if (i>0) {
    		while (i--) {
    			s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), args[i]);
    		}
    }
    return s;
};

App = {};

App.Core = {
		
	redirect : function(type, link) {
		switch(type) {
			case 'direct':
				window.location = link;
			break;
			
			case 'timeout':
				setTimeout(function(){ window.location = link; }, '3000');
			break;
			
			case 'internal':{
				Jobbawok.Core.Nav.changeMenu(link);
				break;
			}
			
			default:
				return;
			break;
		}		
	}
		
};

App.Core.Nav = {
		
	hasInit : false,
	selectedmenu : '/',
	navOptions : new Hashtable(),
	
	__preinit : function() {

		if (this.hasInit) return;
		this.hasInit = true;

		$('.navoption').live('click', function(oEvent) { App.Core.Nav.mainMenu(oEvent); });

	},
		
	triggerRefresh : function() {
		var oData = { 'event': 'manual' };
		$('*').trigger('page-refresh', oData);
	},
	
	mainMenu : function(oEvent) {
		if ($(oEvent.currentTarget).hasClass('disabled')) return;
		this.__changeMenu(encodeURI($(oEvent.currentTarget).data('url')), $(oEvent.currentTarget).data('type'), oEvent, false);	
	},

	changeMenu : function(url, force) { 		
		
		if ((force=='undefined') || (force==null)) force=false;		
		if (url=='#') url = this.selectedmenu;
		this.__changeMenu(url, 'menu', null, force);
		
	},
	
	__loadNav : function(target, url) {
		
		if (target==null) return;
		console.info('Loading subnavigation for url '+ url);
		
		$(target).html(''); // target is expected to be a ul construct !!
		
		var data = this.navOptions.get(url);

		if (data == null) {		
			$.ajax({
				type: "get",
				dataType: "text",										// we get this as text as otherwise cant do comparison
				error: function(data) {
					App.Core.Nav.__recoverFailed(data, target);
				},
				success: function(data) {
					App.Core.Nav.navOptions.add(url, data);
					App.Core.Nav.__processJsonData(data, target);
				},				
				url:'/json/getsubnav?url='+url, 
				data:{}
			});		
		} else {
			App.Core.Nav.__processJsonData(data, target);
		}
		
	},
	
	__recoverFailed : function(datain, target) {
		
		if ((target==null) || (datain==null)) return;
		
	},
	
	__processJsonData : function(datain, target) {
		
		if ((target==null) || (datain==null)) return;
		
		var menuItems = jQuery.parseJSON(datain);
		
		if ((menuItems != null) && (menuItems.length > 0)) {
			var oHtml = '';
			for (var counter=0; counter<menuItems.length; counter++) {			
				if (this.selectedmenu == menuItems[counter].url) {
					oHtml += '<li class="menuitem selected" data-url="' + menuItems[counter].url + '">';
					if ((menuItems[counter].image != null) && (menuItems[counter].image != '')) {
						oHtml += '<img src="' + menuItems[counter].image + '" />';
					}
					oHtml += menuItems[counter].display + '</li>';
				} else {
					oHtml += '<li class="menuitem '+ menuItems[counter].display.toLowerCase() +'" data-url="' + menuItems[counter].url + '">';
					if ((menuItems[counter].image != null) && (menuItems[counter].image != '')) {
						oHtml += '<img src="' + menuItems[counter].image + '" />';
					}
					oHtml += menuItems[counter].display + '</li>';					
				}
			}
			$(target).html(oHtml);
		}
		
	},
	
	__changeMenu : function(url, eventtype, oEvent, force) {
		
		if (url[0]=='$') {
			var target = null;
			url = url.substring(1);
			if (oEvent != null) {
				target = $(oEvent.currentTarget).data('target');
				if ((target == null) || (target=='undefined')) target = null;
				if (target != null) {
					window.open(url);
				} else {
					window.location = url;					
				}
			} else {
				window.location = url;
			}			
		} else if (url[0]=='#') {	
			
			var oData = { 'url': url.substring(1), 'object': $(oEvent.currentTarget) };
			$('*').triggerHandler('do-dialog', oData);					
			
		} else {

			if ((url != this.selectedmenu) || force) {

				switch (eventtype) {
				
					case 'menu': {
						
						// load submenu's !!
						
						break;
					}
				
					case 'nav' : {
							
						var abort = false;
						
						$('#content_body .inner').load(url, function() {
							console.info('switching page to '+url);
							var oData = { 'from_url': this.selectedmenu, 'to_url': url, 'event': 'auto' };
							abort = $('*').triggerHandler('page-refresh', oData);
							abort = ((abort == 'undefined') || (abort == null)) ? false : !abort;					
						});						
						
						if (abort) {
							console.info('Aborting change page request...');
							return; // this was aborted !!
						}
						
						break;
					}
					
				}
			
				this.selectedmenu = url;
												
				$('.menuitem.selected').each(function() {
					$(this).removeClass('selected');
				});
				
				if (oEvent != null) {
					$(oEvent.currentTarget).addClass('selected');
				} else {
					var menuitems = $('.menuitem');
					if (menuitems.length > 0) {
						var counter = 0;
						do {
							if ($(menuitems[counter]).data('rel')==url) {
								$(menuitems[counter]).addClass('selected');
								break;
							}
						} while (++counter < menuitems.length);						
					}					
				}	
				
			}
			
		}			
		
	}
		
};

App.Core.Service = {
	
	gateway :'/gateway/process/'
	
};

App.Core.Application = {
	
	hasInit : false,
	
	__preinit : function(){
		
		if (this.hasInit) return;
		this.hasInit = true;
		
		$('[data-event]').live('click', function(oEvent){ App.Core.Application.handleEvent(oEvent); });
		
	},
	
	handleEvent : function(oEvent) {
		var oElement = oEvent.currentTarget;
		
		if (!oElement.getAttribute('data-event')) return;
		
		var attr = oElement.getAttribute('data-event');
		var oArgs = eval('(' + attr + ')');
		
		if (typeof oEvent != 'undefined') {
				
			if (typeof App[oArgs.action][oArgs.event] == 'function') {
				
				App[oArgs.action][oArgs.event](oElement, oArgs.args);
				
			} else {
				
				console.info('No function found!');
				
			}
		}
	},
	
	appHandler : function(elem, oRequest){
		var msgBox = $('#'+ elem).find('.msg_box');
		
		var handleResponse = function(oData) {
			if(oData != null){
				if(oData.status == true) {
					if(typeof oData.action != 'undefined') {
						var oArgs = (oData.args != null) ? oData.args : '';
						App[oData.action][oData.event](oArgs);
					} else {
						$(msgBox).hide().removeClass('false').addClass('true').html(oData.message).fadeIn('fast');
						if ((typeof oData.link != null) && (typeof oData.link != 'undefined')) App.UI.redirect('timeout', oData.link);
					}
				}
				
				if (oData.status == false) {
					$(msgBox).hide().removeClass('true').addClass('false').html(oData.message).fadeIn('fast');
					if ((typeof oData.link != null) && (typeof oData.link != 'undefined')) App.UI.redirect('timeout', oData.link);
				}
			}
		};
		
		$.post(App.Core.Service.gateway, {request: $.toJSON(oRequest)}, handleResponse, 'json');
		
	}
	
};


$(document).ready(function() {
	
	App.Core.Nav.__preinit();
	App.Core.Application.__preinit();
	
});
