
var editDiv = null;
var ie = (document.all) ? true : false;

function windowSize() {
	if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
		return { width : window.innerWidth ,
					 height : window.innerHeight };
	} else if( document.documentElement &&
			   ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		return { width : document.documentElement.clientWidth ,
					 height : document.documentElement.clientHeight };
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		return { width : document.body.clientWidth ,
					 height : document.body.clientHeight };
	}
	return { width : 0, height : 0  };
	
}

var blankPasswordError = cl.Signin.Blank_Password_error
var blankEmailError = cl.Signin.Blank_Email_error
var badEmailFormatError = cl.Signin.Bad_Email_Format_error
var blankPasswordAndEmailError = cl.Signin.Blank_Pw_and_Email_error
var badPasswordError = cl.Signin.Bad_Password_error
var mismatchedPasswordError = cl.Signin.Mismatched_Pw_error

var hexDigits = "0123456789ABCDEF";
var i2x = function(x) { return  hexDigits.substring(x, x+1); } ;

var d2x = function(x) {
    return  i2x(x / 16) + i2x(x % 16);
}

var escapeChar = function(c) {
	return "%" + d2x(c.charCodeAt(0));
};

var escapeParm = function(p) {
	return String(p).replace(/[^-._a-z0-9 ]/gi, escapeChar ).replace(/ /g, "+");
 };

var unescapeChar = function(x) {
	return String.fromCharCode(parseInt(x.substring(1),16)); 
}

var unescapeParm = function(p) {
	return String(p).replace(/\+/g, " ").replace(/%[0-9A-F][0-9A-F]/g, unescapeChar);
};

var parseParms = function(parms) {
   parms = parms.split("&");
   var rv = {};

   for (var i in parms) {
       var p = parms[i].split("=");
	   rv[p[0]] = unescapeParm(p[1]);
   }
   return rv;
};


var parseURL = function(url) {
    url = url.split("?");

	return [ url[0], (url.length > 1) ?  parseParms(url[1]) : {} ];
};

var composeURL = function(url, parms) {
	var sep = (url.indexOf("?") == -1) ? "?" : "&";
	for (var name in parms) {
		url = url + sep + name + "=" + escapeParm(parms[name]);
		sep = "&";
	}
	return url;
}

var updateDict = function(d1, d2) {
	for (var name in d2) {
	    d1[name] = d2[name];
	}
};

var add_to_url = function(url, parms) {
    url = parseURL(url);
	updateDict(url[1], parms);
	return composeURL(url[0], url[1]);
}


var requireAscii = function(s, message) {
	for (var i in s) {
		var c = s.charCodeAt(i);
		if ((c < 32) || (c > 127)) {
			message = message || "You must enter only ASCII characters here";
			alert(message);
			return false;
		}
	}
	return true;
}

var validateSignup = function(email, password, checkEmail, checkPassword, errorNode, joinURL) {
	if (email) {
		if (!password) {
			if (checkPassword) {
				replaceChildNodes(errorNode, blankPasswordError);
			} else {
				window.location = add_to_url(joinURL, { oldusername : email });
			}
			return false;
		} else if (checkPassword && !isLegalPassword(password)) {
			replaceChildNodes(errorNode, badPasswordError);
			return false;
		} else if (checkEmail && !isLegalEmail(email)) {
			if (joinURL) {
				window.location = add_to_url(joinURL,
					{ username : email, error: badEmailFormatError });
			} else {
				replaceChildNodes(errorNode, badEmailFormatError);
			}
			return false;
		}
		return true;
	} else {
		if (checkPassword) {
			if (password) {
				replaceChildNodes(errorNode, blankEmailError);
			} else {
				replaceChildNodes(errorNode, blankPasswordAndEmailError);
			}
		} else if (joinURL) {
			window.location = joinURL;
		}
		return false;
	}
}

