
// app_base
//
// generic functions used for the app base
// jeremiah robison
// 10.19.2008
//----------------


var AppBase = {};

//AppBase.js_log = function(page, event) {
//	jQuery.post(
//	    page,
//		{'xaction':'logger',
//		 'event':event}
//	);
//};

AppBase.activity_log = function(page, xaction) {
	jQuery.post(
	    page,
		{'xaction':xaction}
		);
};

AppBase.post = function(url, data, success_function, failure_function) {
	jQuery.post(
		url,
		data,
		function(response){AppBase.handle_response(response, success_function, failure_function);}
	);
};

AppBase.handle_response = function( response, success_function, failure_function ){
	if( response.substring(0,4) == "PASS" ){
		if( success_function){
		  var result = "";
		  if( response.length > 4 ){
		    result = eval("(" + response.substring(5) + ")");
          }
		  success_function(result);
		}
	}else{
		var message = response.substring(5);
		if( failure_function ){ failure_function(message); }
		else                  { alert(           message); }
	}
};

AppBase.show_login = function(message, callback) {
    AppBase.show_login.on_login_success_callback = callback;
	if (message) {
	    $('#optional_login_message').html( translate(message) );
		$('#optional_login_message').show();
	}
	$('#main_login_form').show();
	$('#login_username').focus();
	getObject('login_error').innerHTML = '';
	$(".login_input_create").hide();
	return false;
};

AppBase.hide_login = function() {
	$('#main_login_form').hide();
	$('#optional_login_message').hide();
	delete AppBase.show_login.on_login_success_callback;
	getObject('login_error').innerHTML = '';
	$(".login_input_create").hide();
	return false;
};

AppBase.search = function() {
	$('#search_form').submit();
	return false;
};

AppBase.login_lock = false;

AppBase.login = function( options ) {
  if( AppBase.login_lock ){ return false; }
  AppBase.login_lock = true;
  getObject('login_error').innerHTML = '';
  $(".login_input_create").hide();
  AppBase.post(
    '/profile',
      {
	'xaction':'signin',
	'username':$('#login_username').val(),
	'password':$('#login_password').val(),
	'pxcid':$('#login_pxcid').val(),
	'do_signup':$("#login_create")[0].checked
      },
      AppBase.on_login,
      function(result) {
	AppBase.login_lock = false;
	if( result == "NO_USER" ){
	  $(".login_input_create").show();
	}
	getObject('login_error').innerHTML = '<div class="error">'+translate(result)+'</div>';
      }
  );
  return false;
};

AppBase.on_login = function(result){
  AppBase.login_lock = false;
  AppBase.user = {
    'puid' : result.puid
  };
  if( AppBase.show_login.on_login_success_callback ){
    AppBase.show_login.on_login_success_callback();
    delete AppBase.show_login.on_login_success_callback;
  }else{
    window.location.reload();
  }
};

AppBase.logout = function() {
	AppBase.post(
	    '/profile',
		{ 'xaction':'signout'},
		function(result) {window.location.reload();}
		);
	return false;
};

AppBase.check_menu = function(menu, show) {
	var timer = menu+'_timer';
	if (AppBase[timer]) {
		clearTimeout(AppBase[timer]);
	}
	if (show) {
		$('#'+menu+'_menu').show();
	} else {
		AppBase[timer] = setTimeout("AppBase.hide_menu('"+menu+"')",200);
	}
};
AppBase.hide_menu = function(menu) {
  $('#'+menu+'_menu').hide();
};

AppBase.create_menu = function(parental, id, name, options) {
	var control = A({'class':'generic_menu_link '+name+'_menu_link',
					 'id':id+'_menu_link',
					 'href':'#',
					 'onmouseover':'AppBase.check_menu("'+id+'",true)',
					 'onmouseout':'AppBase.check_menu("'+id+'",false)',
					 'onclick':'return false;'
					 },
					translate(name)
					);


	var menu = DIV({'class':'generic_menu_padder '+name+'_menu_padder'});
	for (var i=0; i<options.length; i++) {
		var action_img;
		if (options[i].hasOwnProperty('img')) {
			action_img = 'padding-left:20px;' + 'background:url("' + options[i].img + '") left no-repeat;';
		} else {
			action_img = 'padding-left:0px;';
		}
	    	var option = A({'class':'generic_menu_option '+name+'_menu_option',
						'style':action_img,
						'onmouseover':'AppBase.check_menu("'+name+'",true)',
						'onmouseout':'AppBase.check_menu("'+name+'",false)',
						'href':options[i].href,
						'onclick':options[i].onclick
						},
					   translate(options[i].name)
					   );
		menu.appendChild(option);
	}
	parental.appendChild(control);
	parental.appendChild(DIV({'class':'generic_menu '+name+'_menu',
							  'id':id+'_menu',
							  'onmouseover':'AppBase.check_menu("'+id+'",true)',
							  'onmouseout':'AppBase.check_menu("'+id+'",false)'
							  },
							 menu
							 ));
};

