var dylanAjaxExcluded = "[@rel=ajaxsubmit]";
var dylanBaseUrl = document.location.href;

if(document.location.href.indexOf('#') > 0) {
    dylanBaseUrl = document.location.href.substring(0, document.location.href.indexOf('#'));
}

var dylanFirstLoad = true;
var dylanJsonUrl = dylanBaseUrl + 'services/json';
var dylanJsonParams = 'method=dylan.renderPage&path=';
var dylanAjaxTarget = '#content-area';
var dylanFooterTarget = '#background_region';
var dylanCreditsTarget = '#dylan_footer';
var dylanAjaxTitleTarget = '#content-header h1.title';
var dylanAjaxTabsTarget = "#content-header div.tabs";
var dylanTopBlockTarget = '#content-top';
var dylanBottomBlockTarget = '#content-bottom';
var dylanTourPopupTarget = '#tour-popup';
var dylanCurrentRequest = null;
var dylanLoadingScreen = "#loading-screen";
var dylanHeaderSwf = "#header";
var dylanReadyList = null;
var dylanScrollTarget = null;
var dylanMessageModal = false;

function getUid() {
  return dylanUid;
}

function getUserName() {
  return dylanUserName;
}

function handlePageChange(event) {
  // Hide the calendar popup!
  $('#cluetip').fadeOut();

  if((dylanFirstLoad && event.path != '/') || !dylanFirstLoad) {
    renderPage(event.path);    
  } else {
    $(dylanLoadingScreen).css('left', '-9999px').hide(); 
  }

  dylanFirstLoad = false;	
}

function showLoadingScreen() {
  //$(dylanLoadingScreen).css('left', '0px').fadeIn('slow');
  $(dylanLoadingScreen).css('left', '0px').show('slow');
  $(dylanAjaxTarget).fadeOut();
  $(dylanCreditsTarget).fadeOut('fast', function() {
    $(this).css({ visibility: 'hidden', display: 'block' });
  });
  $(dylanAjaxTabsTarget).fadeOut();

  /*
  $(dylanHeaderSwf).each(function() {
    if(this.startLoad) {
      this.startLoad();
    }
  });
  */
}

function hideLoadingScreen() {
  $(dylanLoadingScreen).fadeOut('slow', function() {
    $(this).css('left', '-9999px').hide();
  });

  /*  
  $(dylanHeaderSwf).each(function() {
    if(this.stopLoad) {
      this.stopLoad();
    }
  });
  */
}

SWFAddress.addEventListener(SWFAddressEvent.CHANGE, handlePageChange);

function formReceived(data) {
  if(data.indexOf('<div class="dev-query">') > 0) {
    dylan_debug_noescape(data.substr(data.indexOf('<div class="dev-query">')));
    data = data.substr(0, data.indexOf('<div class="dev-query">'));
  }

  json = Drupal.parseJson(data);
  //json = eval('(' + data + ')');

  _dylan_analytics(json);

  $.fn.nyroModalManual({
    content: json.data.text,
    endFillContent: function(elts, settings) { processForm(elts, settings, json.data.path); },
    showContent: showFormContent,
    endShowContent: endShowFormContent
  });
}
 
function processForm(elts, settings, path) {
	$(elts.content).find("form").each(function() {
	  applyAjaxSubmit(this, '/' + path);
	});

    // Make links in a modal open also in a modal. (A la 	
	$(elts.content).find("a").each(function() {
	  if (this.href.indexOf('user/password') > -1 || this.href.indexOf('user/register') > -1 || this.href.indexOf('user/login') > -1) {
          $(this).click(function() {
            path = this.href.replace(dylanBaseUrl, '');
            //$.post(dylanJsonUrl, {method: 'dylan.renderForm', path: path}, formReceived);
            dylanCurrentRequest = $.ajax({
              url:     dylanJsonUrl,
              data:    {method: 'dylan.renderForm', path: escape(path)},
              success: formReceived,
              error:   handleAjaxError,
              type:    'POST'
            });
            
            return false;
          });
      }
    });
}

