// global layout is saved here
var last_layout = '';

// enable or disable integration with server
var is_knowledge_template_used = 0;

function createCustomKnowledgePadOnServer(){
  url = "ERP5Site_createDefaultKnowledgePadListForUser";
  d = MochiKit.Async.doSimpleXMLHttpRequest(url, 
                 {'mode': mode,
                  'default_pad_group': default_pad_group});
  d.addCallback(handleServerSuccess);
  function handleServerSuccess(res){
    response = res.responseText;
    window.location=cancel_url + '/view?active_pad_url='+response;
  }
}

function showCreateDefaultKnowledgePadWarningMessage(){
  user_choice = confirm("In order to complete operation you must have your own tab on server instead of the default one which you are currently using and which you can not change.\nIs it OK to create new one for you now?");
  if (user_choice==true){
    createCustomKnowledgePadOnServer();
  }
}

function handleServerError(res){
  /*alert('Error on server');*/
};

function createCookie(name, value, days, path) {
  if (days) {
          var date = new Date();
          date.setTime(date.getTime()+(days*24*60*60*1000));
          var expires = "; expires="+date.toGMTString();
  }
  else var expires = "";
  if (!path){var path='/';}
  document.cookie = name+"="+value+expires+"; path="+path;
}

function updater(url, box_relative_url, dom_id, 
                 parent_web_section_url, editable_mode, additionnal_request_params){
  /* request box content from server */
 request_params = {};
 /* getting parameters for the request in the form's hidden inputs */
 inputs =  getElement(dom_id).getElementsByTagName('input');
 forEach(inputs, function (input){
   if(input.type == 'hidden'){
     // turn 'gadget_form_id' into 'form_id'
     if(input.name == 'gadget_form_id'){
       request_params['form_id'] = input.value;}
     else if(input.name.substring(input.name.length,input.name.length-5) == ':list'){
       if(typeof(request_params[input.name]) == 'undefined'){
         request_params[input.name] = new Array()
       }
       request_params[input.name].push(input.value);
     }
     else{
       request_params[input.name] = input.value;
     }
   }
});

 /*getting parameters for request from the parameter additionnal_request_params*/
 forEach(keys(additionnal_request_params), function (key){
   request_params[key] = additionnal_request_params[key];
 });

 request_params['box_relative_url'] = box_relative_url;
 request_params['parent_web_section_url'] = parent_web_section_url; 
 request_params['is_gadget_mode:int'] = 1; 
 request_params['editable_mode:int'] = editable_mode; 

 getElement(dom_id).style.opacity = 0.5; //innerHTML = '<div><p style="text-align: left; vertical-align: middle; font-size: large;">Loading...</p></div>';
 d = MochiKit.Async.doSimpleXMLHttpRequest(url, request_params);
 d.addCallback(handleServerSuccess);
 function handleServerSuccess(res){
      getElement(dom_id).innerHTML = res.responseText;
      getElement(dom_id).style.opacity = 1.0;
 }
}

function checkForActivitiesOnServer(timeout, return_url){
  /* check if activities are over and refresh current page */
  window.setInterval(
    function () {
      d = MochiKit.Async.doSimpleXMLHttpRequest('ERP5Site_hasUserActivity',
                                                {'js_call': 1});
      d.addCallback(handleServerSuccess);
      function handleServerSuccess(res){
         if(res.responseText=='False'){window.location=return_url;}
         }}, 
    timeout);
}

function stickPadOnWebSection(create_url,
                              knowledge_pad_url,
                              websection_url,
                              cancel_url){
  /* stick pad on Web Section and then check if 
     activities are over and refresh current page */
  d = doSimpleXMLHttpRequest(
           create_url, 
           {'knowledge_pad_url': knowledge_pad_url,
            'cancel_url': cancel_url});
  d.addCallbacks(handleServerSuccess, handleServerError);
  function handleServerSuccess(res){
      window.location=cancel_url+'?active_pad_url='+res.responseText;
      };
};

function createDefaultPadOnServer(timeout, create_url,
                                  default_pad_group, return_url, mode){
  /* create default tab on server and then check if 
     activities are over and refresh current page */
  d = doSimpleXMLHttpRequest(
           create_url, 
           {'default_pad_group': default_pad_group,
            'mode': mode});
  d.addCallbacks(handleServerSuccess, handleServerError);
  function handleServerSuccess(res){
      checkForActivitiesOnServer(timeout, return_url);};
};