AppBase.render_create_menu = function(id) {
	    var menu_options = [  {'name':'header_slideshow_create',
							   'href':'/arrange',
							   'onclick':'return true'
							   },
							  {'name':'header_funpix_create',
							   'href':'/pic_arrange',
							   'onclick':'return true'
							   },
							  {'name':'header_skinflix_create',
							   'href':'/video_arrange',
							   'onclick':'return true'
							   },
							  {'name':'header_guestbook_create',
							   'href':'/guest_arrange',
							   'onclick':'return true'
							   },
							  {'name':'header_group_create',
							   'href':'/groups/create',
							   'onclick':function(){
                                 if( AppBase.user ){
                                   return true;
                                 }else{
                                   AppBase.show_login(translate("login_required"), function(){
                                     bu.relocate('/groups/create');
                                   });
                                   return false;
                                 }}
							   }
							];
		var parental = getObject(id);
		AppBase.create_menu(parental, 'header_create', 'header_create', menu_options);
};

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

AppBase.is_legal_email = function(v) {
	return emailPattern.test(v);
};
AppBase.is_legal_password = function(v) {
	for (var i in v) {
		if (v.charCodeAt(i) > 127) {
			return false;
		}
	}
	return v && v.replace(/(\s*)/g,"") == v;
};
AppBase.validate_password_reset = function(password, passwordConfirm) {
	if (!AppBase.is_legal_password(password)) {
	    return 'illegal_password';
	}
	if (password != passwordConfirm) {
		return 'unmatched_passwords';
	}
	return 'pass';
};

AppBase.image_upload = function(success_function, width, height, img_width, img_height, upload_frame_id){
  upload_frame_id = lu.default_to(upload_frame_id, "upload_frame");
  return ('<iframe id="'+ upload_frame_id +'" height="'+ height +'" width="'+ width +'" frameborder="0" scrolling="no"></iframe>'+
    '<script>'+
    '  getObject("'+ upload_frame_id +'").src="/single_upload?success='+ success_function +'&img_width='+ img_width +'&img_height='+ img_height +'";'+
    '</script>');
};

AppBase.datestring = function(time, show_prefix) {
  if( typeof( show_prefix ) == "undefined" ){ show_prefix = true; }
  time = parseInt( time, 10 );
  var day_threshold = 86400;
  var now = new Date();
  var nows = Date.parse(now.toString())/1000;
  var then = new Date();
  var days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
  var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
  var datestr = "";
  then.setTime(time*1000);

  var hours = then.getHours();
  var suffix = (hours<12) ? 'am' : 'pm';
  if (hours === 0) {
    hours = 12;
  } else if (hours>12){
    hours = hours-12;
  }
  var minutes = then.getMinutes();
  if (minutes < 10) {
    minutes = "0" + minutes;
  }
  var timestr = hours + ':' + minutes + suffix;
  var prefix = "";
  if ((nows-time) < day_threshold && now.getDate() == then.getDate()) {
    if( show_prefix ){
      prefix = "at ";
    }
    datestr = prefix + timestr;
  } else if ((nows - time) < (day_threshold*3)) {
    if( show_prefix ){
      prefix = "on ";
    }
    datestr = prefix + days[then.getDay()] + ' at ' + timestr;
  } else {
    if( show_prefix ){
      prefix = "on ";
    }
    datestr = prefix + months[then.getMonth()] + ' ' + then.getDate();
  }
  if( now.getFullYear() != then.getFullYear() ){
    datestr += ' '+then.getFullYear();
  }
  return datestr;
};