function endShowFormContent(elts, settings) {
  $(elts.content).focus_first();
}

function showFormContent(elts, settings, callback) {
  $(elts.content)
    .css('overflow', 'hidden');
    /*
    .css('width', (settings.width + 10)+'px')
    .css('height', (settings.height + 10)+'px');
    */

  /*
  $(elts.contentWrapper)
    .css({ // Reset the CSS at the start position
      marginTop: (-100/2 + settings.marginScrollTop)+'px',
      marginLeft: (-100/2 + settings.marginScrollLeft)+'px',
      height: '100px',
      width: '100px',
      opacity: 0
    })
    .show()
    .animate({ // Set the width
      width: (settings.width + 20)+'px',
      marginLeft: (settings.marginLeft-10)+'px',
      opacity: 0.5
    }, {complete: focusFirst, duration: 350})
    .animate({ // Set the height
      height: (settings.height + 20)+'px',
      marginTop: (settings.marginTop-10)+'px',
      opacity: 1
    }, {complete: callback, duration: 350});
  */
  
  elts.contentWrapper
    .css({ // Reset the CSS at the start position
      marginTop: (-100/2 + settings.marginScrollTop)+'px',
      marginLeft: (-100/2 + settings.marginScrollLeft)+'px',
      height: '100px',
      width: '100px',
      opacity: 0
    })
    .animate({ // Set the width
      width: settings.width+'px',
      marginLeft: (settings.marginLeft)+'px',
      opacity: 0.5
    }, {duration: 350})
    .animate({ // Set the height
      height: settings.height+'px',
      marginTop: (settings.marginTop)+'px',
      opacity: 1
    }, {complete: callback, duration: 350});

}

function endShowPhotoVideoContent(elts, settings) {
  convertLinks('.wrapperImg #nyroModalContent div');
}


function focusFirst() {
  $(this).find('form').focus_first();
}

function applyAjaxSubmit(targetForm, path) {
  if (!path)
    path = SWFAddress.getValue();

  dylan_debug('PATH: ' + path);

  if (targetForm.ajaxsubmit_target) {
    var target = targetForm.ajaxsubmit_target.value;
  }
  else {
    var target = document.createElement('div');
    $(target).addClass('ajaxsubmit-message');
    $(targetForm).before(target);
  }
  // Set a flag to indicate that the form is using ajaxsubmit.
  if (!targetForm.ajaxsubmit) {
    var ajaxsubmitInput = document.createElement('input');
    $(ajaxsubmitInput)
      .attr('type', 'hidden')
      .attr('name', 'ajaxsubmit')
      .attr('value', '1');
    $(targetForm).append(ajaxsubmitInput).attr({action: path});
  }
  $(targetForm).addClass('ajaxsubmit-processed');
  new Drupal.ajaxsubmit(targetForm, target);
  
  dylan_debug(targetForm.action);
}

