/* Bilboost.com */
/* bilboostcore.js */
/* Created Oct, 2009 */
/* Modified Oct, 2009
--------------------------------------- */

var bilboostCore = {};

bilboostCore.bilboost = new Class({
        Implements: [Options, Events],
		
		initialize: function(options){}
});
	
bilboostCore.appCore = new Class({
        Extends: bilboostCore.bilboost,
		
		ajaxCallsClass : null,
		ajaxCallsClassWaiter : [],
		flashUploadsClass : null,
		flashUploadsClassWaiter : [],
		cfid : null,
		cftoken : null,
		urlToken : "",
		
		language : null,
		messages : null,
		facebook : null,
		twitter : null,		
		layer : null,
		
		baseurl : null,
		pageActions : null,
		
		classes : {},
		
		initialize: function(options){},
		
		setup : function(){
			this.layer = new bilboostCore.layer();
			this.messages = new bilboostCore.messages();
			this.facebook = new bilboostCore.facebook();
			this.twitter = new bilboostCore.twitter();
				
			this.urlToken = "&cftoken="+this.cftoken+"&cfid="+this.cfid;			
			this.pageActions = new bilboostCore.pageActions();

    		//this.__defineGetter__("ajaxCalls", this.getAjaxCalls);
			//this.__defineGetter__("flashUploads", this.getFlashUploads);
			
			this.ajaxCalls.baseClass = this;
			this.flashUploads.baseClass = this;
		},
		
		ajaxCalls : {
			baseClass : null,
			
			newCFComponentRequest : function(params){
				if (this.baseClass.ajaxCallsClass == null){
					this.baseClass.ajaxCallsClassWaiter.push(params);
					new Asset.javascript("/resources/js/com/bilboost/utils/ajaxCalls.js", {
					onLoad: function(){
							this.baseClass.ajaxCalls = new bilboostCore.ajaxCalls();
							if(this.baseClass.ajaxCallsClassWaiter.length > 0){
								this.baseClass.ajaxCallsClassWaiter.each(function(params){
									appCore.ajaxCalls.newCFComponentRequest(params)
								});
								this.ajaxCallsClassWaiter = [];
							}
						}.bind(this)									
					});
				}
			}		
		},
		
		flashUploads : {
			baseClass : null,
			
			addFlashToDiv : function(param1,param2){
				if (this.baseClass.flashUploadsClass == null){
					this.baseClass.flashUploadsClassWaiter.push([param1,param2]);
					new Asset.javascript("/resources/js/com/bilboost/utils/flashUploads.js", {
					onLoad: function(){
							this.baseClass.flashUploads = new bilboostCore.flashUploads();
							if(this.baseClass.flashUploadsClassWaiter.length > 0){
								this.baseClass.flashUploadsClassWaiter.each(function(params){
									appCore.flashUploads.addFlashToDiv(params[0],params[1])
								});
								this.flashUploadsClassWaiter = [];
							}
						}.bind(this)									
					});
				}
			}
		},
		
		getCFid : function(){
			return this.cfid;
		},
		
		getCFtoken : function(){
			return this.cftoken;
		},
		
		getBaseURL : function(){
			if(this.baseurl != null)
				return this.baseurl;
				
			var data = ""; 
			var URLRequest = new Request.JSON({ onComplete:function(response){data = response;},url: "/com/bilboost/utils/fileNames.cfc?returnformat=json&method=baseURL", noCache : true, async : false}).send();
			this.baseurl = data;
			return data;
		},
		
		getUniqueFileName : function(){
			var data = ""; 
			var filenameRequest = new Request.JSON({ onComplete:function(response){data = response;},url: "/com/bilboost/utils/fileNames.cfc?returnformat=json&method=uniqueFileName", noCache : true, async : false}).send();
			return data;
		},
		
		getURLVariable : function(){
			
		},
		
		tween : function(element, time, property, value, transition){
			if(transition == undefined)
				var effect = Fx.Transitions.Quad.easeOut;
			else
				 var effect = transition;
				 
			element.set("tween",{duration: time, transition: effect});
			element.tween(property, value);
			
			return element.get("tween");
		}		
});

