// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

var pendingRequest = null;
var inWidget = false
var inPlaceLoggedInUser = -1;

function hideAndShow(toHide, toShow){
    $(toHide).style.display = 'none';
    $(toShow).style.display = 'block';
}

function restfulWishlistItemUrl(userId, itemId){
  return itemId === undefined ? "/users/"+userId+"/wishlist_items" : "/users/"+userId+"/wishlist_items/"+itemId;  
}

function restfulItemUrl(userId, collectionId, itemId){

    result = "/users/" + userId + "/collections/" + collectionId + "/items";
    if (itemId === undefined) 
        return result;
    else 
        return result + "/" + itemId
}

function restfulUserUrl(UserId){
  return "/users/" + userId;
}

function authenticAjaxRequest(requestUrl, requestOptions){
    pendingRequest = {
        url: requestUrl,
        options: requestOptions
    };
    
		tempOptions = {};
    for (i in requestOptions) {
        if (i != 'onFailure') tempOptions[i] = requestOptions[i];
    }
		tempOptions['onFailure'] = function(response){
        requestLogin(response.request.parameters['in_widget']);
    };
    if (requestOptions['parameters'] == null) {
        requestOptions['parameters'] = {};
    }
    requestOptions['parameters']['in_widget'] = inWidget;
    
    if (inPlaceLoggedInUser !== -1) {
        requestUrl = requestUrl.gsub("users/-1", "users/" + inPlaceLoggedInUser);
    }
    new Ajax.Request(requestUrl, tempOptions);
}

function requestLogin(inWidget){
    disableDiv = $('div_disable_page');
    popup = $('div_popup_login');
    if (inWidget) {
        fromLeft = 20;
        fromTop = (disableDiv.cumulativeScrollOffset()[1] + 70);
    }
    else {
        fromLeft = ((window.screen.width - 700) / 2);
        fromTop = (disableDiv.cumulativeScrollOffset()[1] + 150);
    }
    disableDiv.style.height = '' + document.body.parentNode.scrollHeight + 'px';
    popup.style.marginTop = '' + fromTop + 'px';
    popup.style.marginLeft = '' + fromLeft + 'px';

    
    hideAndShow("in_place_registration_div", "in_place_login_div");

	disableDiv.setStyle('display:block');
	disableDiv.setOpacity(0.85);
	
}

function cancelInPlaceLogin(){
    $('div_disable_page').style.display = 'none';
}

function cancelInPlaceRegistration(){
 $('div_disable_page').style.display = 'none';
}


function respondToLoginSuccess(loggedInUser)
{
	if (pendingRequest)
	{
		pendingRequest.url = pendingRequest.url.gsub("users/-1", "users/" + loggedInUser);
		new Ajax.Request(pendingRequest.url, pendingRequest.options);
	}
	cancelInPlaceLogin();
}


function includeJS(fileName){
    var th = document.getElementsByTagName('head')[0];
    var s = document.createElement('script');
    s.setAttribute('type', 'text/javascript');
    s.setAttribute('src', '/javascripts/' + fileName);
    th.appendChild(s);
}

function includeCSS(fileName){
    var css = document.createElement('link');
    css.rel = 'stylesheet'
    css.type = 'text/css';
    css.href = '/stylesheets/' + fileName;
    document.getElementsByTagName('head')[0].appendChild(css);
}

function isIE(){
    var browser = navigator.appName;
    if (browser == "Microsoft Internet Explorer") 
        return true;
    else 
        return false;
}

var GlobalHandlers = {
    onException: function(request, e){
        alert('Exception during ajax call:' + e.message);
    }
}

//Ajax.Responders.register(GlobalHandlers);



function focusSearch(searchInput){
    if (searchInput.value == "Search...") 
        searchInput.value = "";
}

function blurSearch(searchInput){
    if (searchInput.value == "") 
        searchInput.value = "Search...";
}



//common things between collections.js and items.js

function addItemToMyWishlist(userId, collectionId, itemId, removeItem){
    removeItem = (typeof removeItem=="undefined") ? "false" : arguments[3].toString();
    authenticAjaxRequest(restfulItemUrl(userId, collectionId, itemId) + "/clone_wishes", {
        method: 'post',
        parameters: {remove_item: removeItem}
    });
}


function addItemToMyCollections(userId, collectionId, itemId, removeItem){
    removeItem = (typeof removeItem=="undefined") ? "false" : arguments[3].toString();
    authenticAjaxRequest(restfulItemUrl(userId, collectionId, itemId) + "/clone_items", {
        method: 'post',
        parameters: {remove_item: removeItem}
    });
}