var validatePasswordPair = function(password, passwordConfirm) {
	var error = null;
	if (password < ' ') {
		error = blankPasswordError;
	} else if (!isLegalPassword(password)) {
		error = badPasswordError;
	} else if (password != passwordConfirm) {
		error = mismatchedPasswordError;
	}

	if (error) alert(error);
	return !error;
};


function addRadio(frm, n, label) {
    var radio = createInput(frm, "radio");
	radio.name = "editchoice";
	radio.className = "radioInput";
	createText(createElement(frm, 'label'), label);
	return radio;
}

function displayChoicePopup(location, label, choices, choice, submitFcn) {
	dismissEditPopup();
	var frm = makeEditPopup(location, label, null);

	var cDiv = createElement(frm, 'div');
	cDiv.style.marginTop = '30px';
	cDiv.style.marginLeft = '60px';

	var choiceKeys = new Array();

	// Sort by key
	for (var b in choices) {
		choiceKeys.push(b);
	}

	choiceKeys.sort();

	for (var k in choiceKeys) {
		var b = choiceKeys[k];

		aDiv = createElement(cDiv, 'div');
		aDiv.className = 'radiocontainer';
		aDiv.style.width = '180px';
		aDiv.style.height = '40px';
		rad = addRadio(aDiv, b, choices[b]);
		if (b == choice) {
			rad.checked = true;
		}
		else {
			rad.value = b;
			rad.onclick = function () { submitFcn(this.value, location); } ;
		}
	}
	return false;
}

var aliasPattern = /^[-0-9a-z]+$/i
function isLegalAlias(v) {
	return aliasPattern.test(v);
}

var emailPattern = /^[-0-9a-z._+&]+@([-0-9a-z]+\.)+[a-z]{2,6}$/i
function isLegalEmail(v) {
	return emailPattern.test(v);
}

function isLegalEmails(v) {
	v = v.split(",");
	for (var i in v) {
		if (!isLegalEmail(strtrim(v[i]))) {
			return false;
		}
	}
	return true;
}

var isLegalPassword = function(v) {
	for (var i in v) {
		if (v.charCodeAt(i) > 127) {
			return false;
		}
	}
	return true;
};
function displayInvitationPopup(location, label, imageURL, submitFcn, id, offsetX, offsetY) {
	dismissEditPopup();
	var emailDefault = "Enter email to share with friends";
	var messageDefault = "Message (Optional)";
	var frm = makeEditPopup(location, label, imageURL, offsetX, offsetY);
	var emailDiv = createElement(frm, 'div');
	var email = createInput(emailDiv, "text");
	email.id = "popupinviteemail";
	email.name = "address";
	email.value = emailDefault;
	email.className = "def";
	email.tabIndex = "150";
	email.style.margin = "0";
	email.style.cssFloat = "left";
	email.style.styleFloat = "left";
	email.onfocus = function() { clearDefault(this, emailDefault); }

	//email.onchange = email.onkeyup;
	
	var submitDiv = createElement(frm, 'div');
	var submit = createInput(submitDiv, "submit");
	submit.className = "buttonInput";
	submit.style.cssFloat = "right";
	submit.style.styleFloat = "right";
	submit.id = "popupinvitesubmit";
	submit.style.margin = "0 0 0 5px";
	submit.value = "Send";
	submit.tabIndex = "152";
	submit.disabled = false;
	var message = createInput(submitDiv, "text");
	message.id = "popupinvitemessage";
	message.name = "message";
	message.value = messageDefault;
	message.tabIndex = "151";
	message.style.margin = "0";
	message.style.styleFloat = "left";
	message.style.cssFloat = "left";
	message.className = "def";
	message.onfocus = function() { clearDefault(this, messageDefault); }
	submit.onclick = function () {
		if (isLegalEmail(email.value))
		{
			setLiveDefault(message, messageDefault, '');
			submitFcn(email.value,
					message.value,
					id,
					location);
		}
		else
		{
			alert(badEmailFormatError);
		}
		return false;
	}	
	
	
	return false;
}