bilboostCore.pageActions = new Class({
	Extends : bilboostCore.bilboost,
	
	loginLayer : null,
	loginOpened : false,
	
	initialize : function(){
		
		this.loginLayer = $("loginLayer");
		if($("header_btnLogin")) $("header_btnLogin").addEvent("click",this.toggleLogin.bind(this));
		if ($("footer_btnLogin")) {
			$("footer_btnLogin").addEvent("click", function(e){
				e.preventDefault();
				this.scrollToTopAndShowLogin();
			}.bind(this));
		}
		if($("headerLayer_btnClose")) $("headerLayer_btnClose").addEvent("click",this.closeLogin.bind(this));
		if($("headerLayer_btnLogin")) $("headerLayer_btnLogin").addEvent("click",this.login.bind(this));
		if($("headerLayer_loginForm")) $("headerLayer_loginForm").addEvent("submit",function(e){e.preventDefault()});
	},
	
	toggleLogin : function(e){
		e.preventDefault();
		if(this.loginOpened == false){
			this.openLogin();
		}else{					
			this.closeLogin();
		}
	},	
	
	openLogin : function(){
		this.loginOpened = true;
		this.loginLayer.setStyle("opacity",0);
		this.loginLayer.setStyle("display","block");
		var closeTween = appCore.tween(this.loginLayer,700,"opacity",1);
		closeTween.removeEvents();
	},
	
	closeLogin : function(){
		this.loginOpened = false;
		var closeTween = appCore.tween(this.loginLayer,400,"opacity",0);
		closeTween.addEvent("complete",function(){
			this.loginLayer.setStyle("display","none");
		}.bind(this));
	},
	
	scrollToTopAndShowLogin : function(e){
		new Fx.Scroll(window).toTop().chain(function(){
			this.openLogin();
		}.bind(this));
	},
	
	login : function(){
		appCore.layer.showLoadingLayer();
		
		var params = {};
        params.component = "application.login";
        params.method = "loginUser";
        params.onComplete = this.loginDone.bind(this);
		params.isPublic = true;
        params.variables = {
			"email" : $("headerLayer_loginForm").getElement("input[name='login_email']").get("value"),
			"password" : $("headerLayer_loginForm").getElement("input[name='login_password']").get("value")
		};
        		
        appCore.ajaxCalls.newCFComponentRequest(params);
   	},
	
	loginDone : function(result){
		if(result == true){
			window.location.reload();
		}else{
			appCore.layer.clearContent();
			if(appCore.language == "es")
				appCore.messages.show("customizedTell","Datos de acceso incorrectos,","Corrígelos y vuelve a intentarlo.",appCore.layer.hide.bind(appCore.layer));
			else
				appCore.messages.show("customizedTell","Wrong login details,","Correct, and try again.",appCore.layer.hide.bind(appCore.layer));
		}		
	}
	
});

