// **************************
//	GLOBAL JAVASCRIPT YO
// **************************


// Firebug Debug
if (!("console" in window) || !("firebug" in console)) {
   var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group",
     "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"
   ];
   window.console = {};
   for (var i = 0; i < names.length; ++i) {
   	window.console[names[i]] = function() {};
   }
}

// **************************
//	DEFAULT TEXT ON INPUT TEXT
// **************************
function treatTextFields(inputfield, text) {
		$(inputfield);
		if (inputfield.value == '' || inputfield.value ==  text) {
			inputfield.style.color = '#777777';
			inputfield.value = text;
		}
		inputfield.addEvent('click', function(){
				if (inputfield.value == text) {
					inputfield.style.color = '#000000';
					inputfield.value = '';
				}
			});
		inputfield.addEvent('blur', function(){
				if (inputfield.value == '') {
					inputfield.style.color = '#777777';
					inputfield.value = text;
				}
			});
}

/* Cycles through text fields with class 'defaultText' */
function setDefaultSearchText() {
	var textfields = $$('input.defaultText');
	if (textfields) {
		for (var i=0; i < textfields.length; i++) {
			var defaulttext = textfields[i].getProperty('rel');		
			treatTextFields(textfields[i], defaulttext);
		}
	}
}



// **************************
//	SEND TO A FRIEND
//
//  Dear Friend,
//  I know there's a better way of doing alot of the javascript
//  you find in here. But it's late, I've been working 15 hour days
//  everyday for the last 28 days and I am buggered.
//
// **************************
// Functions to test strings against RE for form validation
function isRequired(field) {if (field.test(/[^.*]/)) return true;}
function isEmail(field) {if (field.test(/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i)) return true;}

// Inserts error styling into Send to Friend form
function insertSendFormError(field) {
	field.addClass('error');
	field.getPrevious().addClass('on');
	field.getPrevious().getPrevious().addClass('error');
}

// Removes error styling into Send to Friend form
function removeSendFormError(field) {
	field.removeClass('error');
	field.getPrevious().removeClass('on');
	field.getPrevious().getPrevious().removeClass('error');
}

// Validate function for required fields
function validateRequired(value, field) {
	if (isRequired(value)) {
		removeSendFormError(field);return true;
	} else {
		insertSendFormError(field);return false;
	}
}

// Validate function for email fields
function validateEmail(value, field) {
	if (isEmail(value)) {
		removeSendFormError(field);
		return true;
	} else {
		insertSendFormError(field);
		return false;
	}
}


// Submit Function on Send to Friend forms
function submitSendToFriend(type) {
	// form is true unless proven otherwise...
	var formvalid = true;

	// Define elements
	// var form = $('TB_window').getElement('form#sendForm');
	// var replaceme = $('TB_window').getElement('div#sendToFriend'); // area to replace with ajax
	
	if (type == 'playlist') {
		var popup = $('TB_window');
		var form = popup.getElement('form.ie6hook-sendForm');
		var replaceme = popup.getElement('div.ie6hook-sendToFriend'); // area to replace with ajax
	} else {
		var form = $('sendForm');
		var replaceme = $('sendToFriend'); // area to replace with ajax
	}
	
	// Get form fields
	var ynamefield = $(form.yourName);
	var yemailfield = $(form.yourEmail);
	var fnamefield = $(form.friendName);
	var femailfield = $(form.friendEmail);
	var captchafield = $(form.captchaResponse);
	
	// Get form values
	var yname = ynamefield.value;
	var yemail = yemailfield.value;
	var fname = fnamefield.value;
	var femail = femailfield.value;
	var captcha = captchafield.value;
	
	// If it's a global send to friend, get the url and page names
	if (type == 'global') {
		var urlv = form.url.value;
		var pname = form.pageName.value;
	}
	
	if (type == 'photo') {
		var photourl = $('gallery-share-send').getProperty('rel');
		// console.log(photourl);
		var pname = form.pageName.value;
	}
	
	// Run validation functions
	if (!validateRequired(yname, ynamefield)) formvalid = false;
	if (!validateRequired(fname, fnamefield)) formvalid = false;
	if (!validateEmail(yemail, yemailfield)) formvalid = false;
	if (!validateEmail(femail, femailfield)) formvalid = false;
	if (!validateRequired(captcha, captchafield)) formvalid = false;
	
	if (type == 'global') {
		// Build global send URL
		var sendurl = 'http://'+servername+'/send-to-friend/submit?pageName='+pname+'&url='+urlv+'&yourName='+yname+'&yourEmail='+yemail+'&friendName='+fname+'&friendEmail='+femail+'&captchaResponse='+captcha+'&ajax=true';
		// console.log(sendurl);
	} else if (type == 'playlist') {
		// Build playlist send URL
		var sendurl = 'http://'+servername+'/music/playlists/my-playlists/sendToFriend?yourName='+yname+'&yourEmail='+yemail+'&friendName='+fname+'&friendEmail='+femail+'&captchaResponse='+captcha+'&ajax=true';
	}	else if (type == 'photo') {
		var sendurl = 'http://'+servername+'/send-to-friend/submit?pageName='+pname+'&url='+photourl+'&yourName='+yname+'&yourEmail='+yemail+'&friendName='+fname+'&friendEmail='+femail+'&captchaResponse='+captcha+'&gallery=true&ajax=true';
		// var sendurl = 'http://192.168.1.104/send-to-friend/submit?pageName='+pname+'&url='+photourl+'&yourName='+yname+'&yourEmail='+yemail+'&friendName='+fname+'&friendEmail='+femail+'&gallery=true&ajax=true';
	}
	
	// if form is still valid after all that, run the ajax to submit the form
	if (formvalid) {
		ajaxSendToFriend(sendurl, replaceme);
	// if not valid, add on onkeyup events to fields to validate and display error msgs on fly
	} else {
		ynamefield.addEvent('keyup', function() {if (isRequired(this.value)) removeSendFormError(this);});
		fnamefield.addEvent('keyup', function() {if (isRequired(this.value)) removeSendFormError(this);});
		yemailfield.addEvent('keyup', function() {if (isEmail(this.value)) removeSendFormError(this);});
		femailfield.addEvent('keyup', function() {if (isEmail(this.value)) removeSendFormError(this);});
		captchafield.addEvent('keyup', function() {if (isRequired(this.value)) removeSendFormError(this);});
		return false;
	}
}