function dismissEditPopup() {
	if (editDiv) {
		editDiv.style.visibility = "hidden"; 
		containerDiv.style.visibility = "hidden";
		// this is to work around a safari bug - we need to find a better way
		editDiv = null;
	}
	return false;
}


function clearDefault(obj, defaultValue) {
  if (obj.value == defaultValue) {
	obj.value = '';
  	obj.className = 'notdef';
  }
}

function clearDef(obj, defaultValue) {
  if (obj.value == defaultValue) {
	obj.value = '';
  	obj.style.color = "#000";
  }
}

// Make Prettier
function setLiveDefault(obj, defaultValue, liveDefault) {
  if (obj.value == defaultValue || obj.value == '') {
	obj.value = liveDefault;
  }
}

function signin(location, offsetX, offsetY) {
	dismissEditPopup()

	// Sorry, Safari not supported at the moment
	if (navigator.vendor == "Apple Computer, Inc.") {
		document.location = "/mssignin"
		return false
	}
	
	var frm = makeEditPopup(location, cl.Signin.Sign_In, null, offsetX || 0, offsetY || 60)

	var serverResponse = createElement(frm, "div")
	serverResponse.id = "serverResponse"
	
	var signinForm = createElement(frm, 'form')
	signinForm.id = 'signinfrm'
	signinForm.name = 'signinfrm'
	
	// Username
	var usernameDiv = createElement(signinForm, 'div')
	usernameDiv.id = "usernameDiv"
	
	var usernameLabel = createElement(usernameDiv, 'label')
	usernameLabel.style.width = '130px'
	usernameLabel.style.textAlign = 'right'
	usernameLabel.style.color = 'black'
	createText(usernameLabel, cl.Signin.Slide_ID_or_Email)

	var username = createInput(usernameDiv, 'text')
	username.id = 'username'
	username.style.width = '115px'
	username.tabIndex = '101'

	// Password
	var passwordDiv = createElement(signinForm, 'div')
	passwordDiv.style.clear = "both"

	var passwordLabel = createElement(passwordDiv, 'label')
	passwordLabel.style.width = '130px'
	passwordLabel.style.textAlign = 'right'
	passwordLabel.style.color = 'black'
	createText(passwordLabel, cl.Signin.Password)
	
	var password = createInput(passwordDiv, 'password')
	password.style.width = '115px'
	password.tabIndex = '102'

	// Remember Me / Submit
	var rememberDiv = createElement(signinForm, 'div')
	rememberDiv.style.marginTop = '10px'
	rememberDiv.style.color = 'black'

	var submit = createInput(rememberDiv, 'submit')
	submit.className = 'buttonInput'
	submit.value = cl.Signin.Sign_In
	submit.tabIndex = '104'

	var remember = createInput(rememberDiv, 'checkbox')
	remember.className = 'checkboxInput'
	remember.checked = true
	remember.id = 'rememberme'
	remember.tabIndex = '103'
	createText(createElement(rememberDiv, 'label'), cl.Signin.Remember_Me)

	var forgotDiv = createElement(signinForm, 'div')
	forgotDiv.style.textAlign = 'right'
	var forgotLink = createElement(forgotDiv, 'a')
	forgotLink.href = '/forgot'
	forgotLink.target = '_blank'
	forgotLink.style.color = 'blue'
	createText(forgotLink, cl.Signin.Lost_Username_or_Pw);

 	username.focus();

	submit.onclick = function () {
		clearChildren("serverResponse");

		asyncAction('userajax', { 'action' : 'signin',
									  'username' : username.value,
									  'password' : password.value ,
									  'remember' : remember.checked ? "on" : "off" },
					function(theResponse){
						pieces = theResponse.split(' ');
						if (pieces[0] == 'PASS') {
							ShowUpdate(location, -50, -50, cl.Signin.Signing_In);
							handleSignin(pieces[1]);
						}
						else {
							displayResponse(theResponse);
						}
		 			});
		return false;
	};
	return false;
}