function validateImageUpload(form, errorPlaceHolder, imageFieldName){
    if (imageFieldName === undefined) 
        imageFieldName = 'item[image]'
    imageName = form[imageFieldName].value;
    if (!imageName || imageName == "") 
        return true;
    imageNameFragments = imageName.split('.');
    imageExtension = imageNameFragments[imageNameFragments.length - 1].toLowerCase();
    if (imageExtension == "jpg" || imageExtension == "png" || imageExtension == "gif") {
        return true;
    }
    else {
        imageUploadErrorCallback(errorPlaceHolder);
        return false;
    }
}

function imageUploadErrorCallback(errorPlaceHolder){
    // works for profile, item and wish in site
    errorPlaceHolder.value = "Error: image must be jpg, png or gif";
    
    // works for item in widget
    errorPlaceHolder.innerHTML = "Error: image must be jpg, png or gif";
    
    errorPlaceHolder.style.display = 'block';
    new Effect.Highlight(errorPlaceHolder, {
        duration: 3
    });
    new Effect.Fade(errorPlaceHolder, {
        duration: 3,
        queue: 'end'
    });
}

function submitSearch(form){
    form = $('top_search_form');
    if (form['search[name]'].value == 'Search...') {
        form['search[name]'].value = '';
    }
    form.submit();
}

function widenItem(elementId){
    $(elementId).style.width = '310px';
}

function narrowItem(elementId){
    $(elementId).style.width = '180px';
}

function showForgotPassword(login_in_place){
	var inplacePrefix = (login_in_place == 1)?'in_place_':'';
		
	var login_div_id = inplacePrefix + 'login_div';
	var forget_password_div_id = inplacePrefix + 'forget_password_div';
	var forget_password_send_btn_id = inplacePrefix + 'forget_password_send_btn';
	var login_note_id = inplacePrefix + 'login_note';
	var email_textbox_id = inplacePrefix + 'email_textbox';	
	var forgotten_password_email_textbox_id = inplacePrefix + 'forgotten_password_email_textbox'
	
	$(login_note_id).innerHTML = "<span></span>"
	
	var all_forget_password_div_forms = $(forget_password_div_id).select('form');
	var forget_password_form = all_forget_password_div_forms[0]
	forget_password_form.reset();
	
	$(forgotten_password_email_textbox_id).value = $(email_textbox_id).value;
	
	var send_btn = $(forget_password_send_btn_id);
	send_btn.disabled = false;
	send_btn.value = 'Send';
	
	$(login_div_id).style.display = 'none';
	$(forget_password_div_id).style.display = 'block';
}

function cancelForgetPassword(login_in_place){
    if (login_in_place === 1) {
        login_div_id = 'in_place_login_div'
        forget_password_div_id = 'in_place_forget_password_div'
    }
    else {
        login_div_id = 'login_div'
        forget_password_div_id = 'forget_password_div'
    }
    
    $(forget_password_div_id).style.display = 'none';
    $(login_div_id).style.display = 'block';
}


function respondToSurvey(){
    $('survey_form').reset();
    $('div_survey').innerHTML = '<label> Thank you </label>';
    hideSurveyDiv = function(){
        new Effect.Fade('div_survey');
    };
    new Effect.Highlight('div_survey', {
        duration: 3,
        afterFinish: hideSurveyDiv
    });
}

function enableBtn(register_btn_id, text){
    register_btn = $(register_btn_id);
    register_btn.disabled = false;
    register_btn.value = text;
}

function copyToDisplayName(registration_in_place){
    if (registration_in_place === 1) {
        first_name_id = 'in_place_first_name';
        last_name_id = 'in_place_last_name';
        display_name_id = 'in_place_display_name';
    }
    else {
        first_name_id = 'first_name';
        last_name_id = 'last_name';
        display_name_id = 'display_name';
    }
    
    $(display_name_id).value = $(first_name_id).value + " " + $(last_name_id).value;
}

function resetForm(registration_div_id){
    inputs = $(registration_div_id).select('input[type="text"]');
    inputs.each(function(text_input){
        text_input.clear();
    })
}

function showWidgetRegister(){
    pendingRequest = null;
    requestLogin(true);
    hideAndShow("in_place_login_div", "in_place_registration_div");
}

function openSiteTour(static_content_host){
    window.open('/site_tour', 'popup', 'menubar=no,scrollbars=no,resizable=no, toolbar=no,directories=no,width=935,height=600');
}

