var FDR = {
	AJAXCommons : function() {},
	FDRInputTextClearer : function() {},
	MetricsTracker : function() {},
	ArraySearch : function() {},
	ABTesting : function() {},
	Cookies : function() {}
};


/*
 * Cookie management
 */

FDR.Cookies.setCookie = function(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

FDR.Cookies.getCookie = function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

/* 
 * Commons AJAX Execution logic.  Pass in the url that will
 * servce your reques, paramete and a callbakc function that
 * expects the response as the parameter
 */
FDR.AJAXCommons.prototype.callGET = function(serviceURL, getParams, callback) {
	var geturl = serviceURL ;
	$.get(geturl, getParams,	
					function(response) {
						if (response != null && callback != null) {
							try  {
								callback(eval('(' + response + ')' ));
							} catch(err) {
							}
										
						}
					});
}
FDR.AJAXCommons.prototype.callPOST = function(serviceURL, postParams, callback) {
	var postURL = serviceURL;
	$.post(postURL, postParams,	
					function(response) {
						if (response != null && callback != null) {
							try  {
								callback(eval('(' + response + ')' ));
							} catch(err) {
							}			
						}
					});
}
FDR.AJAXCommons.prototype.convertJSON = function(json) {
	return eval('(' + json + ')' );
}



/* Input Text Clearing Function */
FDR.FDRInputTextClearer = function(inputElement, startingText, displaySettings, changeSettings) {
	this.inputElement = inputElement;
	
	if (this.inputElement) {
		this.startingText = startingText ? startingText : inputElement.val();
		
		this.displaySettings = {
			'color': inputElement.css('color'),
			'fontStyle': inputElement.css('fontStyle'),
			'fontSize': inputElement.css('fontSize'),
			'backgroundColor': inputElement.css('backgroundColor'),
			'border': inputElement.css('border')
		};
		this.changeSettings = {
			'color': '#000',
			'fontStyle': 'normal',
			'fontSize': 'fontSize' in this.displaySettings ? this.displaySettings['fontSize'] : "12px",
			'backgroundColor': '#fff',
			'border': 'border' in this.displaySettings ? this.displaySettings['border'] : "None"
		};
		
		if (displaySettings) {
			for (x in displaySettings) {
				this.displaySettings[x] = displaySettings[x];
			}
		}
		
		if (changeSettings) {
			for (x in changeSettings) {
				this.changeSettings[x] = changeSettings[x];
			}
		}
		this.initialize();
	}
	
}

FDR.FDRInputTextClearer.prototype.initialize = function() {
	if (this.inputElement.val() == "") {
		this.inputElement.val(this.startingText);
		for( x in this.displaySettings ) {
			this.inputElement.css(x, this.displaySettings[x]);
		} 
	}
	
	var self = this;
	
	var clickFunc = function() {
		if( self.inputElement.val() == self.startingText ) {
			self.inputElement.val("");	
		}
		
		for( x in self.changeSettings ) {
			self.inputElement.css(x, self.changeSettings[x]);
		} 
		
		if( self.clickHandler ) {
			self.clickHandler();
		}
	};
	this.inputElement.bind('focus', clickFunc);
	this.inputElement.bind('click', clickFunc);
	
	
	var blurFunc = function() {
		var inputValue = self.inputElement.val();
		if( inputValue == "" || inputValue == self.startingText) {
			self.inputElement.val(self.startingText);
			for( x in self.displaySettings ) {
				if (self.displaySettings[x]) {
					self.inputElement.css(x, self.displaySettings[x]);
				}
			} 
		}
		
		if( self.blurHandler) {
			self.blurHandler();
		}
	};
	this.inputElement.bind('blur.fdrinputtextclear', blurFunc);


	var changeFunc = function() {
		var inputValue = self.inputElement.val();
		if( inputValue != "" && inputValue != self.startingText ) {
			self.inputElement.css('color', '#000');
		} else {
			self.inputElement.css('color', '#c8c8c8');
		}
	}
	this.inputElement.bind("change.fdrinputtextclear", changeFunc)
}

FDR.FDRInputTextClearer.prototype.attachClickHandler = function(func) {
	this.clickHandler = func;
}

FDR.FDRInputTextClearer.prototype.attachBlurHandler = function(func) {
	this.blurHandler = func;
}


/*Common metrics tracker - uses mixpanel*/
/* analytics manager */
FDR.MetricsTracker.prototype.initialize = function() {
	var selfRef = this;
	$('.trackClick').unbind("click.metricstracker");
	$('.trackClick').bind("click.metricstracker", function() {
		var actionName = $(this).attr('trackAction');
		var href = $(this).attr('href');
		var target = $(this).attr('target');
		var redirect = "";
		if( href && href != "#" && !target ) {
			redirect = href;
		}
		
		try {
			var props = {};
			if( selfRef[actionName]) {
				props = selfRef[actionName]();
			}
			selfRef.track(actionName, props, function() {
				if( redirect ) {
					document.location = redirect;	
				}
			});
			
			if( redirect ) {
				event.preventDefault();
				setTimeout(function() {
					document.location = redirect;
				},400);	
			}
			
		} catch(err) {
		}
	});
}

FDR.MetricsTracker.prototype.track = function(actionName, props, postFunc) {
	try {
		mpq.track(actionName, props, postFunc);
	} catch(err) {
	}
}


/* Array Search */
FDR.ArraySearch.prototype.substringSearch = function(list, searchString){
	var newArr = [];
	for( var i in list ) {
		if( list[i].indexOf(searchString) > 0 ) {
			newArr.push(list[i]);
		}
	}	
	return newArr;
}

/*AB Testing Tools */

/* Retrieves a random integer.  However if set, will return the same integer to 
 * allow for consistent experience.  Set to last 7 days.
 * 
 * If cookies don't work, will always return [start].
 */
FDR.ABTesting.prototype.getRandomInt = function(start, end) {
	var randomInt = FDR.Cookies.getCookie("fdr_abt_randint");
	if( !randomInt ) {
		var randomInt = start + Math.floor(Math.random() * (end - start + 1));
		FDR.Cookies.setCookie("fdr_abt_randint", randomInt, 7 );
		randomInt = FDR.Cookies.getCookie("fdr_abt_randint");
	}
	try {
		randomInt = randomInt ? parseInt(randomInt) : start;
	} catch(err) {
		randomInt = start;
	}
	return randomInt;
}





//COMMON PAGE LOAD HANDLER
$(document).bind('ready.fdr_commons', function() {
	FDRMetricsTracker = new FDR.MetricsTracker();
	FDRMetricsTracker.initialize();
	
});