function displayResponse(serverAnswer) {
	var serverResponse = $("serverResponse");
	var serverMessage = createElement(serverResponse, "p");
	var theAnswer = createText(serverMessage, cl.Signin.Invalid_Username_or_Pw);
	serverMessage.className = "status";
}

var signoutInProgress = false
function signout(location) {
	if (location) ShowUpdate(location, 10, 0, cl.Signin.Signing_Out);
	if (!signoutInProgress) {
		signoutInProgress = true
		asyncAction('userajax', { 'action' : 'signout' },
					function(theResponse){
						if (theResponse == 'PASS') {
						   handleSignout();
						}
						else {
							alert(theResponse);
						}
					});
	}
	return false;
}

// this function can be overriden on a per-page basis
function doReload() {
	document.location.reload(true);
}

var handleSignout = doReload;
var handleSignin = doReload;

function blipItem(addresses, message, iid, location) {

	if(addresses == '') {
		 alert('Please enter at least one address or Slide ID')
		 return false;
	}

	dismissEditPopup();
	asyncAction('channelajax', 
	{ 	action:	'blipitem', 
		addresses : addresses ,
		message : message,
		iid : iid } ,
		function(theResponse) {
			if (theResponse == 'PASS') {
				ShowUpdate(location, 80, 70, "Sent");
			} else {
				alert(theResponse);
			}
		});
	return false;
}

var popupMessage = function(message) {
	dismissEditPopup();
	var frm = makeEditPopup(null, "", null);
	createText(frm, message);
	bt = createInput(frm, "submit");
	bt.value = "OK";
	bt.className = "buttonInput";
	bt.onclick = dismissEditPopup;
	return false;
}

var makeEditPopup =  function(location, label, imageURL) {  // [offsetX], [offsetY]

	var offsetX = arguments[3] ? -arguments[3] + 50 : 50;
	var offsetY = arguments[4] ? -arguments[4] + 50 : 50;

	var body = document.getElementsByTagName('body')[0];
	var newLocation;
	if (location) {
		newLocation = GetElementPosition(location);
	}
	else {
		var win = windowSize();
		newLocation = { left : win.width / 2, 
						top : win.height / 4 } ;
	}
	containerDiv = createElement(body, 'div');
	containerDiv.id = "popupbg";
	if(document.all) {
		containerDiv.style.background = "none";
		containerDiv.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.slide.com/images/popup_prompt.png', sizingMethod='crop');";
	}
	containerDiv.style.left = (newLocation.left - offsetX) + 'px';
	containerDiv.style.top = (newLocation.top - offsetY) + 'px';
	containerDiv.style.width = '300px';
	containerDiv.style.height = '221px';
	containerDiv.style.zIndex = "1000";
	
	editDiv = createElement(body, 'div');
	editDiv.className = "editpopup";
	editDiv.id = "popupcontainer";
	editDiv.style.left = (newLocation.left - offsetX) + 'px';
	editDiv.style.top = (newLocation.top - offsetY) + 'px';
	editDiv.style.zIndex = "1000";
	
	var closeButton = createElement(editDiv, 'a');
	closeButton.href = '#';
	closeButton.className = 'closeButton';
	closeButton.onclick = dismissEditPopup;
		
	var h = createElement(editDiv, 'p');
	createText(h, label);
	if (imageURL != null) {
		var img = createElement(editDiv, "img");
		img.src = imageURL;
		img.className = "popupimg";
	}
	var frm = createElement(editDiv, "form");

	return frm;
}

var createLink = function(parent, href, text, target) {
	var link = createElement(parent, 'a');
	link.href = href;
	if (target) link.target = target;
	if (text) createText(link, text);
	return link;
}


