var action_url = ''; // default URL for actions
var default_params = new Array(); // default params

org.cote.js.xml.setCacheEnabled(false); // disable libXmlRequest cache feature

var help_window = null;

//------------------------------------------------------------------------
function insertHTML(id, s, append) {
//------------------------------------------------------------------------
  var rqobj = document.getElementById(id);
  
  if (rqobj) {
    if (!append) {
      org.cote.js.xml.removeChildren(rqobj); // clear the inner contents
    }
    rqobj.insertAdjacentHTML('beforeEnd', s); // insert html
  } else {
    alert('Container div with id [' + id + '] not found.');
  }
}

//------------------------------------------------------------------------
function insertStatus(id, s) {
//------------------------------------------------------------------------
  insertHTML(id + '_status', s);
}

//------------------------------------------------------------------------
function insertOKStatus(id, s) {
//------------------------------------------------------------------------
  insertStatus(id, '<span class="ok">' + s + '</span>');
}

//------------------------------------------------------------------------
function insertErrorStatus(id, s) {
//------------------------------------------------------------------------
  insertStatus(id, '<span class="error">' + s + '</span>');
}

//------------------------------------------------------------------------
function urlEncode(s) {
//------------------------------------------------------------------------
  //return escape(s).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27');
  return encodeURIComponent(s);
}