function ajaxSendToFriend(url, replace) {
	var myAjax = new Ajax(url, {
		method: 'get',
		evalScripts: true,
		getHeader: true,
    	update: replace,
		onRequest:	function(){
						replace.setHTML('<div class="sendLoading">Sending...</div>');
					},
		onComplete:	function(){
						//replace.setStyle('background-image', 'url(\'/images/global/bg_send_success.gif\')')
					}
	});	
	//alert(url);
	myAjax.request();
};

/* Declare variable to keep track of login area */
var loginopen = false;

function initLoginArea() {
	var lu = $('loginUser');
	var lp = $('loginPass');
	var lt = $('loginToggle');
	var lh = $('loginformHolder');
	
	if (lp) {
		lp.addEvent('keydown', function(e){
			if (e.keyCode == 13) {
	            this.getParent().submit();
	            return false;
	        }
		});
	}
	
	if (lt) {
		lt.removeEvents();
		lt.addEvent('click', function(e){	
			// console.log('fire');
			e = new Event(e).stop();
			if (loginopen == false) {
				this.setStyles('background-position:0 -25px; border-bottom:0; border-top:1px solid #cccece; border-left:1px solid #cccece; text-decoration:none');
				this.setText('Close');
				lh.setStyle('display', 'block');
				lu.setStyle('display', 'block');
				lu.focus(); // breaks in IE because element not displayed
				loginopen = true;
			} else {
				this.removeProperty('style');
				this.setText('Login');
				lh.setStyle('display', 'none');
				loginopen = false;
			}
		});
	}
}



// **************************
//	SEARCH FUNCTIONS
// **************************

// Checks if search term is of minimum length of 2 chars (takes search forms)
function isMinSearchLength(el) {
	var field = el.getElement('input[type=text]');
	if (field.value.length > 1) {
		return true;
	} else {
		return false;
	}
}

// Create, position and display search error msg
function displayErrorMsg(form, errmsg, offsetx, offsety, overridex, overridey) {
	// if error message already exists, don't create another
	var emsg = form.getElement('div.renameError');
	if (emsg) return false;
	
	// determine and position msg, using position of text field as base, but also using custom offset/override values if they exist
	var field = form.getElement('input[type=text]');
	if ((overridex > 0) || (overridey > 0)) {
		// console.log('override has values:',overridex,overridey);
		var x = overridex;
		var y = overridey;
	} else {
		var xo = offsetx > 0 ? offsetx : 10;
		var yo = offsety > 0 ? offsety : 53;
		var x = (field.getLeft())-xo;
		var y = (field.getTop())-yo;
	}
	
	// create error message
	var msg = new Element('div', {
		'class':'renameError',
		'styles':{
			'top':y,
			'left':x
		}
	});
	
	// set error message text
	msg.setText(errmsg);

	// inject before search field
	msg.injectBefore(field);
}

// Removes error message from form
function removeErrorMsg(form) {
	var emsg = form.getElements('div.renameError');
	if (emsg) {
		for (var i=0; i < emsg.length; i++) {
			emsg[i].remove();
		}
	}
}


// Removes all error messages
function removeAllErrorMsgs() {
	var emsg = $$('div.renameError');
	if (emsg) {
		for (var i=0; i < emsg.length; i++) {
			emsg[i].remove();
		}
	}
}