bilboostCore.layer = new Class({
		
	layerArea : null,
	bg : null,
	content : null,
	closer : null,
	
	initialize : function(){},
	
	setup : function(){
		this.layerArea = new Element("div",{"class":"layerArea"});
		this.layerArea.setStyle("display","none");
		
		this.bg = new Element("div",{"class":"bg"});
		this.bg.inject(this.layerArea);
		this.bg.addEvent("click",this.closeFromBg.bind(this));
		
		this.layerArea.inject($(document.body),"top");
		
		window.addEvent("resize",this.resize.bind(this));
	},
	
	show : function(){
		if(this.layerArea == null){
			this.setup();
		}
		
		if(this.content != null) this.content.dispose();
			
		this.layerArea.setStyle("display","block");
	
		var position = $(document.body).getScroll().y;
		$(document.body).setStyle("overflow-y","hidden");
		$(document.body).setStyle("margin-top",-position);
		$(document.body).setStyle("height",$(window).getSize().y+position);
	},
	
	hide : function(){
		var position = $(document.body).getStyle("margin-top").split("px")[0];
		$(document.body).setStyle("overflow-y","visible");
		$(document.body).setStyle("margin-top",0);
		window.scrollBy(0,-Number(position));
		$(document.body).setStyle("height","auto");
		
		this.clearContent();
			
		this.layerArea.setStyle("display","none");
		
		this.bg.removeClass("black");
	},
	
	resize : function(){
		if(this.content == null)
			return;
		var element = this.content.getChildren()[1];
		
		if(element == undefined)
			return;
	
		var dimensions = element.getCoordinates();
		element.setStyle("margin-top",-Math.round(dimensions.height/2));
		element.setStyle("margin-left",-Math.round(dimensions.width/2));
		
		if(this.closer != null){
			this.closer.setStyle("top",-dimensions.height/2);
			this.closer.setStyle("left",dimensions.width/2);
		}
			
	},
	
	addContent : function(element){
		if(this.content != null) this.content.dispose();
			
		this.content = new Element("div",{"class":"content"});
		this.content.inject(this.layerArea,"bottom");
		
		element.inject(this.content);
		
		var dimensions = element.getCoordinates();
		element.setStyle("margin-top",-Math.round(dimensions.height/2));
		element.setStyle("margin-left",-Math.round(dimensions.width/2));
		
		window.addEvent("resize",function(){
			var dimensions =element.getCoordinates();
			element.setStyle("margin-top",-Math.round(dimensions.height/2));
			element.setStyle("margin-left",-Math.round(dimensions.width/2));
		}.bind(this));
	},
	
	clearContent : function(){
		if(this.content != null) this.content.dispose();
		if(this.closer != null) this.closer.dispose();
	},
	
	addCloser : function(){
		if(this.closer != null) this.closer.dispose();
			
		this.closer = new Element("div",{"class":"closer"});
		this.closer.inject(this.content,"top");

		this.closer.addEvent("click",this.hideLayer.bind(this));
		
		this.resize();
	},
	
	closeFromBg : function(){
		if(this.closer != null)
			this.hide();
	},
	
	showLayer : function(){			
		this.show();
	},
	
	hideLayer : function(){
		if(this.content != null) this.content.dispose();
		if(this.closer != null) this.closer.dispose();	
		this.hide();
	},
	
	showLoadingLayer : function(){
		this.show();
		var loader = new Element("div",{"class":"loader"});
		var loaderImg = new Element("img",{"src":"/resources/images/common/loaders/layer_loader.gif"});
		loaderImg.inject(loader);
		this.addContent(loader);
	},
	
	setBlack : function(){
		this.bg.addClass("black");
	}
	
});

bilboostCore.messages = new Class({
	
	messagesLoaded : false,
	messagesClassWaiter : [],
	loading : false,
	
	initialize : function(){
		
	},
	
	loadMessagesJs : function(){
		new Asset.javascript("/resources/js/messages/message-"+appCore.language+".js", {
			onLoad: function(){
				this.messagesLoaded = true;
				if(this.messagesClassWaiter.length > 0){
					this.messagesClassWaiter.each(function(params){
						this.show(params[0],params[1],params[2],params[3],params[4]);
					}.bind(this));
					this.messagesClassWaiter = [];
				}
			}.bind(this)									
		});
	},
	
	loadMessagesCss : function(){
		new Asset.css("/resources/js/messages/message.css");
	},
	
	show : function(type, title, message, callback, nokcallback){
		if(this.messagesLoaded == false){
			this.messagesClassWaiter.push(this.$caller.arguments);
			if (this.loading == false) {
				this.loadMessagesCss();
				this.loadMessagesJs();
				this.loading = true;
			}
			return;
		}		
		
		if(callback == undefined)
			callback = function(){};
		if(nokcallback == undefined)
			nokcallback = function(){};
			
		if (this.messages == null) {
			this.messages = {};
			
			this.messages.enviando = new Message({
				iconPath: "/resources/js/messages/images/",
				icon: "blackWaiter.gif",
				title: "Un segundo...",
				message: "...estamos enviando el mensaje...",
				centered: true
			});
			
			this.messages.formError = new Message({
				iconPath: "/resources/js/messages/images/",
				icon: "cautionMedium.png",
				title: "Hay errores el formulario",
				message: "Revisa los campos en rojo.",
				centered: true,
				autoDismiss : true
			});
			
			this.messages.sendingError = new Message({
				iconPath: "/resources/js/messages/images/",
				icon: "cautionMedium.png",
				title: "No hemos podido enviar el mensaje",
				message: "Intentalo más tarde.",
				centered: true
			});
			
			this.messages.sendingOk = new Message({
				iconPath: "/resources/js/messages/images/",
				icon: "cautionMedium.png",
				title: "¡Mensaje enviado!",
				message: "Muchas gracias.",
				centered: true
			});
			
			//provides: [Message.say, Message.tell, Message.ask, Message.waiter, Messate.tip]
		}
			
		if(type == "customizedTell"){
			this.messages.customizedTell = new Message({
				iconPath: "/resources/js/messages/images/",
				icon: "cautionMedium.png",
				"title": title,
				"message": message,
				centered: true,
				"onComplete":callback
			});
		}else if(type == "customizedSay"){
			this.messages.customizedSay = new Message({
				iconPath: "/resources/js/messages/images/",
				icon: "cautionMedium.png",
				"title": title,
				"message": message,
				centered: true,
				autoDismiss : true
			});
		}else if(type == "customizedWaiter"){
			this.messages.customizedWaiter = new Message({
				iconPath: "/resources/js/messages/images/",
				icon: "blackWaiter.gif",
				"title": title,
				"message": message,
				centered: true
			});
		}else if(type == "customizedAsk"){
			this.messages.customizedAsk = new Message({
				iconPath: "/resources/js/messages/images/",
				icon: "cautionMedium.png",
				"title": title,
				"message": message,
				centered: true,
				"callback":callback,
				"nokcallback":nokcallback
			});
		}
		
		var message;
				
		switch(type){
			case "enviando" : message = this.messages.enviando; message.waiter(); break;
			case "formError" : message = this.messages.formError; message.say(); break;
			case "sendingError" : message = this.messages.sendingError; message.tell(); break;
			case "sendingOk" : message = this.messages.sendingOk; message.tell(); break;
			case "customizedTell" : message = this.messages.customizedTell; message.tell(); break;
			case "customizedSay" : message = this.messages.customizedSay; message.say(); break;
			case "customizedWaiter" : message = this.messages.customizedWaiter; message.waiter(); break;
			case "customizedAsk" : message = this.messages.customizedAsk; message.ask(); break;
		}
		
		return message;
	},
	
	hide : function(message){
		message.dismiss();
	}
});