function pageReceived(data, textStatus) {
  if(data.indexOf('<div class="dev-query">') > 0) {
    dylan_debug_noescape(data.substr(data.indexOf('<div class="dev-query">')));
    data = data.substr(0, data.indexOf('<div class="dev-query">'));
  }

  json = Drupal.parseJson(data);
  if (json.data) {

    // Check for changed uid / username
    /*
    $(dylanHeaderSwf).each(function() {
      if(this.userChange) {
	this.userChange(json.data.new_uid, json.data.new_username);
      }
    });
    */
  
    if(json.data.uid != undefined) {
      if(dylanUid != json.data.uid) {
	dylanUid = json.data.uid;

	if(json.data.uid != 0) {
	  dylanUserName = json.data.uname;
	}
	else {
	  dylanUserName = '';
	}
	
	SWFDispatchDual(dylanUid, dylanUserName, "userChange", PLAYER_SWF_ID);
      }
    }

    if(json.data.redirect) {
      dylan_debug("JSON REDIRECT!: " + json.data.redirect);
      
      if(json.data.redirect == ' ') {
	SWFAddress.back();
      } else {
	setSWFAddressValue('/' + json.data.redirect);	      
	//SWFAddress.setValue('/' + json.data.redirect);
      }
      return;
    }
  
    if (dylanMessageModal == false)
      $.nyroModalRemove();

    dylanMessageModal = false;
    //json = eval('(' + data + ')');

    if(json.data.head_title)
      SWFAddress.setTitle(json.data.head_title);

    $(dylanAjaxTabsTarget).html(json.data.tabs).fadeIn();
  
    // clear out any <link rel="alternate" from <head>
    $("link[rel='alternate'][type='application/rss+xml']").remove();
  
    if(json.data.rss_links)
    {
      //$('head').html(json.data.head);
      for (i = 0; i < json.data.rss_links.length; i++) {
	      if (json.data.rss_links[i] != '') {
		      // for some stupid reason, my preg isn't including the <> of the tag
		      $('head').append("<" + json.data.rss_links[i] + ">");
	      }
      }
    }

    /*
    if(dylanAjaxTitleTarget)
	    $(dylanAjaxTitleTarget).html(json.data.title);

    $(dylanTopBlockTarget).html(json.data.content_top);
    $(dylanBottomBlockTarget).html(json.data.content_bottom);

    convertLinks(dylanTopBlockTarget);
    convertLinks(dylanBottomBlockTarget);
    */
  
    if(json.data.background)
      $(dylanFooterTarget).html(json.data.background);
  
    $(dylanAjaxTarget).html(json.data.text).fadeIn('fast', function(){
      placeDylanCredits();
      $(dylanCreditsTarget).css({visibility: 'visible', display: 'none'});
      $(dylanCreditsTarget).fadeIn();
    });

    //placeDylanCredits();
    //$(dylanCreditsTarget).fadeIn();

    // TESTING
    $("span.comment_forbidden a").attr("rel", "ajaxsubmit");
    /*
    $("span.comment_forbidden a").each(function() {
    });	
    */

    convertLinks(dylanAjaxTarget);
    convertLinks(dylanAjaxTabsTarget);

    $('.nyroModal').each (function(){
      dylan_debug("Adding manual nyroModal.");
      //$(this).nyroModal();
      $(this)
	.unbind("click")
	.click(function(){
	  if(this.className.indexOf("dim_") > -1) {
	var dimensions = this.className.substr(this.className.indexOf("dim_"));
	    dylan_debug('SHOWING WITH A CERTAIN SIZE: ' + dimensions);
	var modalWidth = dimensions.substring(4, dimensions.indexOf("x"));
	var modalHeight = dimensions.substr(dimensions.indexOf("x") + 1);	        
	    $(this).nyroModalManual({
	      autoSizable: false,
	      resizeable: false,
	      minWidth: parseInt(modalWidth) + 40,
	      minHeight: parseInt(modalHeight) + 40,
	  endShowContent: endShowPhotoVideoContent
	    });

	    /*
	      width: (modalWidth * 100),
	      height: (modalHeight * 100),
	*/
	/*
	    $(this).nyroModalManual({
	      endFillContent: dylanEndFillContent,
	      customWidth: width,
	      customHeight: height
	    });
	    */
	  } else {
	    dylan_debug('SHOWING WITHOUT A CERTAIN SIZE');
	    $(this).nyroModalManual({
	      endShowContent: endShowPhotoVideoContent
	    });
	  }
	  return false;
	});
    });
  
    // Process forms.
    $(dylanAjaxTarget).find("form").not("form#views-filters").each(function() {
      applyAjaxSubmit(this);
    });

    $(dylanAjaxTarget).find("form#views-filters").each(function() {
      applyViewsFilter(this);
    });
    
    activateCalendarTips();	
    activateMiscClueTips();
    activateIWasThereClueTips();

    hideLoadingScreen();

    // No more bad scrolly.
    if(dylanScrollTarget) {
      scrollTo(dylanScrollTarget);
      dylanScrollTarget = null;
    } else {
      $.scrollTo(0);
    }

    _dylan_analytics(json);

    reFireReady();
  } else {
    dylan_debug("Could not load JSON.");
    SWFAddress.back();
  }
}