// The manual_login function provides similar functionality to the login function above, but without forcing the user through the login flow attached to the header
// it does not include any view manipulation
// todo: eliminate duplication by making the header to use this code
AppBase.manual_login = function( options ){
  // options can include:
  //   username
  //   password
  //   pxcid     : Channel to automatically associate with the user upon login
  //   do_signup : Create an account if it does not yet exist for the email
  //   on_success: a callback that will be executed after manual_login()'s internal on_success funciton executes
  //   on_failure: a callback that will be executed after manual_login()'s internal on_failure funciton executes
  if( AppBase.manual_login.pending === true ){ return false; }
  AppBase.manual_login.pending = true;

  if( options.on_success ){ AppBase.manual_login.on_success.callback = options.on_success; }
  if( options.on_failure ){ AppBase.manual_login.on_failure.callback = options.on_failure; }
  var parameters = { 'xaction'  : 'signin' };
  if( options.username ){ parameters.username  = options.username ; }
  if( options.password ){ parameters.password  = options.password ; }
  if( options.pxcid    ){ parameters.pxcid     = options.pxcid    ; }
  if( options.do_signup){ parameters.do_signup = options.do_signup;}
  AppBase.post(
    '/profile',
    parameters,
    AppBase.manual_login.on_success,
    AppBase.manual_login.on_failure
  );
  return false;
};
AppBase.manual_login.pending = false;
AppBase.manual_login.on_success = function( result ){
  AppBase.user = { 'puid' : result.puid };
  if( AppBase.manual_login.on_success.callback ){
    AppBase.manual_login.on_success.callback( result );
  }else{
    window.location.reload();
  }
  delete AppBase.manual_login.on_success.callback;
  delete AppBase.manual_login.on_failure.callback;
  AppBase.manual_login.pending = false;
};
AppBase.manual_login.on_failure = function( result ){
  if( AppBase.manual_login.on_failure.callback ){
    AppBase.manual_login.on_failure.callback( result );
  }
  delete AppBase.manual_login.on_success.callback;
  delete AppBase.manual_login.on_failure.callback;
  AppBase.manual_login.pending = false;
};

AppBase.getElementPosition = function(target) {
  if (typeof(target) == "string") {
    target = $(target);
  }
  if(target.offsetParent) {
    for(var posX = 0, posY = 0; target.offsetParent; target = target.offsetParent ) {
      posX += target.offsetLeft;
      posY += target.offsetTop;
    }
    return { left:posX, top:posY };
  }
  else {
    return { left:target.x, top:target.y };
  }
};


AppBase.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 = AppBase.getElementPosition(location);
	}
	else {
		var win = AppBase.windowSize();
		newLocation = { left : win.width / 2,top : win.height / 4 } ;
	}
	var 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";

	var 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 = function(){ $('#popupcontainer, #popupbg').hide().remove(); return false;};

	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;
};

AppBase.displayReportPopup = function(location, id, offsetX, offsetY, callback) {
  if( typeof( callback ) == "undefined" ){ callback = function(){}; }
  var frm = AppBase.makeEditPopup(location, "This material is Inappropriate", null, offsetX, offsetY);
  frm.style.textAlign = "left";
  frm.style.fontSize = "8pt";
  frm.style.color = "black";

  var why = P({},
	         SPAN({},"-Sexually Explicit"),
		 BR(),
		 SPAN({},"-Violates our "),
		 A({'href':'/static/terms', 'target':'_blank'},'Terms of Use')
	     );
  why.style.fontWeight = "bold";
  why.style.fontSize = "9pt";
  why.style.margin = "5px 15px 5px 15px";


  var submitBtn = INPUT({'type':'submit', 'value':'Flag as Inappropriate'});
  submitBtn.onclick = function(){
    $('#popupcontainer, #popupbg').hide().remove();
    AppBase.post('/channelajax',
                 {
		   'xaction' : 'flagforreview',
		   'cid' : id
		 },
		 callback
		 );
    return false;
  };


  frm.appendChild( SPAN({},
			"We promise to review each and every submission within 24-48 hours. Flagging tells us this is:",
			BR({}),
			why,
			"If you are the copyright owner of this material and believe it has been uploaded without your permission, please follow ",
			A({'href':'/static/copyright', 'target':'_blank'}, 'these directions'),
			SPAN({}," to submit a copyright infringement notice."),
			submitBtn
			));
  submitBtn.focus();
  return false;
};


AppBase.windowSize = function() {
	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  };

};

AppBase.redeco = function(url, options){
  options = lu.defaulted(options, {});
  var halves = url.split('/r/');
  var params = halves[1].split('/');
  if( options.height ){ params[7] = options.height; }
  if( options.width  ){ params[8] = options.width;  }
  halves[1] = params.join('/');
  return halves.join('/r/');
};

AppBase.ual = function(event_key, options){
  options = lu.defaulted(options, {});
  // TBD: log_type can be 'click' or 'interest' for now
  options = lu.defaults(options, {
    log_type : 'click'
  });

  // event_key is the 'click' event or 'you_may_know_submit' for user-of-interest counting
  var parameters = {
    'xaction':'log',
    'cmd': AppBase.command_name,
    'event':event_key,
    'log_type':options.log_type
  };
  if( options.fields ) {
      for (var whichfield=0; whichfield<options.fields.length; whichfield++) {
          parameters["field_"+whichfield] = options.fields[whichfield];
      }
  }
  AppBase.post('/slidecom_generic', parameters);
};
AppBase.js_ual_log = AppBase.ual;
