/* Creates and sends an AJAX request */
function AJAXCall(args) {
  if (!args || !args.url) return false;
  if (!args.loadHandler) args.loadHandler = defaultLoadHandler;

  if (args.showDialog || args.showLoading) {
    showDialog('<img src="/widget_studio/images/ajax-loader.gif" width="100px" height="100px"/>');
  }

  if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    var http_request = new XMLHttpRequest();
  }
  else if (window.ActiveXObject) { // IE
    var http_request = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else {
    alert("Your browser does not support AJAX!");
    return false;
  }
  
  // Set the call back function to invoke once the response is received
  http_request.onreadystatechange = function(type) {
    if (http_request.readyState == 4) {
      if (http_request.status == 200)
        args.loadHandler(type,http_request.responseText,args);
      else
        alert('There was a problem with the request.');
    }
  };

  // Send the request
  // append a random number to the request to prevent browser cache
  args.url += (args.url.indexOf("?") > 0) ? "&"+Math.random() : "?"+Math.random();
  http_request.open("GET", args.url, true);
  http_request.send(null);
}

function defaultLoadHandler(type, data, args) {
  // Do nothing if an empty space is returned
  if (data == "&nbsp;") return;

  // Set the response into the content pane
  if (args.showDialog) {
    showDialog(data);
  }
  else {
    var div_id = (args.recipient) ? args.recipient : "content_pane";
    var recipientDiv = $(div_id);
    if (recipientDiv) {
      recipientDiv.innerHTML = data;
      recipientDiv.style.display = 'block';
      // Enable/Disable "My Widgets" link
      if (args.url.indexOf('addWidget') > 0) {
        var widget_count = parseInt(data.substring(data.indexOf('There are ')+10, data.indexOf(' widget')));
        if ($('my_gallery')) {
          $('my_gallery').style.display = (widget_count == 0) ? 'none' : 'inline';
        }
      }
    }
  }
}

function $(id) {
  return document.getElementById(id);
}

function displaySection(divId) {
  $(divId).style.display = 'block';
  $(divId+'_img').src = '/widget_studio/images/'+divId+'_on_button.gif';
  switch(divId) {
    case 'overview':
      $('team').style.display = 'none';
      $('technology').style.display = 'none';
      $('team_img').src = '/widget_studio/images/team_off_button.gif';
      $('technology_img').src = '/widget_studio/images/technology_off_button.gif';
      break;
    case 'team':
      $('overview').style.display = 'none';
      $('technology').style.display = 'none';
      $('overview_img').src = '/widget_studio/images/overview_off_button.gif';
      $('technology_img').src = '/widget_studio/images/technology_off_button.gif';
      break;
    case 'technology':
      $('overview').style.display = 'none';
      $('team').style.display = 'none';
      $('overview_img').src = '/widget_studio/images/overview_off_button.gif';
      $('team_img').src = '/widget_studio/images/team_off_button.gif';
      break;
  }
}

function write_object(embedded_object) {
  document.write(embedded_object);
  document.write('\n');
}

function submitWidgetPreferences() {
  var formElem = document.forms['widget_preferences_form'];
  if (!formElem) return;
  var requestArgs = '';
  for(var i=0; i<formElem.elements.length; i++) {
    var inputElem = formElem.elements[i];
    if(inputElem.type != 'radio' || inputElem.checked) {
      requestArgs += (requestArgs == '') ? "?" : "&";
      requestArgs += inputElem.name + "=" + inputElem.value;
    }
  }
  var args = {url: "/widget_studio/service/saveWidgetPreferences"+requestArgs, recipient: "message_area"};
  AJAXCall(args);
}

function openWidget(widget_id, workarea) {
  if ($("dashboard")) {
    var args = {url: "/widget_studio/service/renderDashboard?widget_id="+widget_id+'&workarea='+workarea, recipient: "dashboard"};
    AJAXCall(args);
  }
  else {
    location.href='/widget_studio/dashboard?widget_id='+widget_id;
  }
}

function loadWidget(widget_id) {
  location.href='/widget_studio/dashboard?widget_id='+widget_id;
}

function mobilize() {
  var mobileNumber = $("mn").value;

  if (isNaN(mobileNumber)) {
    alert("Please enter a valid mobile number");
    return;
  }
  
  var mobileCarrier = $("mc").value;
  
  if (mobileCarrier == -1) {
    alert("Please choose a mobile number");
    return;
  }

  var args = {
    url: "/widget_studio/service/mobilize?mn="+mobileNumber+"&mc="+escape(mobileCarrier),
    recipient: "message_area"
  };

  AJAXCall(args);
}

function shareWidget() {
  var args = {
    url: "/widget_studio/service/shareWidget?name="+$('sw_name').value+"&email="+$('sw_email').value+"&message="+$('sw_message').value,
    recipient: "message_area"
  }
  AJAXCall(args);
}

