//// UTIL

function normalizeObjectArray(dataArray, key){
	var normalizedData = {};
	for(var i = 0; i < dataArray.length; i++){
		var obj = dataArray[i];
		normalizedData[obj[key]] = obj;
	}

	return normalizedData;
}

//// UNIVERSAL CLASSES

var UniversalRequest = new Class({
	flag : function(type, id){
		path = "/php/obj.entity.request.php?flag_action=flag&type=" + type + "&id=" + id;
		var ajiz = new AJAXClosure(path, function(response){alert(response);});
		ajiz.doGet();
	},

	setBmark : function(type, id){
		path = "/php/obj.entity.request.php?bmark_action=set&type=" + type + "&bm_id=" + id;
		var ajiz = new AJAXClosure(path, function(response){alert(response);});
		ajiz.doGet();
	},

	removeBmark : function(type, bookmark_id, bAlert){
		path = "/php/obj.entity.request.php?bmark_action=remove_gen&type=" + type + "&bm_id=" + bookmark_id;
		var ajiz = new AJAXClosure(path, function(response){
			if(bAlert){	alert(response); }
		});
		ajiz.doGet();
	}
});

var RelationshipRequest = new Class({
	getForm : function(action, req_who){		
		path = '/php/obj.entity.request.php?req_action=' + action + '&friend_id=' + req_who;
		var ajiz = new AJAXClosure(path, function(response){ gMd.fill(response);});	
		ajiz.doGet();
	},
	
	make : function(action, friend_id, msg){
		path = '/php/obj.entity.request.php?req_action=' + action + '&friend_id=' + friend_id + '&msg=' + msg;
		var ajiz = new AJAXClosure(path, function(response){gMd.fill(response); setTimeout(gMd.close.bind(gMd), 900);});	
		ajiz.doGet();
	},
	
	respond : function(action, friend_id, rel_id, feed_el){
		feed_id = feed_el.getAttribute('indicatorId');
		path = '/php/obj.entity.request.php?req_action=' + action + '&rel_id=' + rel_id + '&feed_id=' + feed_id + '&friend_id=' + friend_id;
		var ajiz = new AJAXClosure(path, function(response){ 
			if(response == 1){
				feed_el.parentNode.removeChild(feed_el);
			}
			
			else{
				feed_el.innerHTML = response;
			}
		});	
		ajiz.doGet();
	},

	endFriend : function(friend_id, bAlert){
		path = '/php/obj.entity.request.php?req_action=endfriend&friend_id=' + friend_id;
		var ajiz = new AJAXClosure(path, function(response){ if(bAlert) alert(response);});	
		ajiz.doGet();
	}
});

var FeedbackClass = new Class({   
	basepath : '/php/obj.entity.request.php?',

	suggest : function(input_id, submit_button_id){
		var action = 'suggest';
		var suggestion = $(input_id).value;
		var path = this.basepath + 'sug_action=' + action + '&suggestion=' + suggestion;
		
		// GET CLOSURE & SEND REQUEST
		var ajiz = new AJAXClosure(path, function(){});
		ajiz.doGet();
		
		$(submit_button_id).value = "Thanks!";
		setTimeout(function(){gMd.close();}, 1000);
	},

	suggestPop : function(){	
		// AJAX >> GET THE FORM
		var action = 'getForm';
		var path = this.basepath + 'sug_action=' + action;
			
		// GET CLOSURE & SEND REQUEST
		var ajiz = new AJAXClosure(path, function(response){ gMd.fill(response);});	
		ajiz.doGet();
	},

	recommend : function(input_id){
		var action = 'recommend';
		var input = $(input_id);
		var to = input.value;
		var path = this.basepath + 'sug_action=' + action + '&to=' + to;
		
		input.value = '';
		input.focus();
		
		// GET CLOSURE & SEND REQUEST
		var ajiz = new AJAXClosure(path, function(response){alert(response);});
		ajiz.doGet();
	}
});

var Debug = new Class({
	// DEBUG LEVEL
	level : 0,
	
	// LOGGING MODE
	bToScreen : false,
	bToConsole : false,
	
	// SETTERS
	setLevel 		: function(x) { this.level = x; },
	toggleScreen 	: function(b) { this.bToScreen = b; },
	toggleConsole 	: function(b) { this.bToConsole = b; },
	
	// DISPLAY ALERT TO SCREEN
	log : function(importance, message){
		if(this.level >= importance){
			if(this.bToScreen){ 
				alert(message);
			}

			if(this.bToConsole){
				console.log(message);
			}
		}
	}
 });
 
var gDom = {
	newDiv : function(gprops, props){
		var div = new Element('div', props);
		div.innerHTML = gprops.content;
	
		return div;
	},
	
	newCheck : function(gprops, props){
		props.type = "checkbox";
		
		var wrap = new Element('div');
		var input = new Element('input', props);
		input.addClass("check left");
		var label = new Element('label', {"for" : props.id});
		
		label.innerHTML = gprops.label;
		
		wrap.appendChild(input);
		wrap.appendChild(label);
		wrap.check = input;
	
		return wrap;
	},

	newLoadingGif : function(){
		return new Element( 'img', { 'alt' : 'RF', 'src' : 'images/Icons/icon.loader-1.gif', 'class' : 'marged' } );
	},
	
	getClearer : function(){
		return '<div class="clearer">&nbsp;</div>';
	},
	
	getClearerNode : function(){
		return new Element( 'div', { 'class' : 'clearer' } ).setHTML('&nbsp;');
	}
};

//// DEBUGGING
var err = new Debug();
err.setLevel(15);
err.toggleScreen(false);
err.toggleConsole(false);

var gMd		 	= null;
var mc 			= new UniversalRequest();
var feedback	= new FeedbackClass();
var req 		= new RelationshipRequest();

window.addEvent("domready", function(){ 
	//var s = new SmoothScroll(); 
	
	//gMd = new ModalDialogPlus( 'box_dialog' );
});

////KILL SOON
  
function AJAXClosure(url, callback, bXML) {
	var req = init();
	req.onreadystatechange = processRequest;
		
	function init() {
	  if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	  } else if (window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	  }
	}
	
	function processRequest () {
		if (req.readyState == 4 && req.status == 200 && callback){
			if(bXML){
				callback(req.responseXML);
			}
			else{
				callback(req.responseText);
			}
		}
	}

	this.doGet = function() {
	  req.open("GET", url, true);
	  req.send(null);
	};
	
	this.doPost = function(body) {
	  req.open("POST", url, true);
	  req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	  req.send(body);
	};
}