function doImageVerticalPadding(containerId, imageId){
    var container = $(containerId);
    var image = $(imageId);
    if (image && container) {
        if (!image.complete) {
            expression = "doImageVerticalPadding('" + containerId + "', '" + imageId + "')";
            setTimeout(expression, 500);
            return false;
        }
        image.style.marginTop = '' + Math.floor((container.clientHeight - image.clientHeight) / 2) + 'px';
    }
}

/*
 * 
 * @param {String} name, possible values: user_id, user_display_name
 */
function readCookie(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;
}

function getUserIdFromUrlOfCurrentPage(){
    var loc = window.location.toString();
    var userid;
    var ind1 = loc.search('/users/');
    if (ind1 != -1) {
        var s2 = loc.substr(ind1 + 7);
        var ind2 = s2.search('/');
        if (ind2 == -1) 
            userid = Number(s2);
        else 
            userid = Number(s2.substr(0, ind2));
        
        
        if (userid != Number.NaN) 
            return userid;
        else 
            return null;
    }
}

function onPageLoad(){
    updateLayout();
    //if (window.customPageOnload) customPageOnload();
}

function updateLayout(){
  if(userLoggedIn()){
    updateHeadersToLoggedIn();
    $$('.guests').invoke('hide');
    if(isUserPageOwner()){
      updateLayoutToOwnerMode(true);
    }
  }
}

function userLoggedIn(){
    if (readCookie("user_id")) 
        return true;
    else 
        return false;
}

function isUserPageOwner(){
    var pageUserid = getUserIdFromUrlOfCurrentPage();
    var currentUserId;
    
    if (pageUserid) {
        currentUserId = readCookie("user_id");
        if (currentUserId) {
            if (pageUserid == Number(currentUserId)) {
                return true;
            }
        }
    }
    return false;
}

function updateLayoutToOwnerMode(toOwnerMode){
  var viewer = 'viewer_body';
  var owner = 'owner_body';
  if(toOwnerMode){
    document.body.id = 'owner_body';
    $(document.body).removeClassName(viewer);
    $(document.body).addClassName(owner);
  }
  else{
    document.body.id = viewer;
    $(document.body).removeClassName(owner);
    $(document.body).addClassName(viewer);
  }
  //document.body.innerHTML = document.body.innerHTML;
}

function updateHeadersToLoggedIn(){
    //adjust login headers
    $("userNavigation_displayName").innerHTML = 'Welcome, ' + readCookie("user_display_name").replace(/\+/g," ");
    ["userNavigation"].each(function(e){
      $(e).removeClassName("loggedout_header");
      $(e).addClassName("loggedin_header");  
    });
    if (isUserPageOwner()) {
        if ($("div_page_identifier")) {
            $("li_" + $("div_page_identifier").innerHTML).addClassName("headerNavActive");
        }
    }
    
    //adjust header links
    var str2 = "/" + readCookie("user_id");
    var header = $('header');
    links = header.getElementsByTagName('a');
    for (i = 0; i < links.length; i++) {
        var str = links[i].getAttribute("href");
        links[i].setAttribute("href", str.replace('/-1', str2));
    }
}

var DateHelper = {
  timeAgoInWords: function(from) {
   return this.distanceOfTimeInWords(new Date(), new Date(from));
  },
  distanceOfTimeInWords: function(to, from) {
    seconds_ago = ((to  - from) / 1000);
    minutes_ago = Math.floor(seconds_ago / 60);

    if(minutes_ago <= 0) { return "less than a minute"; }
    if(minutes_ago == 1) { return "a minute"; }
    if(minutes_ago < 45) { return minutes_ago + " minutes"; }
    if(minutes_ago < 90) { return " about 1 hour"; }
    hours_ago  = Math.round(minutes_ago / 60);
    if(minutes_ago < 1440) { return "about " + hours_ago + " hours"; }
    if(minutes_ago < 2880) { return "1 day"; }
    days_ago  = Math.round(minutes_ago / 1440);
    if(minutes_ago < 43200) { return days_ago + " days"; }
    if(minutes_ago < 86400) { return "about 1 month"; }
    months_ago  = Math.round(minutes_ago / 43200);
    if(minutes_ago < 525960) { return months_ago + " months"; }
    if(minutes_ago < 1051920) { return "about 1 year"; }
    years_ago  = Math.round(minutes_ago / 525960);
    return "over " + years_ago + " years";
  }
}