// Submit ajaxed search forms
function submitAjaxForm(form) {
	// console.log('fire');
	if (isMinSearchLength(form)) {
		var field = form.getElement('input[type=text]');
		var text = field.value;
		var name = field.getProperty('name');
		var action = form.getProperty('action');
		var update = form.getProperty('rel');
		searchurl = "http://"+servername+action+"?"+name+"="+text+"&ajax=true";
		loadAjaxUrl(searchurl, update, 'search');
	} else {
		displayErrorMsg(form, 'Search terms need to be at least two characters');
	}
}

// Submit standard form if the search term is of appropriate length
function submitForm(form) {
	// console.log('fire');
	if (isMinSearchLength(form)) {
		removeErrorMsg(form);
		form.submit();
	} else {
		displayErrorMsg(form, 'Search terms need to be at least two characters');
	}
}

// Initialise standard forms (like the artist search on artists home)
function initSubmitForms() {
	var f = $$('form.stdSubmit');
	if (f) {
		for (var i=0; i < f.length; i++) {
			// console.log('event added',f[i]);
			f[i].removeEvents();
			f[i].addEvent('submit', function(e){
				e = new Event(e).stop();
				submitForm(this);
			});
		}
	}

}

// Initialise ajaxed forms
function initAjaxedSearchForms() {
	var f = $$('form.ajaxSubmit');
	if (f) {
		for (var i=0; i < f.length; i++) {
			f[i].removeEvents();
			f[i].addEvent('submit', function(e){
				e = new Event(e).stop();
				submitAjaxForm(this);
			});
		}
	}
}

// Takes url and appends ajax=true
function createAjaxUrl(url) {
	if (url.contains('?')){
		url = url+"&ajax=true";
	} else {
		url = url+"?ajax=true";
	}
	return url;
}

// Takes a group of links adds onclick events to loadAjaxUrl to them
function createHijaxLinks(linkclass, linktype) {
	var links = $$(linkclass);
	for (var i=0; i < links.length; i++) {
		links[i].onclick = function() {
			for (var i=0; i < links.length; i++) {
				links[i].removeClass('current');
			}
			this.addClass('loading');
			url = createAjaxUrl(this.getProperty("href"));
			replace = this.getAttribute("rel");
			loadAjaxUrl(url, replace, linktype);
			return false;
		};
	}
}


// Set dimensions of media player pop-up
var width = 950;
var height = 626;
var posX = 40;
var posY = 40;

// pop out mediaplayer
function popMediaPlayer(key, value) {
    var fileName = "http://" + servername + "/pop-media-player?" + key + "=" + value;
    var specs = "toolbar=0,menubar=0,resizable=0,titlebar=0,status=no,scrollbars=0,location=0,left=" + posX + ",top=" + posY + ",width=" + width + ",height=" + height;
    newwindow = window.open(fileName, "mediaPlayer", specs);
    newwindow.focus();
}

var openMediaPlayer = popMediaPlayer;


// Injects ads into correct positions. Called on window.load.
function injectAds() {
	
	var island = $('hiddenTallIslandAd');
	var lb = $('hiddenLeaderboard');
	
	if (($('adIslandInner')) && ($('hiddenTallIslandAd'))) {
		island.style.visibility = 'visible';
		island.injectInside('adIslandInner');
	}
	
	if (($('leaderboard')) && ($('hiddenLeaderboard'))) {
		lb.style.visibility = 'visible';
		lb.injectInside('leaderboard');
	}
}

function getCookieValue(name) {
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) {
    	var j = i + alen;
    	if (document.cookie.substring(i, j) == arg){
    		return getCookieOffset(j);
    	}
      
    	i = document.cookie.indexOf(" ", i) + 1;
    	if (i == 0){
    		break;
    	}
    }
    return null;
}

function getCookieOffset(offset) {
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1){
		endstr = document.cookie.length;
	}
	return unescape(document.cookie.substring(offset, endstr));
}

function setCookieValue (name, value) {
 	var largeExpDate = new Date ();
	    largeExpDate.setTime(largeExpDate.getTime() + (365 * 24 * 3600 * 1000));
	var path =  null;
    var domain = null;
    var secure = false;
    
    document.cookie = name + "=" + escape (value) + //"; expires=" +
			//largeExpDate.toGMTString() +
            ((path == null) ? "" : ("; path=" + path)) +
            ((domain == null) ? "" : ("; domain=" + domain)) +
            ((secure == true) ? "; secure" : "");
}

// Initialise all global functions
function initGlobal() {
	// Initialise login area
	initLoginArea();
	
	// Set default input field texts
	setDefaultSearchText();
	
	// Init ajaxed search forms
	initAjaxedSearchForms();
	
	// Init standard search forms
	initSubmitForms();
	
	// Removes any existing error messages
	// removeErrorMsg();
	
}


// **************************
//	DOM READY	
// **************************
/* Execute functions when page has loaded */
window.addEvent('domready', function() {
	initGlobal();
});

window.addEvent('load', function() {
	injectAds();
});