function _dylan_analytics (json)
{
    // google analytics integration into our framework
    var ga = Drupal.settings.googleanalytics;
    if ( ga )
    {
      var url = SWFAddress.getValue();
      dylan_debug("Analytics Track: " + url);
      if (ga.LegacyVersion) {
	urchinTracker(url);
      }
      else {
	pageTracker._trackPageview(url);
      }
    }
}


function reFireReady() { 
  $.readyList = dylanReadyList;
  // Stolen from the jQuery 1.2.6 source.
  // If there are functions bound, to execute
  if ( jQuery.readyList ) {
    // Execute all of them
    jQuery.each( jQuery.readyList, function(){
      // dylan_debug(this);
      this.call( document );
    });

    // Trigger any bound ready events
    //jQuery(document).triggerHandler("ready");
  }
}

/*
// For the nyroModal endFillContent() event.
function dylanEndFillContent(elts, settings) {
  //dylan_debug(settings.customWidth);
  //dylan_debug(settings.customHeight);
  //elts.wrapper.css("border", "20px solid blue");
  //elts.content[0].width(400).height(300);
  //elts.wrapper.height(settings.customHeight).width(settings.customWidth);
  //elts.wrapper.css("height", settings.height + "px").css("width", settings.width + "px");
  //dylan_debug(elts.content[0].className);
  //dylan_debug(width + ' x ' + height);
  //elts.content.width(settings.width).height(settings.height);
  dylan_debug("MODALWIDTH: " + settings.minWidth);
  dylan_debug("MODALHEIGHT: " + settings.minHeight);

  //for(var i in elts) {
  //  dylan_debug(i);
  //  elts[i].width(settings.width).height(settings.height);  
  //}
}
*/

function applyViewsFilter(form) {  
  $(form).submit(function() {
    var items = '?';

    $(this).find('input[@type=text]').each(function() {
      items += this.name + "=" + escape(this.value) + "&";
    });
    $(this).find('select').each(function() {
      items += this.name + "=" + escape(this.value) + "&";
    });
  
    items = items.substr(0, items.length - 1);
    
    var currentPath = this.action;
    currentPath = currentPath.replace(dylanBaseUrl, '');
    
    if(currentPath.indexOf('?') > 0) {
      setSWFAddressValue(currentPath.substr(0, currentPath.indexOf('?')) + items);
      //SWFAddress.setValue(currentPath.substr(0, currentPath.indexOf('?')) + items);
    }
    else {
      setSWFAddressValue(currentPath + items);    
      //SWFAddress.setValue(currentPath + items);    
    }
    
    return false;
  });
}

function activateMiscClueTips() {
  $(document).ready(function() {
    $("a.cluetip").cluetip({
      splitTitle: '|',
      cluetipClass: 'dylan',
      dropShadow: false,
      positionBy: 'bottomTop'
    });
  });
}

function activateIWasThereClueTips() {
  $(document).ready(function() {
    $("div.iwasthere a.tip").unbind("click").cluetip({
      splitTitle: '|',
      positionBy:   'fixed',
      topOffset:    -190,
      leftOffset:   25,
  	  width:        500,
  	  cluetipClass: 'wasThere',
  	  height:       168,
  	  showTitle:    false,
  	  dropShadow:   false,
  	  fx: {             
        open:       'show', // can be 'show' or 'slideDown' or 'fadeIn' //openSpeed:  'fast',        
        close:      'hide'
      }
    });
  });
}