//------------------------------------------------------------------------
function xmlEncode(s) {
//------------------------------------------------------------------------
  return s.replace(/\&/g, '&amp;').replace(/\</g, '&lt;').replace(/\>/g, '&gt;').replace(/\"/g, '&quot;');
}

//------------------------------------------------------------------------
function trim(s) {
//------------------------------------------------------------------------
  return s.replace(/[ \t]{2,}/g, ' ').replace(/^\s*|\s*$/g, '');
}

//------------------------------------------------------------------------
function show(id, on, inline) {
//------------------------------------------------------------------------
  var obj = document.getElementById(id);
  if (typeof(obj) == 'object') {
    if (on) {
      obj.style.display = inline ? 'inline' : 'block';
    } else {
      obj.style.display = 'none';
    }
  }
}

//------------------------------------------------------------------------
function toggle(id) {
//------------------------------------------------------------------------
  var obj = document.getElementById(id);
  if (typeof(obj) == 'object') {
    show(id, (obj.style.display != 'block') && (obj.style.display != 'inline'));
  }
}

//------------------------------------------------------------------------
function showswap(prefix, on) {
//------------------------------------------------------------------------
  show(prefix + '_brief', !on);
  show(prefix + '_full', on);
}

//------------------------------------------------------------------------
function showAll() {
//------------------------------------------------------------------------
  show('show_all', false);
  show('step2', true);
  show('step3', true);
  show('step4', true);
}

//------------------------------------------------------------------------
function resize_height(id, delta) {
//------------------------------------------------------------------------
  var obj = document.getElementById(id);
  if (typeof(obj) == 'object') {
    var h = 0;
	if (obj.offsetHeight) {
      h = obj.offsetHeight;
    } else if (obj.style.pixelHeight) {
      h = obj.style.pixelHeight;
    } else return; // can't determine height
    h = h + delta;
    if (h < 30) return; // min size
    if (h > 1000) return; // max size
    obj.style.height = h;
  }
}

//------------------------------------------------------------------------
function openInBrowser() {
//------------------------------------------------------------------------
  var url = document.getElementById('url').value;
  if (url != '') {
    window.open(url, '_blank');
  }
}

//------------------------------------------------------------------------
function updateTitle() {
//------------------------------------------------------------------------
  var ct = document.getElementById('feed_title').value;
  insertHTML('title', ct ? ct : '&lt;New Feed&gt;')
}

//------------------------------------------------------------------------
function updateLink() {
//------------------------------------------------------------------------
  var url = document.getElementById('url').value;
  var cl_obj = document.getElementById('feed_link');
  if (cl_obj.value == '') {
    cl_obj.value = url;
  }
}

//------------------------------------------------------------------------
function help(topic) {
//------------------------------------------------------------------------
  var ok = (help_window != null);
  var ct = '';
  if (ok) {
    try {
      ct = help_window.current_topic;
      if (typeof(ct) == 'undefined') { // for Mozilla
        ok = false;
      }
    } catch(e) { // for IE
      ok = false;
    }
  }
  if (ok) {
    if (topic != ct) { // if topic changed
      help_window.t(topic);
    }
    help_window.focus(); // bring to front
  } else {
    help_window = window.open('/context-help.html?t=' + topic, 'feed43_context_help',
    'toolbar=0,scrollbars=1,location=0,statusbar=1,menubar=0,resizable=1,width=350,height=450');
    help_window.focus(); // bring to front
  }
}

//------------------------------------------------------------------------
function closeForm(prefix) {
//------------------------------------------------------------------------
  //insertHTML(prefix+'_status', document.getElementById('def_'+prefix+'_status').value);
  show(prefix+'_form', false);
}

//------------------------------------------------------------------------
function redirect(url) {
//------------------------------------------------------------------------
  window.location.href = url;
}

//------------------------------------------------------------------------
function switchUser(name) {
//------------------------------------------------------------------------
  redirect('/users/' + name);
}

//------------------------------------------------------------------------
function accountLinked() {
//------------------------------------------------------------------------
  show('protect_feature', false);
  show('email_feature', false);
  show('link_feature', false);
  show('change_feature', true);
}

//------------------------------------------------------------------------
function switchPlan(id, plan, paid) {
//------------------------------------------------------------------------
  var lnk = document.getElementById('item_link_' + id);
  lnk.className = paid ? 'feed-link plan-paid' : 'feed-link plan-free';
  
  var lbl = document.getElementById('plan_label_' + id);
  lbl.className = paid ? 'plan-paid' : 'plan-free';
  insertHTML('plan_label_' + id, plan); // plan name
  
  insertStatus('switch_to_paid_' + id, '&nbsp;');
  insertStatus('switch_to_free_' + id, '&nbsp;');

  show('switch_to_paid_' + id, !paid, true); // inline
  show('switch_to_free_' + id, paid, true); // inline
}

//------------------------------------------------------------------------
function loadHandler(s, v) {
//------------------------------------------------------------------------
  if (typeof v == 'object') {
    if (typeof v.xdom == 'object' && v.xdom != null && v.xdom.documentElement != null) {
      var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('result')[0];
      var code = n.getAttribute('code');
      var text = n.childNodes[0].nodeValue;
      if (code != 0) {
        insertErrorStatus(v.id, text);
      } else {
        insertOKStatus(v.id, text);
        
        // feed.html
        
        if (v.id == 'get') {
          var n = v.xdom.getElementsByTagName('response')[0];
          /*
          var s = n.getAttribute('encoding');
          if (s) {
            insertHTML('suggest_encoding',
              '<a title="Click to set autodetected encoding" href="javascript:setEncoding(' +
              "'" + s + "'" + ')">' + s + '</a>');
            if (document.getElementById('encoding').value == '') {
              setEncoding(s);
            }
          }
          */
          n = n.getElementsByTagName('raw-data')[0];
          insertHTML('raw_data', n.childNodes[0].nodeValue);
          
          n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('title')[0];
          if (typeof(n) == 'object' && n != null) { // if feed title detected
            var ft_obj = document.getElementById('feed_title');
            if (ft_obj.value == '') { // if title is not set
              ft_obj.value = n.childNodes[0].nodeValue; // set title
              updateTitle(); // because onchange is not fired automatically
            }
            var fd_obj = document.getElementById('feed_description');
            if (fd_obj.value == '') { // if description is not set
              fd_obj.value = n.childNodes[0].nodeValue; // set description the same as title
            }
          }
          updateLink();
          show('step2', true);
          return;
        }

        if (v.id == 'search') {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('raw-data')[0];
          insertHTML('clipped_data', n.childNodes[0].nodeValue);
          show('step3', true);
          return;
        }

        if (v.id == 'build') {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('raw-data')[0];
          insertHTML('preview', n.childNodes[0].nodeValue);
          show('step4', true);
          show('show_all', false);
          return;
        }

        if (v.id == 'rename') {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('feed-name')[0];
          if (typeof(n) == 'object' && n != null) { // if new feed name defined
            var fname = n.childNodes[0].nodeValue;
            n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('feed-link')[0];
            var flink = n.childNodes[0].nodeValue;
            n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('edit-link')[0];
            var elink = n.childNodes[0].nodeValue;
            
            document.getElementById('name').value = fname;
            document.getElementById('rename').value = fname;
            insertHTML('feed-link', flink);
            document.getElementById('feed-link').setAttribute('href', flink);
            insertHTML('edit-link', elink);
            document.getElementById('edit-link').setAttribute('href', elink);
          }
          setTimeout('closeForm("rename")', 1000);
          return;
        }

        if (v.id == 'link_account') {
          setTimeout("accountLinked()", 1000);
          return;
        }
        
        if ((v.id == 'protect_edit') || (v.id == 'change_protect')) {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('auth')[0];
          var auth = '';
          if (typeof(n) == 'object' && n != null) { // if new auth defined
            auth = n.childNodes[0].nodeValue;
          }
          document.getElementById('auth').value = auth;
          setTimeout("closeForm('" + v.id + "')", 1000);
          return;
        }

        if (v.id == 'protect_view') {
          setTimeout("closeForm('protect_view')", 1000);
          return;
        }

        if (v.id == 'email') {
          setTimeout("closeForm('email')", 1000);
          return;
        }
        
        // feedback.html

        if (v.id == 'feedback') {
          setTimeout("showswap('feedback',false)", 1000);
          return;
        }

        // users.html
        
        if (v.id == 'login') {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('user')[0];
          var user = n.childNodes[0].nodeValue;
          //setTimeout("closeForm('login'); switchUser('" + user + "')", 300);
          closeForm('login');
          show('redirecting', true);
          switchUser(user);
          return;
        }

        if (v.id == 'enter_code') {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('user')[0];
          var user = n.childNodes[0].nodeValue;
          setTimeout("closeForm('enter_code'); switchUser('" + user + "')", 1000);
          return;
        }

        if (v.id == 'create') {
          setTimeout("showswap('create',false)", 1000);
          return;
        }

        if (v.id == 'add_feed') {
          show('reload', true);
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('feed')[0];
          var feed = n.childNodes[0].nodeValue;
          insertHTML('list', '<div class="big feed-link ok">' + feed + '</div>', 1);
          document.getElementById('feed_name').value = '';
          document.getElementById('feed_password').value = '';
          return;
        }

        if (v.id.indexOf('del_feed') == 0) {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('feed')[0];
          var feed = n.childNodes[0].nodeValue;
          setTimeout(
            "document.getElementById('list')." +
            "removeChild(document.getElementById('item_" + feed + "'))", 1000);
          return;
        }

        if (v.id.indexOf('switch_to_paid') == 0) {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('feed')[0];
          var feed = n.childNodes[0].nodeValue;
          n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('plan')[0];
          var plan = n.childNodes[0].nodeValue;
          //setTimeout("switchPlan(" + feed + ", '" + plan + "', true)", 1000);
          switchPlan(feed, plan, true);
          return;
        }

        if (v.id.indexOf('switch_to_free') == 0) {
          var n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('feed')[0];
          var feed = n.childNodes[0].nodeValue;
          n = v.xdom.getElementsByTagName('response')[0].getElementsByTagName('plan')[0];
          var plan = n.childNodes[0].nodeValue;
          //setTimeout("switchPlan(" + feed + ", '" + plan + "', false)", 1000);
          switchPlan(feed, plan, false);
          return;
        }
      }
    } else {
      insertErrorStatus(v.id, 'Invalid xml document received (possibly wrong encoding?)');
    }
  } else {
    insertErrorStatus(v.id, 'Invalid response object');
  }
}

//------------------------------------------------------------------------
function doAction(action, extra_params) {
//------------------------------------------------------------------------
  insertStatus(action, 'Sending request to server<span class="progressbar"></span>');
  
  var params = new Array();
  
  // feed.html

  if (action == 'get') {
    params.push('url', 'encoding');
  }

  if (action == 'search') {
    params.push('global_pattern', 'item_pattern');
  }

  if (action == 'build') {
    params.push('feed_title', 'feed_link', 'feed_description', 'item_title',
                'item_link', 'merge_items', 'global_template', 'item_template');
  }

  if (action == 'rename') {
    params.push('rename');
  }

  if (action == 'link_account') {
    params.push('link_user_name','link_user_pwd');
  }

  if (action == 'protect_edit') {
    params.push('edit_password','email');
  }

  if (action == 'change_protect') {
    params.push('change_password');
  }

  if (action == 'protect_view') {
    params.push('view_username','view_password');
  }

  if (action == 'email') {
    params.push('remind_email');
  }

  // feedback.html

  // users.html
  
  if (action == 'login') {
    params.push('name', 'pwd', 'remember');
  }

  if (action == 'create') {
    params.push('name', 'pwd', 'pwd2', 'email');
  }

  if (action == 'enter_code') {
    params.push('code');
  }
  
  if (action == 'add_feed') {
    params.push('feed_name', 'feed_password');
  }
  
  // build query

  params = params.concat(default_params); // add default params to list
  
  var post_data = 'action=' + urlEncode(action);

  for (var i = 0; i < params.length; i++) {
    var n = params[i];
    var o = document.getElementById(n);
    if (!o) {
      insertErrorStatus(action, "Error: object '" + n + "' not found");
      return;
    }
    var v = o.value;
    if (o.type == 'checkbox') {
      v = o.checked ? 1 : 0;
    }
    post_data = post_data + '&' + n + '=' + urlEncode(v);
  }
  
  if (extra_params) {
    for (var i = 0; i < Math.round(extra_params.length / 2); i += 2) {
      var n = extra_params[i];
      var v = extra_params[i + 1];
      post_data = post_data + '&' + n + '=' + urlEncode(v);
    }
  }
  
  //alert(action_url);
  //alert(post_data);
  //return;
  
  var ok = org.cote.js.xml.postXml(action_url, post_data, loadHandler, 1, action);
  if (!ok) {
    insertErrorStatus(action, "Can't send request to server");
  }
}