function sendPreferencesToServer(form_dom_id, view_form_url, 
                                 box_relative_url, visual_block_dom_id){
  // iterate over all possible form elements within edit form,
  // collect them and send to server
  var request_str = "?box_relative_url=" + box_relative_url+ '&';
  var url="KnowledgeBox_baseEdit";
  forEach(getElementsByTagAndClassName('input', null, form_dom_id) , function (item) {
    if (item.type == "checkbox"){
      if (item.checked){request_str+=item.name + ':boolean=True&';}
      else {request_str+=item.name + ':boolean=False&';}}
    if (item.type == "radio"){
      if (item.checked){request_str+=item.name + '='+item.value+'&';}}
    if (item.type == "text"){request_str+=item.name + '=' + item.value + '&';}
    if (item.type == "password"){request_str+=item.name + '=' + item.value + '&';}
  });
  forEach(getElementsByTagAndClassName('select', null, form_dom_id), function (item) {
    //support multifield in gadget edit form
    if (item.multiple){
      forEach(getElementsByTagAndClassName('option', null, item), function (selection) {
        if(selection.selected){
          request_str+=item.name + '=' + selection.value + '&';
        }
      });
    }else{
      request_str+=item.name + '=' + item.value + '&';
    }
  });

  /* save form preferences to remote server*/
  url = url + request_str;
  d = MochiKit.Async.doSimpleXMLHttpRequest(url);
  d.addCallback(handleServerSuccess);
  function handleServerSuccess(res){
    /* update content view area back from server */
    updater(view_form_url, box_relative_url, visual_block_dom_id);
    toggle(form_dom_id);}
  };

function updateServerBoxColumnLayout(container){
  // read columns structure from DOM  ..
  var columns_arr = new Array;
  var columns = getElementsByTagAndClassName('div', 'portal-column');
  // sort alphabetically as it's required to get proper layout from DOM
  columns.sort(keyComparator("id")); 
  for (var i = 0; i < columns.length; i++){
    column_items = getElementsByTagAndClassName('div', 'block', columns[i]);
    var items_arr = new Array;
    for (var j = 0; j < column_items.length; j++){
        items_arr[j] = column_items[j].id;};
    columns_arr[i] = items_arr.join('|')
  };
  var layout = columns_arr.join('##');
  // .. and send it to server only if it's different
  // XXX: This may bloat ZODB as everry change is a chnage to an ZODB object.
  if (layout!=last_layout){
    last_layout = layout;
    doSimpleXMLHttpRequest("KnowledgePad_saveBoxColumnLayout", {user_layout: layout});
    }
  return
}

function addBoxToServer(url, dom_id, gadget_relative_url){
  /* add gadget to knowledge pad */
  d = doSimpleXMLHttpRequest(url, {gadget_relative_url: gadget_relative_url});
  d.addCallback(handleServerSuccess);
  function handleServerSuccess(res){
    button = getElement(dom_id);
    button.innerHTML = res.responseText;
    button.disabled = true;}
}

function addPadOnServer(create_url,
                        base_path,
                        mode,
                        cancel_url){
  /* add pad on server and set cookie as its relative url this way we 
     can show it immediately in UI */
  pad_title = getElement('new_pad_title');
  pad_title_value = pad_title.value
  d = doSimpleXMLHttpRequest(
           create_url, 
           {'pad_title': pad_title_value,
            'mode': mode});
  d.addCallbacks(handleServerSuccess, handleServerError);
  function handleServerSuccess(res){
      window.location = cancel_url+'?active_pad_url='+res.responseText;
    };
};

function removeKnowledgePadFromServer(knowledge_pad_relative_url, mode, base_path){
  /* remove pad from server*/
  if (is_knowledge_template_used){
    showCreateDefaultKnowledgePadWarningMessage();}
  else{
    var user_choice = true;
    user_choice = confirm("Are you sure you want to remove this pad from your home?");
    if (user_choice==true){
      location.href='ERP5Site_deleteKnowledgePad?knowledge_pad_relative_url=' + knowledge_pad_relative_url+'&mode='+mode;}
    }
}

