/*
tasklist.js
2008-01-30 (mca)
2008-02-01 (mca) : added support for application/json
2008-02-03 (mca) : added support for application/atom+xml
*/

// shared vars
g_etag = '';
g_url = '';
g_id = '';
g_ctype_ck = 'tasklist-ctype';
g_ctype = 'text/xml'; // default type

// init form
window.onload = function() {
    var f,coll,i,n,ck;
    
    // handle form event and url
    f = document.getElementsByTagName('form')[0];
    if(f) 
    {
        f.onsubmit = function(){ return validateForm();};
        url = f.getAttribute('action');
    }
    
    // handle toggle event
    coll = document.getElementsByClassName('done','a');
    for(i=0;i<coll.length;i++) 
    {
        coll[i].onclick = toggleItem;
    }
    
    // handle delete event
    coll = document.getElementsByClassName('delete','a');
    for(i=0;i<coll.length;i++) 
    {
        coll[i].onclick = deleteItem;
    }
    
    // set content-type for this user
    ck = readCookie(g_ctype_ck);
    if(ck===null || ck.length===0)
    {
        createCookie(g_ctype_ck,g_ctype);
    }
    else
    {
      g_ctype = ck;
    }
    
    // handle content-type radio button event & value
    coll = document.getElementsByNameEx('content-type');
    for(i=0;i<coll.length;i++)
    {
        coll[i].onclick = selectContentType;
        coll[i].checked = (coll[i].value==g_ctype?true:false);
    }
    
    // focus on name input
    n = document.getElementById('name');
    if(n) 
    {
      n.focus();
    }
};

// validate inputs
function validateForm() 
{
    var n,v;
    
    n = document.getElementById('name');
    if(n) 
    {
        v = n.value;
        if(v.trim().length===0) 
        {
            alert('Enter a task first.');
            return false;
        } 
        else 
        {
            return true;
        }
    }
}

// handle content-type radio button
function selectContentType(e)
{
    g_ctype = eventTrigger(e).value;
    createCookie(g_ctype_ck,g_ctype);
}

// delete item
function deleteItem(e) 
{
    var parent = eventTrigger(e).parentNode;
    
    ajax.httpDelete(g_url+parent.id,null,onAjaxComplete,true,'deleteItem');
    
    return false;
}

// toggle status (but get most recent version first)
function toggleItem(e) 
{
     var parent = eventTrigger(e).parentNode;
     
     g_id = parent.id;
     
     ajax.httpHead(g_url+g_id,null,onAjaxComplete,true,'checkItem',{accept:g_ctype});
     
     return false;
}

// put updated item
function updateItem() 
{
    var parent,span,doc,completed;
    
    parent = document.getElementById(g_id);
    span = parent.getElementsByTagName('span')[0];
    completed = (span.className=='to-do'?'1':'0');
    
    // build proper representation
    switch (g_ctype)
    {
        case 'text/xml':
            doc = '<task><name>'+span.innerHTML+'</name><is-completed>'+completed+'</is-completed></task>';
            break;
        case 'application/json':
            var task = {name : span.innerHTML, "is-completed" : completed};
            doc = JSON.stringify(task);
            break;
        case 'application/atom+xml':
            doc = '<entry><title>'+span.innerHTML+'</title><id>'+g_id+'</id><content type="text/xml"><is-completed>'+completed+'</is-completed></content></entry>';
            break;
        default:
            alert('ERROR:\n\nUnknown content type: ['+g_ctype+']');
            return;        
    }
    
    ajax.httpPut(g_url+g_id,null,onAjaxComplete,(g_ctype.indexOf('xml')!=-1?true:false),'putItem',g_ctype,doc,{'if-match':g_etag});

    return false;
}

// handle ajax callbacks
function onAjaxComplete(response,headers,context,status,msg)
{
  switch(status)
  {
      case 0:
          // ie abort code
          break;
      case 200:   // OK
      case 201:   // Created
      case 202:   // Accepted
      case 204:   // NoContent
          break;
      case 301:
      case 302:
          if(headers.location) {
              location.href=headers.location;
          }
          break;
      default:    // 400 & 500 errors
          if(headers.location) {
              location.href=headers.location;
          } else{
            alert(status+'\n'+msg);
          }
          break;
  }

  switch(context)
  {
    case 'checkItem':
        g_etag = headers.etag || '';
        updateItem();
        break;
    case 'putItem':
        location.reload();
        break;
    case 'deleteItem':
        location.reload();
        break;
    default:
        alert('Unknown context\n'+context);
  }
}


/* handy stuff */
String.prototype.trim = function() 
{ 
    return this.replace(/^\s+|\s+$/g, ""); 
};

function eventTrigger(e) 
{
    if (!e) 
    {
        e = event;
    }
    return e.target || e.srcElement;
}

// extend document object, if needed
if(!document.getElementsByClassName)
{
  document.getElementsByClassName = function(className, tag, elm)
  {
    var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
    tag = tag || "*";
    elm = elm || document;
    var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
    var returnElements = [];
    var current;
    var length = elements.length;
    for(var i=0; i < length; i++){
      current = elements[i];
      if(testClass.test(current.className)){
        returnElements.push(current);
      }
    }
    return returnElements;
  };
}

if(!document.getElementsByNameEx)
{
  document.getElementsByNameEx = function(name, tag, elm)
  {
    tag = tag || "*";
    elm = elm || document;
    var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
    var returnElements = [];
    var current;
    var length = elements.length;
    for(var i=0; i < length; i++){
      current = elements[i];
      if(current.getAttribute('name')==name){
        returnElements.push(current);
      }
    }
    return returnElements;
  };
}

function createCookie(name,value,days)
{
    var date,expires;
    
    if (days) 
    {
        date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    }
    else 
    {
        expires = "";
    }
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
    var c,nameEQ,ca;
    
    nameEQ = name + "=";
    ca = document.cookie.split(';');
    
    for(var i=0;i < ca.length;i++) 
    {
        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 eraseCookie(name)
{
    createCookie(name,"",-1);
}
