if (!window.XMLHttpRequest) XMLHttpRequest = function()
{
  try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e){}
  try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e){}
  try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
  try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e){}
  throw new Error("Could not find an XMLHttpRequest alternative.")
};

// Function comes from Google App Engine article 
// <http://code.google.com/appengine/articles/rpc.html>
function Request(function_name, opt_argv) {
    if (!opt_argv) {
        opt_argv = new Array();
    }
    var callback = null;
    var len = opt_argv.length;
    if (len > 0 && typeof opt_argv[len-1] == 'function'){
        callback = opt_argv[len-1];
        opt_argv.length--;
    }
    var async = (callback != null);

    //Arguements to URI
    var query = 'action=' + encodeURIComponent(function_name);
    for (var i=0; i < opt_argv.length; i++) {
        var key = 'arg' + i;
        var val = JSON.stringify(opt_argv[i]);
        query += '&' + key + '=' + encodeURIComponent(val);
    }
    //IE cache workaround
    query += '&time=' + new Date().getTime();

    var req = new XMLHttpRequest();
//    if (req) { alert("Is request"); } else { alert("No request"); }

    req.open('GET','/rpc?' + query, async);
    if (async) {
        req.onreadystatechange = function() {
            if (req.readyState == 4 && req.status == 200) {
              var response = null;
              try {
                response = JSON.parse(req.responseText);
              } catch (e) {
                response = req.responseText;
              }
              callback(response);
           }
        }
     }

    req.send(null);
}

function InstallFunction(obj,name) {
  obj[name] = function() { Request(name,arguments); }
}


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


/*
 * getPeople()
 *
 */
function getPeople() {
  //Request('People',[$('collection').value]);
  server.People($('collection').value,getPeopleSuccess);
}

/*
 * getPeopleSuccess()
 *
 */
// Callback for successful getPeople
function getPeopleSuccess(response) {
  // Clears both creators select fields
  $('all_creators').options.length = 0;
  $('my_creators').options.length = 0; 
  for (var i=0;i <= response.length;i++) {
    $('all_creators').options[i] = new Option(value=response[i][1],text=response[i][0]);
  }
}

function getSubjects() {
  server.Subjects($('collection').value,getSubjectsSuccess);
}

function getSubjectsSuccess(response) {
  $('all_subjects').options.length = 0;
  $('my_subjects').options.length = 0;
  for (var i=0; i <= response.length;i++) {
    $('all_subjects').options[i] = new Option(response[i][1],response[i][0]);
  }
}

function RefreshResourceFields(step) {
  switch(step) { 
   case 1: {
     //getGenres();
     getPeople();
     getSubjects();
     break;
   }
   case 2: {
     getSubjects();
     break;
   }
   default: break;
   }
}

function getUpdateSuccess(response) {
  if(response == true) {
      return true;
  } else {
      return false;
  }
}

// Resource and related data classes functions
function enableElement(element_id) {
   target_element = document.getElementById(element_id);
   if(target_element.disabled==true) {
     target_element.disabled=false;
   } else {
     target_element.disabled=true;
   }
}

function enableElements(element_array) {
   for(counter in element_array) {
       enableElement(element_array[counter]);
    }
}

function updateResource(resource_key,resource_attribute,element_id) {
  element = document.getElementById(element_id);
 //alert("Resource key: " + resource_key + " Resource attribute: " + resource_attribute + " element value: " + element.value);
  server.UpdateResource(resource_key,resource_attribute,element.value,getUpdateSuccess);
}

function QuickUpdate(resource_attribute, element_id) {
  resource_element = document.getElementById('resource_key');
  resource_key = resource_element.value;
  updateResource(resource_key,resource_attribute,element_id);
}