var displayReportPopup = function(location, id, offsetX, offsetY) {
	var frm = makeEditPopup(location, "This material is Inappropriate", null, offsetX, offsetY);
	
	frm.style.textAlign = "left";
	frm.style.fontSize = "8pt";
	frm.style.color = "black";
	
	createText(frm, "We promise to review each and every submission within 24-48 hours. Flagging tells us this is:");
	var why = createElement(frm, "p");
	why.style.fontWeight = "bold";
	why.style.fontSize = "9pt";
	why.style.margin = "5px 15px 5px 15px";
	createText(why, "-Sexually explicit");
	createElement(why, "br");
	createText(why, "-Violates our ");
	createLink(why, "/static/terms", "Terms of Use", "_blank");
	createText(frm, "If you are the copyright owner of this material and believe it has been uploaded without your permission, please follow ");
	var copyright = createElement(frm, "a");
	copyright.href = "/static/copyright";
	copyright.target = "_blank";
	copyright.innerHTML = " these directions";
	createText(frm, " to submit a copyright infringement notice.");
	
	var flagButton = createInput(editDiv, 'submit');
	flagButton.value = "Flag as Inappropriate";
	flagButton.onclick = function() {
		dismissEditPopup();
		asyncAction('channelajax', 
			{ xaction: 'flagforreview', 
			cid : id},
			function(theResponse){
				if (theResponse == 'PASS') {
					ShowUpdate(location, 10, 10, "Flagged");
				} else {
					alert(theResponse);
				}
			} );
		return false;
		};
	flagButton.focus()
	return false;
};

var addFan = function(channel_id, email, loc, offsetX, offsetY, simultaneous_embed) {
	if (isLegalEmail(email.value)) {
		asyncAction('userajax',
			{ xaction : 'addfan',
			  email : email.value,
			  channel_id : channel_id },
					function(theResponse) {
						if (theResponse.substring(0,4) == "PASS") {
							logAddFan();
							if(!simultaneous_embed){
								ShowUpdate(loc, offsetX || -100, offsetY || -50, "You've been subscribed");
							}
						} else {
							displayResponse(theResponse);
						}
					} );
	} else {
		alert(badEmailFormatError);
	}
	return false;
};

var fanembed = function(channel_id, dacode, community, interestID, widget_log_embed_success, widget_log_embed_failure, email, password, loc, offsetX, offsetY) {
	if (isLegalEmail(email.value)) {
		addFan(channel_id.value, email, loc, 0, 0, true);
		if (password.value != '') {
			asyncAction('scrapeajax',
				{ xaction : 'cembed',
				username     : email.value,
				password     : password.value,
				channel_id   : channel_id.value,
				auth         : '',
				community    : community.value,
				interestID   : interestID.value,
				blogID       : 'none',
				always_add   : 'true',
				subject      : '',
				widget_log_embed_success: widget_log_embed_success.value,
				widget_log_embed_failure: widget_log_embed_failure.value,
				body         : dacode.value,
				loc          : loc.value,
				offsetX      : offsetX.value,
				offsetY      : offsetY.value},
					function(theResponse) {
						if (theResponse.substring(0,4) == "PASS") {
							ShowUpdate(loc, offsetX || -100, offsetY || -50, "This SlideShow has been added!");
							email.value = email.value
							password.value = password.value
							logEmbed();
						} else {
							ShowUpdate(loc, offsetX || -100, offsetY || -50, "Incorrect email or password. Be sure to use your MySpace email and password, NOT your Slide email and password");
							email.value = ''
							password.value = ''
						}
					});
			} else {
				alert("Please enter a password");
			}
		} else {
			alert(badEmailFormatError);
		}
	return false;
};