function activateCalendarTips() {
  $(document).ready(function() {
    $("div.calendar-calendar table tr td div.day-on a").click(function() {
      return false; 
    }).attr("rel", "#tour-popup-outer")
    .cluetip({
      positionBy:   'fixed',
      topOffset:    -160,
      leftOffset:   -40,
      local:        true,
      sticky:       false,
  	  cluetipClass: 'dylan',
  	  width:        246,
  	  height:       168,
  	  showTitle:    false,
  	  dropShadow:   false,
  	  onActivate:   showCalendarTip,
      fx: {             
        open:       'show', // can be 'show' or 'slideDown' or 'fadeIn' //openSpeed:  'fast',        
        close:      'hide'
      }
    });
  });
}

/*
      hoverIntent: {
        sensitivity:  1,
        interval:     100,
        timeout:      100    
      }
*/

function showCalendarTip(e) {
  // TODO: Do in theme.
  $(dylanTourPopupTarget).html(e.parent().parent().find("div.view-item").html().replace('</div><div class="view-field view-data-node-data-field-state-field-state-value">', ', '));
  //convertLinks(dylanTourPopupTarget);
  return true;
}

function renderPage(path) {
  // We use SWFAddress.getValue() to obtain the hash value WITH the query string included.
  // path does not include the query string.
  var dest = SWFAddress.getValue();
  var query = undefined;

  /*  
  var destination = undefined;

  if(dest.indexOf('destination=') > 0) {
    destination = dest.substring(dest.indexOf('destination=') + 12);
  }
  */

  if(dest.indexOf('?') > 0) {
    query = dest.substring(dest.indexOf('?') + 1);
    dylan_debug('renderPage Query String: ' + dest.substring(dest.indexOf('?') + 1));
  }

  if(path.length > 1 && path.charAt(0) == '/')
    path = path.substring(1);
  else if(path == '/')
    path = dylanBaseUrl;

  if(dylanCurrentRequest != null)
    dylanCurrentRequest.abort();
 
  var params = {method: 'dylan.renderPage', path: path};
 
  if (query) {
    params.query = query;
    //params.destination = destination;
  }
 
  // TODO: Better handling of path in case there is already a query string!
  //dylanCurrentRequest = $.post(dylanJsonUrl, {method: 'dylan.renderPage', path: path}, pageReceived);
  dylanCurrentRequest = $.ajax({
    url:     dylanJsonUrl,
    data:    params,
    success: pageReceived,
    error:   handleAjaxError,
    type:    'POST'
  });

  showLoadingScreen();
}

$(document).ready(function() {
  if(dylanFirstLoad) {
    if(SWFAddress.getValue() != '/' && SWFAddress.getValue != '') {
      $(dylanAjaxTarget).html('').hide();
      $(dylanFooterTarget).html('').hide();
      $(dylanCreditsTarget).hide();
    }

    convertLinks(dylanAjaxTarget);
    convertLinks(dylanAjaxTabsTarget);
    dylanReadyList = $.readyList;
  }

  $('.user-profile .promo_download_box .close').click(function() {
  });

  /*
  convertLinks("#primary");
  convertLinks("#site-name");
  convertLinks("#content-header div.breadbcrumb");
  */
});

function setSWFAddressValue(value) {
  if(value.indexOf('#') > 0) {
    dylanScrollTarget = value.substr(value.indexOf('#'));
    value = value.substr(0, value.indexOf('#'));
  }
  
  SWFAddress.setValue(value);
}