function renameKnowledgePadToServer(dialog_id, title_id, 
                                    input_id, knowledge_pad_relative_url){
  if (is_knowledge_template_used){
    showCreateDefaultKnowledgePadWarningMessage();}
  else{
    // rename it locally and update server asynchonously
    title_element = getElement(title_id)
    input_element = getElement(input_id)
    var knowledge_pad_title = input_element.value;
    title_element.innerHTML = knowledge_pad_title;
    doSimpleXMLHttpRequest("ERP5Site_renameKnowledgePad", 
                          {knowledge_pad_relative_url: knowledge_pad_relative_url,
                            knowledge_pad_title: knowledge_pad_title});
  }
  //anyway toggle show dialog
  toggle(dialog_id);
}

function toggleElement(dom_id){
  /* add gadget to knowledge pad */
  toggle(dom_id);
}

function initialize(){
  // define sortable columns
  if (is_knowledge_template_used==0){
    // allow drag and drop only if we are dealing with a pad we can modify
    var sortables = getElementsByTagAndClassName('div', 'portal-column');
    forEach(sortables, function (item) {
      MochiKit.Sortable.create(item.id,  {"constraint"  : false,
                                          "containment" : sortables,
                                          "handle": "handle",
                                          "only": "block",
                                          "tag": "div",
                                          "scroll": "true",
                                          "hoverclass": "block-hover",
                                          "dropOnEmpty": "true",
                                          "onUpdate": updateServerBoxColumnLayout,
                                          "starteffect" : MochiKit.Base.noop,
                                          "endeffect"   : MochiKit.Base.noop
                                        });
    })}

  // enable show/hide tabs
  tabs =  getElement('tabs');
  tabs_switcher =  getElement('tabs_switcher');
  add_gadget =  getElement('add_new_gadget_link')
  if(tabs_switcher){
    connect(tabs_switcher, 'onclick', function (){
      var is_tabs_visible=0;
      if(tabs.style.display!='block'){
        is_tabs_visible=1;
        tabs_switcher.innerHTML = 'Hide tabs';
        add_gadget.className = "border_bottom1px";
        tabs_switcher.className = "border_bottom1px";
      }
      else{
        tabs_switcher.innerHTML = 'Show tabs';
        add_gadget.className = "border_bottom0px";
        tabs_switcher.className = "border_bottom0px";
      }
      toggle(tabs);
      createCookie("is_tabs_visible", is_tabs_visible, 365);
    });}

  // for each box (gadget) add respective event handlers
  var boxes = getElementsByTagAndClassName('div', 'block');
  forEach(boxes, function (box) {
     var edit = getFirstElementByTagAndClassName('a',
                                                 'block-edit-form', box);
     var edit_form = getFirstElementByTagAndClassName('div', 
                                                      'edit-form', box);
     var remove = getFirstElementByTagAndClassName('a', 
                                                   'block-remove', box);
     var minimize = getFirstElementByTagAndClassName('a', 
                                                     'block-minimize', box);
     var minimize_wrapper = getFirstElementByTagAndClassName('div', 
                                                             'minimize_wrapper', box);
     if(minimize){
       connect(minimize, 'onclick', function (){
         if (is_knowledge_template_used){
           showCreateDefaultKnowledgePadWarningMessage();}
         else{
           toggle(minimize_wrapper);
           doSimpleXMLHttpRequest("KnowledgeBox_toggleVisibility", 
                                  {box_relative_url: box.id});}});
       }
     if(edit){
       connect(edit, 'onclick', function (){
         if (is_knowledge_template_used){
           showCreateDefaultKnowledgePadWarningMessage();}
         else{toggle(edit_form);}});
      }

     if(remove){
       connect(remove, 'onclick', function (){
         if (is_knowledge_template_used){
           showCreateDefaultKnowledgePadWarningMessage();}
         else{
              user_choice = confirm("Are you sure you want to remove this gadget from your personalized page?");
              if (user_choice==true){
                toggle(box);
                doSimpleXMLHttpRequest("KnowledgePad_deleteBox", 
                                     {box_relative_url: box.id});}}});
      }
  });
}

// call function after load of document
MochiKit.DOM.addLoadEvent(initialize);