function shareApp() {
  // Extract user input
  var name = $('name').value;
  var email = $('email').value;
  var message = $('message').value;

  // Error handling - required field check
  if (email == '' || name == '' || message == '') {
    alert('Please fill in required fields');
    return;
  }
  
  // Submit request
  AJAXCall({
    url: '/widget_studio/service/shareApp?name='+name+'&email='+email+'&message='+message,
    recipient: 'message_area',
    showDialog: 'true'
  });
}

function submitFeedback() {
  // Extract user input
  var email = $('user_email').value;
  var feedback = $('user_feedback').value;

  // Error handling - required field check
  if (email == '' || feedback == '') {
    alert('Please fill in required fields');
    return;
  }
  
  // Show loading bar
  $('message_area').innerHTML = '<img src="/widget_studio/images/ajax-loader.gif"/>';

  // Submit request
  AJAXCall({
    url: '/widget_studio/service/submitFeedback?email='+email+'&feedback='+feedback,
    recipient: 'message_area'
  });
}

/**
 * Function that triggers scrolling of the dashboard when window scroll takes place
 *
 */
window.onscroll = function scroll() {
  var dashboard = $('dashboard');
  if(dashboard) {
    var docScrollTop = document.documentElement.scrollTop;
    if (docScrollTop == 0) docScrollTop = document.body.scrollTop;
    if (docScrollTop+dashboard.offsetHeight < dashboard.parentNode.parentNode.offsetHeight) {
      dashboard.style.top = docScrollTop + 'px';
    }
  }
}

var current_image_node = 'preferences-';
function dashboardAction(args) {
  if (args.image_node) {
    if (args.image_node == 'add_button') {
      $(args.image_node).src
        = $(args.image_node).src.indexOf('add-to-gallery-off.gif') > 0
        ? '/widget_studio/images/remove_from_gallery_off.gif'
        : '/widget_studio/images/add-to-gallery-off.gif';
    }
    else {
      if ($(current_image_node)) {
        $(current_image_node).src = "/widget_studio/images/"+current_image_node+"off.gif";
      }
      $(args.image_node).src = "/widget_studio/images/"+args.image_node+"on.gif";
      current_image_node = args.image_node;
    }
  }
  document.documentElement.scrollTop = 0;
  document.body.scrollTop = 0;
  $('widget_action_response').style.display = 'none';
  AJAXCall(args);
}

/**
 * Function that finds and returns list of child nodes matching the given tag name
 **/
function getChildNodesByTagName(node_id, tag_name) {
  // Validate the input
  if (node_id == null || tag_name == null) {
    return [];
  }
  
  // Get a handle to the parent node
  var node = $(node_id);
  
  // If the parent node not found, return immediately
  if (!node) {
    return [];
  }
  
  // Variable to store list of matching child nodes
  var child_nodes = [];
  
  // Variable to keep track of the count of matching child nodes
  var count = 0;
  
  // Loop through each child node and identify the ones which are panes (nodes of type 'DIV')
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].tagName == tag_name) {
      child_nodes[count++] = node.childNodes[i];
    }
  }

  // Return the list
  return child_nodes;
}

function showNextWidget(channel_prefix) {
  // Get all widget nodes
  var widgets = getChildNodesByTagName(channel_prefix+"_widget", "DIV");
  
  // Find out the current widget node
  for (var i = 0; i < widgets.length; i++) {
    if (widgets[i].style.display == "block") break;
  }

  // Show next widget if the current one is not last in the list
  if (i < widgets.length - 1) {
    widgets[i].style.display = "none";
    widgets[i+1].style.display = "block";
    if (i == widgets.length - 2) $(channel_prefix+"_next").src = '/widget_studio/images/light-arrow-rt.gif';
  }

  // Enable previous button
  if (i == 0)  $(channel_prefix+"_prev").src = '/widget_studio/images/dark-arrow-lft.gif';
}

function showPreviousWidget(channel_prefix) {
  // Get all widget nodes
  var widgets = getChildNodesByTagName(channel_prefix+"_widget", "DIV");
  
  // Find out the current widget node
  for (var i = 0; i < widgets.length; i++) {
    if (widgets[i].style.display == "block") break;
  }

  // Show previous widget if the current one is not the first one in the list
  if (i > 0) {
    widgets[i].style.display = "none";
    widgets[i-1].style.display = "block";
    if (i == 1) $(channel_prefix+"_prev").src = '/widget_studio/images/light-arrow-lft.gif';
  }

  // Enable previous button
  if (i == widgets.length-1)  $(channel_prefix+"_next").src = '/widget_studio/images/dark-arrow-rt.gif';
}

function createWidget() {
  var requestArgs = "?feed_category="+$("feed_category").value
                  + "&feed_provider="+$("feed_provider").value
                  + "&feed_edition="+$("feed_edition").value
                  + "&feed_url="+escape($("feed_url").value);
  AJAXCall({url:"/widget_studio/service/createWidget/"+requestArgs, recipient:"message_area"});
}