function SaveTitleHandler(counter_var,title_key) {
  title_element_id = 'title_name' + counter_var;
  title_qualifier_element_id = 'title_type' + counter_var;
  save_button_id = 'save_title' + counter_var
  updateResource(title_key,'value',title_element_id);
  updateResource(title_key,'qualifier',title_qualifier_element_id);
  enableElements(new Array(title_element_id,title_qualifier_element_id,save_button_id));
  alert('Title updated');
}
  
  function getAddTitleSuccess(response) {
      if (response) {
          return true;
      } else {
          return false;
      }
  }
  
  function AddTitleHandler() {
    new_title_element = document.getElementById('add_title_value');
    new_title_type_element = document.getElementById('add_title_type');
    resource_key = document.getElementById('resource_key');
    //alert("Resource key: " + resource_key.value + " Title: " + new_title_element.value + " Type: " + new_title_type_element.value);
    server.AddFieldtoResource(resource_key.value,new_title_element.value,new_title_type_element.value,getAddTitleSuccess);
  }
  
  function getDeleteTitleSuccess(response) {
    if (response) {
        return true;
    } else {
        return false;
    }
  }
  
  function DeleteTitleHandler(title_key,p_id) {
    resource_key = document.getElementById('resource_key');
    if(confirm("Are you sure you want to delete this title?")) {
      server.DeleteTitleFromResource(resource_key.value,title_key,getDeleteTitleSuccess);
      p_element = document.getElementById(p_id);
      p_element.parentNode.removeChild(p_element);
    }
  }
  
  function getAddGenreSuccess(response) {
      alert("Response is " + response[0]);
      // Should add li to genre list, should try to sort as well
      //genre_list = document.getElementById('genre_ul');
      //new_li = document.createElement("li");
      //content = document.createTextNode(
      return true;
  }
  
  function AddGenreHandler() {
    resource_key = document.getElementById('resource_key');
    new_genre = document.getElementById('add_genre_list');
    server.AddGenreToResource(resource_key.value,new_genre.value,getAddGenreSuccess);
  }
  
  function getDeleteGenreSuccess(response) {
    return true;
  }
  
  function DeleteGenreHandler(genre_id,li_id) {
    resource_key = document.getElementById('resource_key');
    if(confirm("Are you sure you want to remove this genre?")) {
      server.DeleteGenreFromResource(resource_key.value,genre_id,getDeleteGenreSuccess);
      li_element = document.getElementById(li_id);
      li_element.parentNode.removeChild(li_element);
    }
  }
  
  function AddCreatorHandler() {
    resource_key = document.getElementById('resource_key');
    alert("AddCreatorHandler: " + resource_key.value);
  }
 
  function getDeletePubSuccess(response) {
    return true;
  }

  function DeletePubHandler(publisher_key) {
    resource_key = document.getElementById('resource_key');
    if(confirm("Are you sure you to remove this publisher?")) {
      server.DeletePublisherFromResource(resource_key.value,publisher_key,getDeletePubSuccess);
      enableElement('add_publisher');
    }
  }

  function getAddPubSuccess(response) {
    return true;
 }

  function AddPubHandler() {
    resource_key = document.getElementById('resource_key');
    publisher_key = document.getElementById('new_publisher');
    server.AddPublisherToResource(resource_key.value,publisher_key.value,getAddPubSuccess);
 }

  function getAddSubjectSuccess(response) {
    return true;
 }

  function AddSubjectHandler() {
    resource_key = document.getElementById('resource_key');
    subject_key = document.getElementById('new_subject');
    alert("Subject key value= " + subject_key.value);
    server.AddSubjectToResource(resource_key.value,subject_key.value,getAddSubjectSuccess);
    
 }
 
function getDeleteSubjectSuccess(response) {
  return true;
}
 
 
function DeleteSubjectHandler(subject_key,subject_li){
  resource_key = document.getElementById('resource_key');
  if(confirm("Are you sure you want to remove this subject?")){
     server.DeleteSubjectFromResource(resource_key.value,subject_key,getDeleteSubjectSuccess);
     li_element = document.getElementById(subject_li);
     li_element.parentNode.removeChild(li_element);
  }
}

function getSetSubscriptionSuccess(response) {
  alert("Subscription status changed");
  return true;

}