bilboostCore.facebook = new Class({
	
	//admits registering "fbload" event
	fbLoaded : false,
	fbRoot : null,
	
	initialize : function(){
		this.fbRoot = new Element("div",{"id":"fb-root"});
		this.fbRoot.inject($(document.body),"top");
		//window.fbAsyncInit = this.facebookLoaded.bind(this);
		//this.loadFB(document);
		this.facebookLoaded.delay(300,this);
	},
	
	loadFB : function(d){
		var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
     	js = d.createElement('script'); js.id = id; js.async = true;
    	if(appCore.language == "es")
			js.src = "//connect.facebook.net/es_LA/all.js";
    	else
			js.src = "//connect.facebook.net/en_US/all.js";
		d.getElementsByTagName('head')[0].appendChild(js);
	},
	
	facebookLoaded : function(){
		FB.init({
	      appId      : '288979054446354',
	      channelURL : 'http://www.bilboost.com/includes/tags/common/facebook/channel.html',
	      status     : true,
	      cookie     : true,
	      oauth      : true,
	      xfbml      : true
	    });

		window.fireEvent("fbload");
	},
	
	startComments : function(){		
		new Asset.css("/resources/styles/common/fbcomments.css");
		
		FB.Event.subscribe('comment.create', function(response) {
		  this.updateComments(1);
		}.bind(this));
		
		FB.Event.subscribe('comment.remove', function(response) {
		  this.updateComments(-1);
		}.bind(this));
	},
	
	updateComments : function(update){
		var counter = $("fbComments").getElement(".fb_comments_count");
		counter.set("html",Number(counter.get("html")) + update);
	},
	
	showFeedDialog : function(title,url,picture,description){
		appCore.layer.show();
		FB.ui(
			{
	         	"method" : 'feed',
	          	"name" : title,
	          	"link" : url,
			  	"picture" : picture,
			  	"description" : description
	        },
			function(response) {
				if (response && response.post_id) {
			    	appCore.layer.hide();		
			    }else{
			  		appCore.layer.hide();		
			  	}
			}
		);
	}
});

bilboostCore.twitter = new Class({
	
	twitterLoaded : false,
	
	initialize : function(){
		//new Asset.javascript("//platform.twitter.com/widgets.js");
	}
});



var appCore  = new bilboostCore.appCore();
window.addEvent("domready",function(){appCore.setup()});