var HTMLHelper = {
  enableAnchor: function(anchor, enable){
    var e = $(anchor);
    if(enable){
      var href_bak = e.readAttribute('href_bak');
      if(href_bak && href_bak != "" && href_bak != null){
        e.writeAttribute('href', href_bak);
        e.removeAttribute('href_bak');
      }
    }
    else{
      var href = e.readAttribute('href');
      if(href && href != "" && href != null){
        e.writeAttribute('href_bak', href);
        e.removeAttribute('href');
      }
    }
  }
}

Event.observe(window, 'load', function() {
	
	/*
$$('.inputTxt, textarea, select').each( function(e) {
	e.observe('focus',function (e) {this.morph('border-color:#000000; color:#000000');});
	e.observe('blur',function (e) {this.morph('border-color:#999999; color:#686868');});
	});
	
	*/
$('navigation_home').observe('mouseover', function(){moveNavBg(0)});
$('navigation_explore').observe('mouseover', function(){moveNavBg(75)});
$('navigation_tags').observe('mouseover', function(){moveNavBg(150)});
$('navigation_location').observe('mouseover', function(){moveNavBg(225)});
$('navigation_find').observe('mouseover', function(){moveNavBg(300)});

$('rssIconA').observe('mouseover', function(){
	new Effect.Move('rssIconA', {duration:0.5, x: 0, y: 17, mode: 'absolute', transition: Effect.Transitions.spring});
});


$('rssIconA').observe('mouseout', function(){
	new Effect.Move('rssIconA', {duration:0.5, x: 0, y: 0, mode: 'absolute', transition: Effect.Transitions.sinoidal});
});

});

function setNavHighlight(identifier){
  var position = 0;
  switch(identifier)
  {
  case 'explore':
  case 'items':
  case 'wishlist_items':
    position = 75;
    break;
  case 'tags':
    position = 150;
    break;
  case 'search_owner_results':
  case 'users':
  case 'profiles':
  case 'collections':
  case 'contact_user_messages':
    position = 225;
    break;
  case 'searches':  
  case 'search_item_results':
    position = 300;
    break;
  }
  $('navigation').observe('mouseout', function(){moveNavBg(position);});
  moveNavBg(position);  
}

function moveNavBg(position){
	$('navigation').morph('background-position:'+position+'px 0px',{duration:0.6});
}

/*
 * This function is used in order to calculate the difference of years
 * between today date and the date give
 */
calculateAge = function(user_birthdate){
  var oneDayValue = 1000*60*60*24;

  return parseInt((((new Date()).getTime() - user_birthdate.getTime())/(oneDayValue))/365);
}

/*
 * This function is used in order to calculate user age
 * by parsing his birthdate then calculating the difference
 * between it and today date
 */
calculateUserAge = function(){
	var user_age = $('user_age');
	if(user_age){
	  var dateParts = $('user_age').readAttribute('birthdate').split('-');
	  var user_birthdate = new Date(dateParts[0], (dateParts[1]-1), dateParts[2]);
	 $('user_age').innerHTML = calculateAge(user_birthdate);
	}
}

/**
 * This function is used to show chemistry meter
 * if the user is logged in and he isn't the owner
 * of that page
 */
showChemistryMeter = function(){
  if (userLoggedIn() && !isUserPageOwner()) {
		$$('.userChemistry').first().show();
  	calculateUserRelation();
  }
}

/**
 * this function is used to request from server what is the
 * relation between that user and the logged in user
 */
calculateUserRelation = function(){
	new Ajax.Request('/users/' + location.pathname.split('/')[2] + '/chemistry_meter', {
    method: 'get',
    onSuccess: function(transport){
      $$('.userChemistry').first().innerHTML = '<span class="chemistryValue">' + transport.responseText + '%</span>';
    }
  });
}
var ItemValidations = {
  validateImageForm: function(form, errorPlaceHolder, imageFieldName){
    if(imageFieldName === undefined) 
      imageFieldName = 'item[image]'
    imageName = form[imageFieldName].value;
    if (!imageName || imageName == "") 
      return true;
    imageNameFragments = imageName.split('.');
    imageExtension = imageNameFragments[imageNameFragments.length - 1].toLowerCase();
    if (imageExtension == "jpg" || imageExtension == "png" || imageExtension == "gif")
      return true;
    else{
      ItemValidations.showError(errorPlaceHolder, "Error: image must be jpg, png or gif");
      return false;
    }
  },
  showError: function(errorPlaceHolder, message){
    errorPlaceHolder.innerHTML = message;
    errorPlaceHolder.show();
    new Effect.Pulsate(errorPlaceHolder);
  },
  clearError: function(errorPlaceHolder){
    errorPlaceHolder.hide();
    errorPlaceHolder.innerHTML = '';
  }
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};