var fanUser = function(email, uid, location, offsetX, offsetY) {
	if (isLegalEmail(email.value)) {
		asyncAction('userajax',
			{ xaction : 'fanuser',
			  email : email.value,
			  uid : uid.value },
					function(theResponse) {
						if (theResponse.substring(0,4) == "PASS") {
							ShowUpdate(location, offsetX || -100, offsetY || -50, "You've been subscribed");
							logAddFan();
							email.value = ''
						} else {
							displayResponse(theResponse);
						}
					} );
	} else {
		alert(badEmailFormatError);
	}
	return false;
};


var DefaultInput = function(baseClass, editClass, emptyText) {
	this.baseClass = baseClass;
	this.editClass = editClass;
	this.focusobject = null;
	this.emptyText = emptyText;
}

DefaultInput.prototype.focusOn = function(foc) {
	if (this.isclear(foc)) {
		foc.value = "";
	}
	foc.className = this.editClass;
	foc.select();
	this.focusobject = foc;
}

DefaultInput.prototype.setAppearance = function(caller) {
	if (caller.value == "") {
		addElementClass(caller, this.baseClass);
		removeElementClass(caller, this.editClass);
		caller.value = this.emptyText;
	} else if (caller.value == this.emptyText) {
		addElementClass(caller, this.baseClass);
		removeElementClass(caller, this.editClass);
	} else {
		addElementClass(caller, this.editClass);
		removeElementClass(caller, this.baseClass);
	}
}

DefaultInput.prototype.blur = function(foc) {
	this.focusobject = null;
}

DefaultInput.prototype.isclear = function(caller) {
	return removeElementClass(caller, this.baseClass);
}


DefaultInput.prototype.clickOn = function(foc) {
	if (!document.all && (foc != this.focusobject)) {
		this.focusOn(foc);
	}
}

DefaultInput.prototype.clear = function(inp) {
	inp.value = "";
	this.setAppearance(inp);
}

var displaySelects = function(show) {
	this._toggleFields = function(fields, visibility) {
		for(var i = 0; i < fields.length; i++) {
			fields[i].style.visibility = (visibility) ? 'visible' : 'hidden'
		}
	}
	if (document.all) {
		// This part is a hack because IE 6 doesn't respect z-index for 'select' type inputs
		this._toggleFields(document.getElementsByTagName('select'), show)

		if (document.frames.length) {
			for (var i = 0; i < frames.length; i++) {
				try {
					this._toggleFields(document.frames[i].document.getElementsByTagName('select'), show)
				} catch(e) { }
			}
		}
	}
}

// Show the black-transparent blackout layer in front of everything.  
// Show box 'id', the dialog to display in front of it
// showSelects=False if the menus pop thru on IE6, this fixes it
// noTransparency = make it opaque black instead of smokey glass
// see also same name in arrange.js and iframe_embed.tmpl
var displayDimmed = function(id, fnc, showSelects, noTransparency) {
	var currentWindow = windowSize();
	currentWindow.height = Math.max(currentWindow.height, document.body.offsetHeight)
	currentWindow.width = Math.max(currentWindow.width, document.body.offsetWidth)
	var blackout = $('blackout')
	blackout.style.height = currentWindow.height + 100 + "px";
	blackout.style.width = currentWindow.width + "px";
	blackout.style.display = 'block'
	if (noTransparency) {
		blackout.style.backgroundColor = '#ddd'
	} else {
		SetOpacityById('blackout', 50)
	}
	$(id).style.display = 'block'
	
	// Hack alert: this is because Firefox ignores z-index with overflow:auto
	var tabBoxElement = $('tabBox')
	if (tabBoxElement) { tabBoxElement.style.display = 'none' }
	
	if (!showSelects) displaySelects(false)
	if (fnc) fnc();
	return false;
}

var dismissDimmed = function(id, fnc) {
	$('blackout').style.display = 'none'
	$(id).style.display = 'none'

	// Hack alert: this is because Firefox ignores z-index with overflow:auto
	var tabBoxElement = $('tabBox')
	if (tabBoxElement) { tabBoxElement.style.display = 'block' }

	displaySelects(true)
	if (fnc) fnc()
	return false;
}