function SubscriptionHandler() {
   is_subscription = document.getElementById('subscription');
   resource_key = document.getElementById('resource_key');
   if(is_subscription.value){
     server.SetResourceSubscription(resource_key.value,true,getSetSubscriptionSuccess);
   } else {
     server.SetResourceSubscription(resource_key.value,false,getSetSubscriptionSuccess);
   }
}

function getSetURLSuccess(response){
 alert("Base URL changed");
 enableElements(new Array('base_url','save_base_url'));
}



function BaseURLHandler() {
  resource_key = document.getElementById('resource_key');
  base_url = document.getElementById('base_url');
  alert("Resource key: " + resource_key.value + " base_url: " + base_url.value);
  server.SetResourceURL(resource_key.value,base_url.value,getSetURLSuccess);
  }
  
function moveSelect(org_select,new_select) {
  var OriginalItems = new Array();
  var NewItems = new Array();
  var LookUp = new Array();
  OriginalSelect = $(org_select);
  NewSelect = $(new_select);
  for (var i=0; i < NewSelect.options.length; i++) {
    LookUp[NewSelect.options[i].text] = NewSelect.options[i].value;
    NewItems[i] = NewSelect.options[i].text;
  }
  
  var org_length = 0;
  var new_length = NewItems.length;
  for (var i=0; i < OriginalSelect.options.length; i++) {
    option_value = OriginalSelect.options[i].value;
    option_text = OriginalSelect.options[i].text;
    option_key = new String(option_text);
    LookUp[option_key] = option_value;
    is_selected = OriginalSelect.options[i].selected
    if (OriginalSelect.options[i] != "") {
      has_content = true;
    } else {
      has_content = false;
    }
    if(is_selected && has_content) {
      //NewItems[new_length] = $(org_select).options[i].text;
      NewItems[new_length] = option_text;
      new_length++;
    } else {
      //OrginalItems[org_length] = $(new_select).options[i].text;
      OriginalItems[org_length] = option_text;
      org_length++;  
    }
  }
  OriginalItems.sort();
  NewItems.sort();
  OriginalSelect.length = 0;
  NewSelect.length = 0;
  for (var c=0; c < OriginalItems.length; c++) {
    var no = new Option();
    no.value = LookUp[OriginalItems[c]];
    no.text = OriginalItems[c];
    OriginalSelect[c] = no;
  }
  for (var c=0; c < NewItems.length; c++) {
    var no = new Option();
    no.value = LookUp[NewItems[c]];
    no.text = NewItems[c];
    NewSelect[c] = no;
  }
}

    
function selectAll(select_list) {
  select_element = $(select_list);
  for(var i=0; i < select_element.options.length; i++) {
    select_element.options[i].selected = true;
  }
}

/*
 * Function selects all multiple select fields before the form is posted to
 * the server.
 */
function resourceSubmit() {
  var select_fields = ['my_genres','my_subjects','my_creators'];
  for(var i=0; i < select_fields.length; i++) {
    selectAll(select_fields[i]);
  }
  return true;
}

/*
 * Used to expand descripton for popular resources on WSC main page.
 *
 */
function expandDescription(anchor,target_div_id) {
  desc_div = document.getElementById(target_div_id);
  if (desc_div.style.visibility == 'hidden') {
    desc_div.style.visibility = 'visible';
    desc_div.style.display='block';
  } else {
    desc_div.style.visibility = 'hidden';
    desc_div.style.display='none';
  }
}

var server = {};
InstallFunction(server,'People');
InstallFunction(server,'Subjects');
InstallFunction(server,'UpdateResource');
InstallFunction(server,'AddFieldtoResource');
InstallFunction(server,'DeleteTitleFromResource');
InstallFunction(server,'AddGenreToResource');
InstallFunction(server,'DeleteGenreFromResource');
InstallFunction(server,'DeletePublisherFromResource');
InstallFunction(server,'AddPublisherToResource');
InstallFunction(server,'DeleteSubjectFromResource');
InstallFunction(server,'AddSubjectToResource');
InstallFunction(server,'SetResourceSubscription');
InstallFunction(server,'SetResourceURL');