function convertLinks(cssSelector) {
	// Take over any links without a .noajax class.
	$(cssSelector).find("a").not(dylanAjaxExcluded).each(function()
	{
	  // Filter out target="_blank" links?
	  // Filter out http:// links, or at least those that go offsite.	
	  // also ignore anything that is a js or has rel="noajax" set

	  if (
	    // target must be empty or _self/_parent/_top
	    ( this.target == '_self'
	      || this.target == '_parent'
	      || this.target == '_top'
	      || this.target == '' )

	    // offsite http: links
	    && ! (this.href.toLowerCase().indexOf('http://') == 0
	      && this.href.toLowerCase().indexOf('http://dylan.primedrupal.com/') == -1
	      && this.href.toLowerCase().indexOf('http://testing.bobdylan.com/') == -1
	      && this.href.toLowerCase().indexOf('http://bobdylan.com/') == -1
	      && this.href.toLowerCase().indexOf('http://www.bobdylan.com/') == -1)

	    // ignore javascript: and mailto: links
	    && this.href.indexOf('javascript:') == -1
	    && this.href.indexOf('mailto:') == -1

	    // and let a manual rel='noajax' also bypass
	    && this.rel != "noajax"
	    )
	  {
	    $(this).click(function() {
	      dylanFormPopup = false;
	      path = this.href.replace(dylanBaseUrl, '');
	      setSWFAddressValue(path);
	      //SWFAddress.setValue(path);
	      return false;
	    });
	  }
	});

	$(cssSelector).find(dylanAjaxExcluded).each(function() {
		// Filter out target="_blank" links?
		// Filter out http:// links, or at least those that go offsite.	
		$(this).click(function() {
		path = this.href.replace(dylanBaseUrl, '');
			//$.post(dylanJsonUrl, {method: 'dylan.renderForm', path: path}, formReceived);

        dylanCurrentRequest = $.ajax({
          url:     dylanJsonUrl,
          data:    {method: 'dylan.renderForm', path: escape(path)},
          success: formReceived,
          error:   handleAjaxError,
          type:    'POST'
        });
        
			return false;
		});
	});

	/*	
	$(cssSelector).find(dylanAjaxExcluded).nyroModal().each(function() {
		this.href = this.href + "?ajaxsubmit=true";
	});
	*/
}

function dylanClearPromo() {
  $('.download_promo_box').remove();
  $.ajax({url:dylanJsonUrl,data:{method:'dylan.hidePromo'},type:'POST'});
  
  return false;
}

function handleAjaxError(XMLHttpRequest, textStatus, thrownError) {
  hideLoadingScreen();
  
  if(thrownError)
    dylan_debug("AJAX Error! Thrown: " + thrownError);
  dylan_debug("AJAX Error! Status: " + textStatus);
  
  // Get outta there!
  SWFAddress.back();
};

/* Here be ExternalInterface. YArr. */

function dylanPopUpLogin() {
  dylanCurrentRequest = $.ajax({
    url:     dylanJsonUrl,
    data:    {method: 'dylan.renderForm', path: 'user/login'},
    success: formReceived,
    error:   handleAjaxError,
    type:    'POST'
  });  
}

function dylanPopUpRegister() {
  dylanCurrentRequest = $.ajax({
    url:     dylanJsonUrl,
    data:    {method: 'dylan.renderForm', path: 'user/register'},
    success: formReceived,
    error:   handleAjaxError,
    type:    'POST'
  });  
}

function dylanGotoNode(nid) {
  setSWFAddressValue('/node/' + nid);
  //SWFAddress.setValue('/node/' + nid);
}

// Focus first element
$.fn.focus_first = function(skip) {
  var elem = $('input:visible', this).get(0);
  var select = $('select:visible', this).get(0);
  if (select && elem) {
    if (select.offsetTop < elem.offsetTop) {
      elem = select;
    }
  }
  var textarea = $('textarea:visible', this).get(0);
  if (textarea && elem) {
    if (textarea.offsetTop < elem.offsetTop) {
      elem = textarea;
    }
  }
  
  if (elem) {
    if($.browser.mozilla && skip != true) {
      setTimeout("mozillaFocus()", 100);
    }

    elem.focus();
    
  }
  return this;
}

function mozillaFocus() {
  $('#nyroModalFull form').focus_first(true);
}
