/*
 * SocialEngineMods Apps v3.14
 * http://www.SocialEngineMods.Net
 *
 * Copyright SocialEngineMods.Net
 * This code is NOT an open source
 *
 */


Array.prototype.in_array = function(p_val) {
  for (var i = 0, l = this.length; i < l; i++) {
    if (this[i] == p_val) {
      return true
    }
  }
  return false
}
function semods_add_row(name, id) {
  if (typeof id == 'undefined') id = '';
  var el = document.getElementById(name + '_template').cloneNode(true);
  el.id = id;
  var moreRow = document.getElementById(name + "_addmorerow");
  moreRow.parentNode.insertBefore(el, moreRow);
  return el
}
if (SEMods.Browser.isIE || SEMods.Browser.isOpera) {
  document.getElementsByName = function(name, tag) {
    if (!tag) {
      tag = '*'
    }
    var elems = document.getElementsByTagName(tag);
    var res = []
    for (var i = 0; i < elems.length; i++) {
      att = elems[i].getAttribute('name');
      if (att == name) {
        res.push(elems[i])
      }
    }
    return res
  }
}
function hideMenuEx() {
  if ($(open_menu)) {
    hideMenu($(open_menu));
    open_menu = ''; // SE bug
  }
}
function apps_open_support_ticket(subject, message) {
  var form = document.createElement("FORM");
  form.action = "admin_semods_support.php";
  form.method = "POST";
  form.encoding = "multipart/encoded";
  var elem = document.createElement("INPUT");
  elem.type = "text";
  elem.name = "subject";
  elem.value = escape(subject);
  form.appendChild(elem);
  elem = document.createElement("INPUT");
  elem.type = "text";
  elem.name = "message";
  elem.value = escape(message);
  form.appendChild(elem);
  elem = document.createElement("INPUT");
  elem.type = "text";
  elem.name = "fresh";
  elem.value = 1;
  form.appendChild(elem);
  document.body.appendChild(form);
  form.submit()
}
function apps_notify_new_messages() {
  var elems = document.getElementsByTagName("A");
  for (var i = 0; i < elems.length; i++) {
    if (elems[i].href.match(/admin_apps_messages.php/)) {
      elems[i].style['backgroundColor'] = "#FFF4A5";
      break
    }
  }
}
function apps_menu_moreapps_onclick() {
  var apps = SEMods.B.ge("menu_dropdown_apps");
  var moreapps = SEMods.B.ge("menu_dropdown_moreapps");
  if (moreapps) {
    moreapps.style.left = SEMods.B.findX(apps) + 'px';
    moreapps.style.top = SEMods.B.findY(apps) - 6 + 'px';
    showMenu("menu_dropdown_moreapps")
  }
}
function apps_menu_main_more() {
  var position_elem = null;
  elems = document.getElementsByTagName("A");
  for (var i = 0; i < elems.length; i++) {
    if ((elems[i].className == 'top_menu_item') && elems[i].href.match(/javascript:apps_menu_main_more/)) {
      position_elem = elems[i];
      break
    }
  }
  if (!position_elem) return;
  position_elem.blur();
  position_elem = position_elem.parentNode.parentNode;
  var moreapps = SEMods.B.ge("menu_main_more_apps");
  if (moreapps) {
    ff_offset = SEMods.B.isFireFox ? 0 : 1;
    moreapps.style.left = SEMods.B.findX(position_elem) + 'px';
    moreapps.style.top = SEMods.B.findY(position_elem) + ff_offset + 'px';
    showMenu("menu_main_more_apps")
  }
}
function app_show_profile_onClick(app_id) {
  SEMods.B.hide("app_show_conf");
  SEMods.B.show("app_show_progress");
  SEMods.Apps.placeApp(app_id, SEMods.B.ge("app_show_profile").checked * 1, 1, 0, app_show_updated)
}
function app_show_userhome_onClick(app_id) {
  SEMods.B.hide("app_show_conf");
  SEMods.B.show("app_show_progress");
  SEMods.Apps.placeApp(app_id, SEMods.B.ge("app_show_userhome").checked * 1, 2, 0, app_show_updated)
}
function app_show_updated() {
  SEMods.B.hide("app_show_progress");
  SEMods.B.show("app_show_conf")
}
function apps_uninstall(app_id, page_id, view_id) {
  SEMods.Apps.removeApp(app_id, page_id, view_id);
  SEMods.B.hide('approw_' + app_id)
}
function apps_settings(app_id) {
  apps_settings_current_tab = '1';
  mooFaceboxExShow("", "user_apps_settings.php?id=" + app_id + "", 370)
}
var apps_settings_current_tab = '1';
function apps_settings_tab(tab_id) {
  SEMods.B.ge("settings_tab_" + apps_settings_current_tab).className = 'tab2';
  SEMods.B.hide("settings_content_" + apps_settings_current_tab);
  SEMods.B.show("settings_content_" + tab_id);
  SEMods.B.ge("settings_tab_" + tab_id).className = 'tab1';
  apps_settings_current_tab = tab_id
}
function apps_settings_placement_onChange(elem, app_id, page_id, view_id) {
  SEMods.Apps.ProfileDragDrop.page_id = 0;
  SEMods.Apps.ProfileDragDrop.view_id = 0;
  switch (elem.value) {
  case "tabs":
    apps_settings_placement_move_to(app_id, page_id, view_id, "tabs", 0);
    break;
  case 'apptab':
    apps_settings_placement_move_to(app_id, page_id, view_id, "apptab", 0);
    break;
  case 'sidebar':
    apps_settings_placement_move_to(app_id, page_id, view_id, "root", 0);
    break;
  case 'widebar':
    apps_settings_placement_move_to(app_id, page_id, view_id, "root", 1);
    break
  }
}
function apps_settings_placement_move_to(app_id, page_id, view_id, container, stripe) {
  SEMods.B.show("app_placement_progress");
  var ajax = new SEMods.Ajax(apps_settings_placement_move_to_onSuccess, apps_settings_placement_move_to_onFail);
  var params = 'task=movetocontainer&pid=' + page_id + '&vid=' + view_id + '&appid=' + app_id + '&container=' + container + '&stripe=' + stripe;
  ajax.post(SEMods.Apps.ProfileDragDrop.api_endpoint, params)
}
function apps_settings_placement_move_to_onSuccess() {
  SEMods.B.hide("app_placement_progress")
}
function apps_settings_placement_move_to_onFail() {
  SEMods.B.hide("app_placement_progress")
}
function apps_show_error_message(error_message) {
  if (typeof error_message == 'undefined') error_message = '';
  elem = SEMods.B.ge("apps_error_message_div");
  if (!elem) {
    return
  }
  if (error_message && (error_message != '')) {
    elem.innerHTML = error_message
  }
  mooFaceboxExShow("", "#apps_error_message_div")
}
function apps_inplace_edit(app_id) {
  hideMenuEx();
  SEMods.Apps.ProfileDragDrop.editContent(app_id)
}
function apps_edit_box(app_id) {
  hideMenuEx();
  SEMods.Apps.ProfileDragDrop.editContent(app_id)
}
function apps_get_appbox(app_id) {
  if (app_id.indexOf('_') != -1) {
    app_id = app_id.split('_')[1]
  }
  appbox = SEMods.B.ge('app_' + app_id);
  if (!appbox) appbox = SEMods.B.ge('core_' + app_id);
  if (!appbox) appbox = SEMods.B.ge('plugin_' + app_id);
  if (!appbox) appbox = SEMods.B.ge('widget_' + app_id);
  return appbox
}
function app_boxdialog(app_id, position) {
  if (app_id.indexOf('_') != -1) {
    app_id = app_id.split('_')[1]
  }
  box = SEMods.B.ge("appsettings_app_" + app_id);
  appbox = apps_get_appbox(app_id);
  var top = SEMods.B.findY(appbox);
  var left = SEMods.B.findX(appbox) + appbox.offsetWidth - 1;
  box.style.left = -9999 + 'px';
  box.style.top = -9999 + 'px';
  showMenu("appsettings_app_" + app_id);
  if ((left + box.offsetWidth) > document.body.offsetWidth) {
    left -= box.offsetWidth;
    box.className = "apps_settingsbox1"
  }
  box.style.left = left + 'px';
  box.style.top = top + 'px';
  showMenu("appsettings_app_" + app_id)
}
function app_tabdialog(app_id) {
  box = SEMods.B.ge("appsettings_" + app_id);
  appbox = SEMods.B.ge(app_id);
  if (!appbox || !box) return;
  do {
    appbox = appbox.previousSibling
  } while ( appbox . nodeType != 1 ) var left = SEMods.B.findX(appbox) + appbox.offsetWidth - 10;
  var top = SEMods.B.findY(appbox) - 1 + 3;
  box.style.left = left + 'px';
  box.style.top = top + 'px';
  showMenu("appsettings_" + app_id)
}
function apps_show_grip_item(app_id, app_name, tabs_type, apps_show_grip_item_callback) {
  if (typeof tabs_type == 'undefined') tabs_type = 'profile';
  if (typeof apps_show_grip_item_callback == 'undefined') apps_show_grip_item_callback = loadProfileTab;
  var elems = document.getElementsByName(tabs_type+"_tabs_wrap", "TD");
  for (var i = elems.length - 1; i >= 0; i--) {
    if (elems[i].style.display != 'none') {
      elems[i].style.display = 'none';
      break
    }
  }
  try {
    hideMenu(SEMods.B.ge("tabs_grip"));
    open_menu = ''; // SE bug
  } catch(ex) {}
  SEMods.B.ge(tabs_type+"_tabs_wrap_" + app_name).style.display = '';
  //loadProfileTab(app_name)
  apps_show_grip_item_callback(app_name);
}
function appbox_uninstall(app_id) {
  clean_app_id = app_id;
  if (app_id.indexOf('_') != -1) {
    clean_app_id = app_id.split('_')[1]
  }
  hideMenu(SEMods.B.ge("appsettings_app_" + clean_app_id));
  open_menu = ''; // SE bug
  SEMods.Apps.ProfileDragDrop.removeApp(app_id);
  appbox = apps_get_appbox(app_id);
  SEMods.B.hide(appbox)
}
function apps_removebox(app_id) {
  clean_app_id = app_id;
  if (app_id.indexOf('_') != -1) {
    clean_app_id = app_id.split('_')[1]
  }
  try {
    hideMenu(SEMods.B.ge("appsettings_app_" + clean_app_id))
    open_menu = ''; // SE bug
  } catch(ex) {};
  SEMods.Apps.ProfileDragDrop.removeBox(app_id);
  appbox = apps_get_appbox(app_id);
  SEMods.B.hide(appbox)
}
function appbox_moveto_sidebar(app_id) {
  clean_app_id = app_id;
  if (app_id.indexOf('_') != -1) {
    clean_app_id = app_id.split('_')[1]
  }
  SEMods.B.hide("appsettings_app_" + clean_app_id);
  SEMods.B.hide("appsettings_app_" + clean_app_id + "_moveto_sidebar");
  SEMods.B.show("appsettings_app_" + clean_app_id + "_moveto_apptab");
  SEMods.Apps.ProfileDragDrop.moveToContainer(app_id, "root", 0);
  loadProfileTab("profile")
}
function appbox_moveto_apptab(app_id) {
  clean_app_id = app_id;
  if (app_id.indexOf('_') != -1) {
    clean_app_id = app_id.split('_')[1]
  }
  SEMods.B.hide("appsettings_app_" + clean_app_id);
  SEMods.B.show("appsettings_app_" + clean_app_id + "_moveto_sidebar");
  SEMods.B.hide("appsettings_app_" + clean_app_id + "_moveto_apptab");
  SEMods.Apps.ProfileDragDrop.moveToContainer(app_id, "apptab", 0);
  SEMods.B.ge("profile_tabs_wrap_apps").style.display = '';
  loadProfileTab("apps")
}
function apps_add_totab_dialog() {
  box = $('add_to_tab');
  appbox = $('profile_tabs_add');
  if((box == null) || (appbox == null)) {
    return;
  }
  var left = SEMods.B.findX(appbox) + appbox.clientWidth - 5;
  var top = SEMods.B.findY(appbox);
  box.style.left = left + 'px';
  box.style.top = top + 'px';
  showMenu("add_to_tab")
}
function apps_tab_grip_dialog() {
  box = $('tabs_grip');
  appbox = $('profile_tabs_grip');
  if((box == null) || (appbox == null)) {
    return;
  }
  var left = SEMods.B.findX(appbox) + appbox.clientWidth - 4;
  var top = SEMods.B.findY(appbox);
  box.style.left = left + 'px';
  box.style.top = top + 'px';
  showMenu("tabs_grip")
}
function appbox_moveto_tab(app_id) {
  hideMenu(SEMods.B.ge("add_to_tab"));
  open_menu = ''; // SE bug
  SEMods.Apps.ProfileDragDrop.moveBoxToTabs(app_id)
}
function appbox_remove_from_tab(app_id) {
  hideMenu(SEMods.B.ge("appsettings_" + app_id));
  open_menu = ''; // SE bug
  SEMods.Apps.ProfileDragDrop.removeBoxFromTabs(app_id)
}
function apps_cancelEvent(e) {
  var e = e ? e: window.event;
  if (e.preventDefault) e.preventDefault();
  if (e.stopPropagation) e.stopPropagation();
  e.cancelBubble = true;
  e.returnValue = false;
  return false
}
function apps_tab_editor(page_id, view_id) {
  TBEX_show('Rearrange Tabs', 'user_apps_tabeditor.php?pid='+page_id+'&vid=' + view_id + '&TBEX_iframe=true&height=500&width=300', '', '', 1, apps_tab_editor_close_callback)
}
function apps_tab_editor_close_callback() {
  document.location = document.location;
}
SEMods.Apps = function() {};
SEMods.Apps = {
  api_endpoint: 'ajax_semods_apps.php?',
  api_content_endpoint: 'appcontent.php?',
  app_url: '',
  removeApp: function(app_id, page_id, view_id) {
    var ajax = new SEMods.Ajax();
    var params = 'task=removeapp' + '&appid=' + app_id;
    if (typeof page_id != 'undefined') params += '&pid=' + page_id;
    if (typeof view_id != 'undefined') params += '&vid=' + view_id;
    ajax.post(this.api_endpoint, params)
  },
  placeApp: function(app_id, show, page_id, view_id, placeApp_callback) {
    if (typeof view_id == 'undefined') view_id = 0;
    if (show == 0) task = 'removebox';
    else task = 'placeapp';
    new SEMods.Apps.AppPlacer(task, app_id, page_id, view_id, placeApp_callback)
  },
  hideNotification: function(id) {
    SEMods.B.hide("appnotify_" + id);
    var ajax = new SEMods.Ajax();
    ajax.post(this.api_endpoint, 'task=hidenotification' + '&notificationid=' + id)
  },
  cleanAppId: function(app_id) {
    clean_app_id = app_id;
    if (app_id.indexOf('_') != -1) {
      clean_app_id = app_id.split('_')[1]
    }
    return clean_app_id
  },
  register_on_drop: function(app_id, callback) {
    return SEMods.Apps.ProfileDragDrop.register_callback(app_id, "onDrop", callback)
  },
  register_on_ajax_load: function(app_id, callback) {
    return SEMods.Apps.ProfileDragDrop.register_callback(app_id, "onAjaxLoad", callback)
  },
  get_stripe_type: function(container, stripe) {
    return SEMods.Apps.ProfileDragDrop.getStripeType(container, stripe)
  }
};
SEMods.Apps.Language = function() {};
SEMods.Apps.Language = {}
SEMods.Apps.Tabs = function() {};
SEMods.Apps.Tabs = {
  instance: 'apps_tab1',
  visible_tab: '',
  full_screen: false,
  full_screen_exclude: ["profile", "friends", "comments"],
  loadProfileTab: function(tabId, tabBase, full_screen) {
    if (typeof full_screen == 'undefined') full_screen = this.full_screen;
    if (full_screen) {
      if (document.getElementById(tabBase + "_leftside")) {
        if (this.full_screen_exclude.in_array(tabId)) {
          document.getElementById(tabBase + "_leftside").style.display = ""
        } else {
          document.getElementById(tabBase + "_leftside").style.display = "none"
        }
      }
    }
    if (this.visible_tab == '') {
      var elems = document.getElementsByName(tabBase + "_tabs_wrap", "TD");
      if (elems.length > 0) {
        guess_tab_id = elems[0].id;
        guess_tab_id = guess_tab_id.substring(18);
        this.visible_tab = guess_tab_id
      }
    }
    if (tabId == this.visible_tab) {
      return false
    }
    if (elem = SEMods.B.ge(tabBase + '_tabs_' + tabId)) {
      cells = elem.getElementsByTagName("TD");
      for (i = 0; i < cells.length; i++) {
        if (cells[i].className == "apps_tabsetting") {
          SEMods.B.show(cells[i]);
          cells[i].parentNode.parentNode.parentNode.className = "apps_activetab";
          break
        }
      }
    }
    if (elem = SEMods.B.ge(tabBase + '_tabs_' + this.visible_tab)) {
      cells = elem.getElementsByTagName("TD");
      for (i = 0; i < cells.length; i++) {
        if (cells[i].className == "apps_tabsetting") {
          SEMods.B.hide(cells[i]);
          cells[i].parentNode.parentNode.parentNode.className = "apps_inactivetab";
          break
        }
      }
    }
    if ($(tabBase + '_' + tabId)) {
      $(tabBase + '_tabs_' + tabId).className = this.instance + '2';
      $(tabBase + '_' + tabId).style.display = "block";
      if ($(tabBase + '_tabs_' + this.visible_tab)) {
        $(tabBase + '_tabs_' + this.visible_tab).className = this.instance;
        $(tabBase + '_' + this.visible_tab).style.display = "none"
      }
      this.visible_tab = tabId
    }
  }
}
SEMods.Apps.AppPlacer = function(task, app_id, page_id, view_id, placeApp_callback) {
  this.app_id = app_id;
  this.page_id = page_id;
  this.view_id = view_id;
  this.placeApp_callback = placeApp_callback;
  this.init(task)
};
SEMods.Apps.AppPlacer.prototype = {
  app_id: '',
  init: function(task) {
    clean_app_id = SEMods.Apps.cleanAppId(this.app_id);
    var ajax = new SEMods.Ajax(this.onSetPagePlacementSuccess.bind(this), this.onSetPagePlacementFail.bind(this));
    var params = 'task=' + task + '&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + clean_app_id + '&user=' + SEMods.Apps.ProfileDragDrop.owner;
    ajax.post(SEMods.Apps.api_endpoint, params)
  },
  onSetPagePlacementSuccess: function(obj, responseText) {
    var r = [];
    try {
      r = eval('(' + responseText + ')')
    } catch(e) {
      r.status = 1
    };
    if (r.status == 0) {
      if (this.placeApp_callback) this.placeApp_callback(this.app_id)
    } else {
      apps_show_error_message(r.err_msg ? r.err_msg: '');
      SEMods.B.hide(this.app_id)
    }
  },
  onSetPagePlacementFail: function(obj, responseText) {
    apps_show_error_message()
  }
}
SEMods.Apps.Utils = {};
SEMods.Apps.Utils = {
  parseHTML: function(_source) {
    var source = _source;
    var scripts = new Array();
    while (source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
      var s = source.indexOf("<script");
      var s_e = source.indexOf(">", s);
      var e = source.indexOf("</script", s);
      var e_e = source.indexOf(">", e);
      script_meta = source.substring(s + 8, s_e);
      script_src = script_meta.match(/src="([^"]*)"/);
      script_src = script_src ? script_src[1] : '';
      scripts.push({
        'data': source.substring(s_e + 1, e),
        'src': script_src,
        'type': 'script'
      });
      source = source.substring(0, s) + source.substring(e_e + 1)
    }
    for (var i = 0; i < scripts.length; i++) {
      try {
        var head = document.getElementsByTagName("head")[0] || document.documentElement,
        script = document.createElement("script");
        script.type = "text/javascript";
        if (scripts[i].src) {
          script.src = scripts[i].src
        } else {
          if (SEMods.B.isIE) script.text = scripts[i].data;
          else script.appendChild(document.createTextNode(scripts[i].data))
        }
        head.insertBefore(script, head.firstChild)
      } catch(ex) {}
    }
    var scripts = new Array();
    while (source.indexOf("<style") > -1 || source.indexOf("</style") > -1) {
      var s = source.indexOf("<style");
      var s_e = source.indexOf(">", s);
      var e = source.indexOf("</style", s);
      var e_e = source.indexOf(">", e);
      script_meta = source.substring(s + 7, s_e);
      script_src = script_meta.match(/src="([^"]*)"/);
      script_src = script_src ? script_src[1] : '';
      scripts.push({
        'data': source.substring(s_e + 1, e),
        'src': script_src,
        'type': 'css'
      });
      source = source.substring(0, s) + source.substring(e_e + 1)
    }
    for (var i = 0; i < scripts.length; i++) {
      try {
        var head = document.getElementsByTagName("head")[0] || document.documentElement,
        script = document.createElement("style");
        script.type = 'text/css';
        if (SEMods.B.isIE) script.styleSheet.cssText = scripts[i].data;
        else script.appendChild(document.createTextNode(scripts[i].data));
        head.insertBefore(script, head.firstChild)
      } catch(ex) {}
    }
    return source
  }
}
SEMods.Apps.ContentEditor = function(page_id, view_id, app_id, app_block_id, stripe_id, placement, container, owner, editinplace) {
  this.page_id = page_id;
  this.view_id = view_id;
  this.app_id = app_id;
  this.app_block_id = app_block_id;
  this.stripe_id = stripe_id;
  this.placement = placement;
  this.container = container;
  this.owner = owner;
  this.editinplace = editinplace
};
SEMods.Apps.ContentEditor.prototype = {
  xx: '',
  edit: function() {
    var params = 'task=editcontent' + '&pageid=' + this.page_id + '&viewid=' + this.view_id + '&id=' + this.app_id + '&appid=' + this.app_block_id + '&stripe=' + this.stripe_id + '&placement=' + this.placement + '&container=' + this.container + '&user=' + this.owner;
    if (this.editinplace == 1) {
      content_box = SEMods.B.ge("appcontent_" + this.app_block_id);
      content_box.innerHTML = "Loading...";
      var ajax = new SEMods.Ajax(this.onEditContentLoadSuccess.bind(this), this.onEditContentLoadFail.bind(this));
      ajax.post(SEMods.Apps.api_content_endpoint, params)
    } else if (this.editinplace == 2) {
      TBEX_show('EDIT', SEMods.Apps.api_content_endpoint + params + '&TBEX_iframe=true', '', '', 1)
    } else {
      document.location = "user_apps_canvas.php?id=" + this.app_id + "&pageid=" + this.page_id + '&viewid=' + this.view_id + '&task=editcontent' + '&returnafteredit=' + encodeURIComponent(document.location)
    }
  },
  attachEvents: function() {},
  submit_form: function() {
    var values = [];
    var elems = this.form.getElementsByTagName("INPUT");
    for (var i = 0; i < elems.length; i++) {
      if (elems[i].type == "radio" || elems[i].type == "checkbox") {
        if (elems[i].checked) {
          values.push(encodeURIComponent(elems[i].name) + '=' + encodeURIComponent(elems[i].value))
        }
      } else {
        values.push(encodeURIComponent(elems[i].name) + '=' + encodeURIComponent(elems[i].value))
      }
    }
    var elems = this.form.getElementsByTagName("SELECT");
    for (var i = 0; i < elems.length; i++) {
      values.push(encodeURIComponent(elems[i].name) + '=' + encodeURIComponent(elems[i].value))
    }
    var elems = this.form.getElementsByTagName("TEXTAREA");
    for (var i = 0; i < elems.length; i++) {
      values.push(elems[i].name + '=' + encodeURIComponent( SEMods.B.isFireFox ? elems[i].value.replace(/\n/g, "\r\n") : elems[i].value ) );
    }
    values.push('pageid=' + this.page_id);
    values.push('viewid=' + this.view_id);
    values.push('id=' + this.app_id);
    values.push('appid=' + this.app_block_id);
    values.push('stripe=' + this.stripe_id);
    values.push('placement=' + this.placement);
    values.push('container=' + this.container);
    values.push('user=' + this.owner);
    values.push('task=doajaxsave');
    values = values.join("&");
    content_box = SEMods.B.ge("appcontent_" + this.app_block_id);
    content_box.innerHTML = "Saving...";
    var ajax = new SEMods.Ajax(this.onEditContentSaveSuccess.bind(this), this.onEditContentSaveFail.bind(this));
    ajax.post(SEMods.Apps.api_content_endpoint, values)
  },
  onSubmit: function(e) {
    this.submit_form();
    return this._cancelEvent(e)
  },
  _cancelEvent: function(e) {
    var e = e ? e: window.event;
    if (e.preventDefault) e.preventDefault();
    if (e.stopPropagation) e.stopPropagation();
    e.cancelBubble = true;
    e.returnValue = false;
    return false
  },
  onCancel: function() {
    var contentbox = SEMods.B.ge("appcontent_" + this.app_block_id);
    //SEMods.Apps.ProfileDragDrop.reloadContentEx(this.app_block_id)
    SEMods.Apps.ProfileDragDrop.reloadContent(this.app_block_id, this.stripe_id, this.container);
  },
  onEditContentSaveSuccess: function(obj, responseText) {
    this.onEditContentSuccess(obj, responseText, 0)
  },
  onEditContentSaveFail: function(obj, responseText) {
    apps_show_error_message()
  },
  onEditContentSuccess: function(obj, responseText, editing) {
    var r = [];
    try {
      r = eval('(' + responseText + ')')
    } catch(e) {
      r.status = 1;
      r.html = ''
    };
    if (r.status == 0) {
      var contentbox = SEMods.B.ge("appcontent_" + this.app_block_id);
      contentbox.innerHTML = SEMods.Apps.Utils.parseHTML(r.html);
      if (r.appid) {
        identity = SEMods.Apps.ProfileDragDrop.getBoxIdentity(r.appid);
        if (identity && identity.onAjaxLoad) {
          identity.onAjaxLoad(identity, editing)
        }
      }
      var elems = contentbox.getElementsByTagName("FORM");
      for (var i = 0; i < elems.length; i++) {
        if (elems[i].name == "form_editcontent") {
          this.form = elems[i];
          SEMods.B.addEvent(elems[i], "submit", this.onSubmit.bind(this))
        }
      }
      var elems = contentbox.getElementsByTagName("INPUT");
      for (var i = 0; i < elems.length; i++) {
        if (elems[i].name == "form_editcontent_cancel") {
          SEMods.B.addEvent(elems[i], "click", this.onCancel.bind(this))
        }
      }
    } else {
      apps_show_error_message(r.err_msg ? r.err_msg: '')
    }
  },
  onEditContentLoadSuccess: function(obj, responseText) {
    this.onEditContentSuccess(obj, responseText, 1)
  },
  onEditContentLoadFail: function(obj, responseText) {
    apps_show_error_message()
  }
}
SEMods.Apps.ProfileDragDrop = function(e) {};
SEMods.Apps.ProfileDragDrop = {
  dropTargets: null,
  stripes: null,
  api_endpoint: 'ajax_semods_apps.php?',
  api_content_endpoint: 'appcontent.php?',
  dropTarget: null,
  objects: [],
  stripes_map: [],
  header_class: 'header',
  page_id: 2,
  view_id: 0,
  header_control_element: "TD",
  enforce_placements: true,
  auto_save_layout: true,
  flying: false,
  owner: '',
  state: 0,
  callbacks_register_queue: [],
  removeApp: function(app_id) {
    var ajax = new SEMods.Ajax(this.onMoveBoxSuccess.bind(this), this.onMoveBoxFail.bind(this));
    var params = 'task=removeapp&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + app_id + '&user=' + this.owner;
    ajax.post(this.api_endpoint, params)
  },
  removeBox: function(app_id) {
    var ajax = new SEMods.Ajax(this.onMoveBoxSuccess.bind(this), this.onMoveBoxFail.bind(this));
    var params = 'task=removebox&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + app_id + '&user=' + this.owner;
    ajax.post(this.api_endpoint, params)
  },
  moveBoxToTabs: function(app_id) {
    var ajax = new SEMods.Ajax(this.onMoveBoxSuccess.bind(this), this.onMoveBoxFail.bind(this));
    var params = 'task=movetotabs&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + app_id + '&user=' + this.owner;
    ajax.post(this.api_endpoint, params)
  },
  removeBoxFromTabs: function(app_id) {
    var ajax = new SEMods.Ajax(this.onMoveBoxSuccess.bind(this), this.onMoveBoxFail.bind(this));
    var params = 'task=removefromtabs&pid=' + this.page_id + '&vid=' + this.view_id + '&appid=' + app_id + '&user=' + this.owner;
    ajax.post(this.api_endpoint, params)
  },
  onMoveBoxSuccess: function(obj, responseText) {
    var r = [];
    try {
      r = eval('(' + responseText + ')')
    } catch(e) {
      r.status = 1;
      r.appid = ''
    };
    if (r.status == 0) {
      if (r.reload) document.location = document.location;
      if (r.url) {
        document.location = r.url
      }
    } else {
      apps_show_error_message(r.err_msg ? r.err_msg: '')
    }
  },
  onMoveBoxFail: function(obj, responseText) {
    apps_show_error_message()
  },
  getAppBox: function(app_id) {
    if (app_id.indexOf('_') != -1) {
      app_id = app_id.split('_')[1]
    }
    appbox = SEMods.B.ge('app_' + app_id);
    if (!appbox) appbox = SEMods.B.ge('core_' + app_id);
    if (!appbox) appbox = SEMods.B.ge('plugin_' + app_id);
    if (!appbox) appbox = SEMods.B.ge('widget_' + app_id);
    return appbox
  },
  moveToContainer: function(app_id, container, stripe_id) {
    this.buildStripes();
    var stripe;
    for (var i in SEMods.Apps.ProfileDragDrop.stripes) {
      stripe = SEMods.Apps.ProfileDragDrop.stripes[i];
      if (stripe.id == stripe_id && stripe.c == container) {
        elem = this.getAppBox(app_id);
        elem = elem.parentNode.removeChild(elem);
        stripe.e.appendChild(elem);
        box = this.getBoxIdentity(app_id);
        box.container = container;
        box.stripe = stripe_id;
        moved = true;
        break
      }
    }
    if (moved) {
      if (box.contentvaries) {
        this.reloadContent(app_id, stripe_id, container)
      }
      this.updateLayout(true)
    }
  },
  buildDropTargets: function() {
    var elem;
    this.dropTargets = new Array();
    for (var obj in this.objects) {
      if (!this.objects[obj].box) continue;
      elem = this.objects[obj].box;
      if (!this.dropTargets[this.objects[obj].container]) this.dropTargets[this.objects[obj].container] = new Array();
      this.dropTargets[this.objects[obj].container].push({
        'x': SEMods.B.findX(elem),
        'y': SEMods.B.findY(elem),
        'x1': SEMods.B.findX(elem) + elem.offsetWidth,
        'y1': SEMods.B.findY(elem) + elem.offsetHeight,
        'e': elem
      })
    }
    return this.dropTargets
  },
  getDropTargets: function(container) {
    return this.dropTargets ? this.dropTargets[container] : this.buildDropTargets()
  },
  buildStripes: function() {
    this.stripes = [];
    var tdtags = this.getElementsByName_compat("semods_container", "DIV");
    for (var tdtag = 0; tdtag < tdtags.length; tdtag++) {
      if (tdtags[tdtag].getAttribute('stripe') && tdtags[tdtag].getAttribute('container')) {
        x = SEMods.B.findX(tdtags[tdtag]);
        y = SEMods.B.findY(tdtags[tdtag]);
        var stripe = {
          'x': x,
          'y': y,
          'x1': x + tdtags[tdtag].offsetWidth,
          'y1': y + tdtags[tdtag].offsetHeight,
          'e': tdtags[tdtag],
          'id': tdtags[tdtag].getAttribute('stripe'),
          'c': tdtags[tdtag].getAttribute('container')
        };
        if (tdtags[tdtag].lastChild) {
          for (var node = tdtags[tdtag].lastChild; node.previousSibling; node = node.previousSibling) {
            if (node.nodeType != 3) {
              stripe.y1 = SEMods.B.findY(node) + node.offsetHeight;
              break
            }
          }
        } else {
          stripe.y1 = stripe.y + 10
        }
        this.stripes.push(stripe)
      }
    }
  },
  getStripe: function(x, y) {
    for (var stripe in this.stripes) {
      if ((x > this.stripes[stripe].x) && (x < this.stripes[stripe].x1)) {
        return this.stripes[stripe]
      }
    }
    return null
  },
  getElementsByName_compat: function(name, tag) {
    if (!tag) {
      tag = '*'
    }
    if (SEMods.B.isIE) {
      var elems = document.getElementsByTagName(tag);
      var res = []
      for (var i = 0; i < elems.length; i++) {
        att = elems[i].getAttribute('name');
        if (att == name) {
          res.push(elems[i])
        }
      }
      return res
    } else {
      return document.getElementsByName(name, tag)
    }
  },
  app_profiledragdrop_onload: function(e, elem) {
    this.dropTargets = new Array();
    var elems = this.getElementsByName_compat("semods_appbox", "DIV");
    for (var i = 0; i < elems.length; i++) {
      var elem;
      box = this.getBoxIdentity(elems[i].id);
      var tdtags = elems[i].getElementsByTagName(this.header_control_element);
      for (var tdtag = 0; tdtag < tdtags.length; tdtag++) {
        if (tdtags[tdtag].className == this.header_class) {
          if (!box.locked || !this.enforce_placements) {
            tdtags[tdtag].style.cursor = "move";
            if (SEMods.B.isIE) {
              SEMods.B.addEvent(tdtags[tdtag], "mousedown",
              function(e) {
                SEMods.Apps.ProfileDragDrop.app_profiledragdrop_mousedown(e)
              })
            } else {
              SEMods.B.addEvent(tdtags[tdtag], "mousedown",
              function(e) {
                SEMods.Apps.ProfileDragDrop.app_profiledragdrop_mousedown(e, this)
              })
            }
          } else {}
          app_id = SEMods.Apps.cleanAppId(elems[i].id);
          appsettings_box = SEMods.B.ge("appsettings_app_" + app_id);
          if (this.flat_properties) {
            if (!this.no_appsettings && (!box.mandatory || box.editinplace || ((box.container == 'apptab') && appsettings_box))) {
              header_elem = document.createElement("DIV");
              header_elem.className = "apps_settings_titlediv";
              header_elem.innerHTML = tdtags[tdtag].innerHTML;
              tdtags[tdtag].innerHTML = '';
              tdtags[tdtag].appendChild(header_elem);
              if (!box.mandatory) {
                selem = document.createElement("DIV");
                selem.xapp_id = elems[i].id;
                selem.className = "apps_box_close";
                if (SEMods.B.isIE) {
                  SEMods.B.addEvent(selem, "click",
                  function(e) {
                    var src = (e.srcElement) ? e.srcElement: e.target;
                    apps_removebox(src.xapp_id)
                  })
                } else {
                  SEMods.B.addEvent(selem, "click",
                  function(e) {
                    apps_removebox(this.xapp_id);
                    return apps_cancelEvent(e)
                  })
                }
                tdtags[tdtag].appendChild(selem)
              }
              if (box.editinplace && (SEMods.Apps.PageEditor.designmode != 2)) {
                selem = document.createElement("DIV");
                selem.app_id = elems[i].id;
                selem.className = "apps_box_edit";
                selem.innerHTML = "<a href='javascript:void(0)' onclick='apps_edit_box(\"" + elems[i].id + "\")'>edit</a>"
                tdtags[tdtag].appendChild(selem)
              }
              var show_settings_icon = false;
              if ((box.container == 'apptab') && appsettings_box) {
                show_settings_icon = true
              }
              if (show_settings_icon) {
                selem = document.createElement("DIV");
                selem.id = elems[i].id + "_settingsdiv";
                selem.className = "apps_settings";
                if (SEMods.B.isIE) {
                  SEMods.B.addEvent(selem, "click",
                  function(e) {
                    var src = (e.srcElement) ? e.srcElement: e.target;
                    app_boxdialog(src.id)
                  })
                } else {
                  SEMods.B.addEvent(selem, "click",
                  function() {
                    app_boxdialog(this.id)
                  })
                }
                tdtags[tdtag].appendChild(selem)
              }
              if (this.header_control_element == "DIV") {
                clearfix_elem = document.createElement("DIV");
                clearfix_elem.style['clear'] = "both";
                tdtags[tdtag].appendChild(clearfix_elem)
              }
            }
          } else {
            box = SEMods.B.ge("appsettings_app_" + app_id);
            if (!this.no_appsettings && box) {
              header_elem = document.createElement("DIV");
              header_elem.className = "apps_settings_titlediv";
              header_elem.innerHTML = tdtags[tdtag].innerHTML;
              selem = document.createElement("DIV");
              selem.id = elems[i].id + "_settingsdiv";
              selem.className = "apps_settings";
              if (SEMods.B.isIE) {
                SEMods.B.addEvent(selem, "click",
                function(e) {
                  var src = (e.srcElement) ? e.srcElement: e.target;
                  app_boxdialog(src.id)
                })
              } else {
                SEMods.B.addEvent(selem, "click",
                function() {
                  app_boxdialog(this.id)
                })
              }
              tdtags[tdtag].innerHTML = '';
              tdtags[tdtag].appendChild(header_elem);
              tdtags[tdtag].appendChild(selem);
              if (this.header_control_element == "DIV") {
                clearfix_elem = document.createElement("DIV");
                clearfix_elem.style['clear'] = "both";
                tdtags[tdtag].appendChild(clearfix_elem)
              }
            }
          }
          tdtags[tdtag].app_id = elems[i].id;
          this.objects[elems[i].id].box = elems[i];
          break
        }
      }
    }
    for (var obj in this.objects) {
      if (this.objects[obj].box) continue;
      elem = SEMods.B.ge("appcontent_" + obj);
      if ((elem) && (elem.innerHTML.length > 1000)) {
        this.objects[obj].box = SEMods.B.ge(obj)
      }
    }
    var div = document.createElement("DIV");
    div.className = 'app_profiledragdrop_flyingbox';
    div.style.display = 'none';
    this.flying_box = div;
    document.body.insertBefore(div, document.body.firstChild);
    div = document.createElement("DIV");
    div.className = 'app_profiledragdrop_droptarget';
    this.drop_box = div;
    this.state = 2;
    for (var callback_i = 0; callback_i < this.callbacks_register_queue.length; callback_i++) {
      cb = this.callbacks_register_queue[callback_i];
      this._register_callback(cb.app_id, cb.callback_id, cb.callback)
    }
  },
  register_callback: function(app_id, callback_id, callback) {
    if (this.state >= 2) {
      this._register_callback(app_id, callback_id, callback)
    } else {
      this.callbacks_register_queue.push({
        'app_id': app_id,
        'callback_id': callback_id,
        'callback': callback
      })
    }
  },
  _register_callback: function(app_id, callback_id, callback) {
    identity = SEMods.Apps.ProfileDragDrop.getBoxIdentity('app_' + app_id);
    if (!identity) {
      identity = SEMods.Apps.ProfileDragDrop.getBoxIdentity('widget_' + app_id)
    }
    if (!identity) {
      return
    }
    identity[callback_id] = callback
  },
  add_new_objects: function(newobjects, options) {
    if (typeof options == 'undefined' || typeof options.header_class == 'undefined') {
      header_class = "header"
    }
    if (typeof options == 'undefined' || typeof options.header_control_element == 'undefined') {
      header_control_element = "TD"
    }
    for (var obj in newobjects) {
      var elem = SEMods.B.ge(obj);
      if (elem) {
        var tdtags = elem.getElementsByTagName(header_control_element);
        for (var tdtag = 0; tdtag < tdtags.length; tdtag++) {
          if (tdtags[tdtag].className == header_class) {
            tdtags[tdtag].style.cursor = "move";
            if (SEMods.B.isIE) {
              SEMods.B.addEvent(elem, "mousedown",
              function(e) {
                SEMods.Apps.ProfileDragDrop.app_profiledragdrop_mousedown(e)
              })
            } else {
              SEMods.B.addEvent(elem, "mousedown",
              function(e) {
                SEMods.Apps.ProfileDragDrop.app_profiledragdrop_mousedown(e, this)
              })
            }
            box = newobjects[obj];
            header_elem = document.createElement("DIV");
            header_elem.className = "apps_settings_titlediv";
            header_elem.innerHTML = tdtags[tdtag].innerHTML;
            tdtags[tdtag].innerHTML = '';
            tdtags[tdtag].appendChild(header_elem);
            if (this.flat_properties) {
              if (!box.mandatory) {
                selem = document.createElement("DIV");
                selem.xapp_id = obj;
                selem.className = "apps_box_close";
                if (SEMods.B.isIE) {
                  SEMods.B.addEvent(selem, "click",
                  function(e) {
                    var src = (e.srcElement) ? e.srcElement: e.target;
                    apps_removebox(src.xapp_id)
                  })
                } else {
                  SEMods.B.addEvent(selem, "click",
                  function(e) {
                    apps_removebox(this.xapp_id);
                    return apps_cancelEvent(e)
                  })
                }
                tdtags[tdtag].appendChild(selem)
              }
              if (box.editinplace && (SEMods.Apps.PageEditor.designmode != 2)) {
                selem = document.createElement("DIV");
                selem.app_id = obj;
                selem.className = "apps_box_edit";
                selem.innerHTML = "<a href='javascript:void(0)' onclick='apps_edit_box(\"" + obj + "\")'>edit</a>"
                tdtags[tdtag].appendChild(selem)
              }
            } else {
              selem = document.createElement("DIV");
              selem.id = obj + "_settingsdiv";
              selem.className = "apps_settings";
              if (SEMods.B.isIE) {
                SEMods.B.addEvent(selem, "click",
                function(e) {
                  var src = (e.srcElement) ? e.srcElement: e.target;
                  app_boxdialog(src.id)
                })
              } else {
                SEMods.B.addEvent(selem, "click",
                function() {
                  app_boxdialog(this.id)
                })
              }
              tdtags[tdtag].appendChild(selem)
            }
            if (header_control_element == "DIV") {
              clearfix_elem = document.createElement("DIV");
              clearfix_elem.style['clear'] = "both";
              tdtags[tdtag].appendChild(clearfix_elem)
            }
            tdtags[tdtag].app_id = obj;
            this.objects[obj] = newobjects[obj];
            this.objects[obj].box = elem;
            if (typeof options != 'undefined' && typeof options.onDrop != 'undefined') {
              this.objects[obj].onDrop = options.onDrop
            }
          }
        }
      }
    }
  },
  app_profiledragdrop_mousedown: function(e, elem) {
    if (this.flying) return;
    var src = (e.srcElement) ? e.srcElement: e.target;
    if (src.className == "apps_settings_titlediv") {
      src = src.parentNode
    }
    if (!src.app_id) return;
    new SEMods.Apps.ProfileDragDrop.FlyingBox(SEMods.Apps.ProfileDragDrop, e, this.objects[src.app_id].box);
    try {
      if (SEMods.Apps.PageEditor.apps_pageeditmenu_hideall) {
        SEMods.Apps.PageEditor.apps_pageeditmenu_hideall();
        SEMods.Apps.PageEditor.onDragStart2()
      }
    } catch(ex) {}
  },
  getBoxIdentity: function(id) {
    return this.objects[id]
  },
  showWarningBox: function(x, y, minLeft, maxLeft) {
    if (!this.warning_box) {
      this.warning_box = SEMods.B.ge("apps_profiledragdrop_warningbox")
    }
    this.warning_box.style.top = y + 30 + 'px';
    SEMods.B.show(this.warning_box);
    var boxX = x - this.warning_box.offsetWidth / 2;
    if ((boxX + this.warning_box.offsetWidth + 10) > maxLeft) boxX = maxLeft - this.warning_box.offsetWidth - 10;
    else if (boxX < minLeft) boxX = minLeft + 10;
    this.warning_box.style.left = boxX + 'px'
  },
  hideWarningBox: function() {
    if (this.warning_box) {
      SEMods.B.hide(this.warning_box)
    }
  },
  reloadContentEx: function(app_id) {
    var identity = this.getBoxIdentity(app_id);
    this.reloadContent(app_id, identity.stripe, identity.container)
  },
  reloadContent: function(app_id, stripe, container) {
    clean_app_id = SEMods.Apps.cleanAppId(app_id);
    content_box = SEMods.B.ge("appcontent_" + app_id);
    content_box.innerHTML = "Loading...";
    var ajax = new SEMods.Ajax(this.onReloadContentSuccess.bind(this), this.onReloadContentFail.bind(this));
    var stripe_type = '';
    try {
      stripe_type = this.stripes_map[container][stripe];
    } catch(e) {
    };
    var params = 'task=ajaxload&pageid=' + this.page_id + '&viewid=' + this.view_id + '&id=' + clean_app_id + '&appid=' + app_id + '&stripe=' + stripe + '&placement=' + stripe_type + '&container=' + container + '&user=' + this.owner;
    ajax.post(this.api_content_endpoint, params)
  },
  getStripeType: function(container, stripe) {
    return this.stripes_map[container][stripe]
  },
  editContent: function(app_id) {
    clean_app_id = SEMods.Apps.cleanAppId(app_id);
    var identity = this.getBoxIdentity(app_id);
    var stripe_type = '';
    if (typeof identity == 'undefined') {
      identity = {
        'container': 'root',
        'stripe': 0,
        'editinplace': 1
      }
    } else {
      stripe_type = this.stripes_map[identity.container][identity.stripe]
    }
    new SEMods.Apps.ContentEditor(this.page_id, this.view_id, clean_app_id, app_id, identity.stripe, stripe_type, identity.container, this.owner, identity.editinplace).edit()
  },
  onReloadContentSuccess: function(obj, responseText) {
    var r = [];
    try {
      r = eval('(' + responseText + ')')
    } catch(e) {
      r.status = 1;
      r.html = '';
      r.appid = ''
    };
    if (r.appid != '' && r.html != '') {
      SEMods.B.ge("appcontent_" + r.appid).innerHTML = SEMods.Apps.Utils.parseHTML(r.html);
      identity = SEMods.Apps.ProfileDragDrop.getBoxIdentity(r.appid);
      if (identity && identity.onAjaxLoad) {
        identity.onAjaxLoad(identity, 0)
      }
    } else {
      apps_show_error_message(r.err_msg ? r.err_msg: '')
    }
  },
  onReloadContentFail: function(obj, r) {
    apps_show_error_message(r.err_msg ? r.err_msg: '')
  },
  updateLayout: function(rebuild_stripes) {
    if (!this.auto_save_layout) return;
    this._updateLayout(rebuild_stripes)
  },
  _updateLayout: function(rebuild_stripes) {
    this.buildLayout();
    var params = 'task=updatelayout&pid=' + this.page_id + '&vid=' + this.view_id + '&user=' + this.owner + '&layout=' + SEMods.Apps.JSON.encode(this.layout);
    var ajax = new SEMods.Ajax();
    ajax.post(this.api_endpoint, params)
  },
  buildLayout: function() {
    if (!this.stripes) this.buildStripes();
    layout = {};
    stripes = SEMods.Apps.ProfileDragDrop.stripes;
    for (var i = 0; i < stripes.length; i++) {
      if (!layout[stripes[i].c]) layout[stripes[i].c] = [];
      layout[stripes[i].c]["" + stripes[i].id] = []
    }
    var boxes = document.getElementsByName("semods_appbox", "DIV");
    for (var b = 0; b < boxes.length; b++) {
      identity = this.getBoxIdentity(boxes[b].id);
      if (!layout[identity.container] || !layout[identity.container][identity.stripe]) continue;
      layout[identity.container][identity.stripe].push(boxes[b].id)
    }
    SEMods.Apps.ProfileDragDrop.layout = layout
  }
};
SEMods.Apps.ProfileDragDrop.FlyingBox = function(master, e, elem) {
  this.disableSelection(elem);
  this.master = master;
  this.master.flying = true;
  this.srcElement = elem;
  this.init(e, elem);
  if (typeof hideMenu != 'undefined') {
    hideMenuEx()
  }
};
SEMods.Apps.ProfileDragDrop.FlyingBox.prototype = {
  master: null,
  obj: null,
  srcElement: null,
  offsetX: 0,
  offsetY: 0,
  curDropTarget: null,
  identity: [],
  autoScrollSpeed: 10,
  mouseX: 0,
  mouseY: 0,
  mouseDocX: 0,
  mouseDocY: 0,
  lazyMouseY: 0,
  scrollVelocity: 0,
  mouseDownSaver: null,
  init: function(e, elem) {
    SEMods.Apps.ProfileDragDrop.dropTargets = null;
    SEMods.Apps.ProfileDragDrop.buildStripes();
    this.identity = SEMods.Apps.ProfileDragDrop.getBoxIdentity(this.srcElement.id);
    this.createElement(e);
    this.documentHeight = document.documentElement.clientHeight;
    this.documentScrollHeight = document.documentElement.scrollHeight + 100 + this.obj.offsetHeight;
    this._addEvent(document.body, "mouseup", this.onMouseUp.bind(this));
    document.body.selectstart = function() {
      return false
    };
    this._addEvent(document.body, "selectstart",
    function() {
      return false
    });
    this._addEvent(document.body, "mousemove", this.onMouseMove.bind(this));
    this.mouseDownSaver = document.onmousedown;
    document.onmousedown = function() {
      return false
    }
  },
  disableSelection: function(element) {
    this.eventsaver_onselectstart = element.onselectstart;
    element.onselectstart = function() {
      return false
    };
    element.unselectable = "on";
    element.style.MozUserSelect = "none"
  },
  enableSelection: function(element) {
    element.onselectstart = this.eventsaver_onselectstart;
    element.unselectable = "off";
    element.style.MozUserSelect = ""
  },
  autoScroll: function(e) {
    if (SEMods.Browser.isOpera) return;
    if (e.clientY < 50 || e.clientY > (this.documentHeight - 50)) {
      if (e.clientY < 50 && !this.autoScrollActive) {
        this.autoScrollActive = true;
        this.scrollVelocity = this.autoScrollSpeed * -1;
        setTimeout(this.autoScroller.bind(this), 5)
      }
      if (e.clientY > (this.documentHeight - 50) && document.documentElement.scrollHeight <= this.documentScrollHeight && !this.autoScrollActive) {
        this.autoScrollActive = true;
        this.scrollVelocity = this.autoScrollSpeed;
        setTimeout(this.autoScroller.bind(this), 5)
      }
    } else {
      this.autoScrollActive = false
    }
  },
  autoScroller: function(direction, yPos) {
    if (document.documentElement.scrollHeight > this.documentScrollHeight && this.scrollVelocity > 0) return;
    window.scrollBy(0, this.scrollVelocity);
    if (!this.obj) return;
    if (this.scrollVelocity < 0) {
      if (document.documentElement.scrollTop > 0) {
        this.obj.style.top = parseInt(this.obj.style.top) + this.scrollVelocity + 'px';
        this.lazyMouseY += this.scrollVelocity
      } else {
        this.autoScrollActive = false
      }
    } else {
      if (this.mouseY > (this.documentHeight - 50)) {
        this.obj.style.top = parseInt(this.obj.style.top) + this.scrollVelocity + 'px';
        this.lazyMouseY += this.scrollVelocity
      } else {
        this.autoScrollActive = false
      }
    }
    this.mouseMoveHandler(this.mouseDocX, this.mouseDocY + this.lazyMouseY);
    if (this.autoScrollActive) setTimeout(this.autoScroller.bind(this), 5)
  },
  createElement: function(e) {
    this.master.flying_box.style.width = this.srcElement.offsetWidth + 'px';
    this.master.flying_box.style.height = this.srcElement.offsetHeight + 'px';
    this.master.flying_box.style.display = 'block';
    this.master.drop_box.style.height = (this.srcElement.offsetHeight > 200 ? 200 : this.srcElement.offsetHeight) + 'px';
    this.master.drop_box.style.width = '99%';
    this.master.drop_box.style.display = 'block';
    this.offsetX = SEMods.B.mousePosX(e) - SEMods.B.findX(this.srcElement);
    this.offsetY = SEMods.B.mousePosY(e) - SEMods.B.findY(this.srcElement);
    if (Math.abs(this.offsetY) > 30) {
      var scrollTop = 0;
      var scrollLeft = 0;
      obj = this.srcElement;
      if (obj.parentNode) {
        while (obj.parentNode) {
          scrollTop += obj.scrollTop;
          scrollLeft += obj.scrollLeft;
          obj = obj.parentNode
        }
      }
      this.offsetY += scrollTop;
      this.offsetX += scrollLeft;
      this.offsetX -= (document.documentElement && document.documentElement.scrollLeft) ? 2 * document.documentElement.scrollLeft: 2 * document.body.scrollLeft;
      this.offsetY -= (document.documentElement && document.documentElement.scrollTop) ? 2 * document.documentElement.scrollTop: 2 * document.body.scrollTop
    }
    if (Math.abs(this.offsetY) > 30) {
      this.offsetY = 15
    }
    if (Math.abs(this.offsetX) > this.srcElement.offsetWidth) {
      this.offsetX = 100
    }
    this.master.flying_box.style.left = SEMods.B.mousePosX(e) - this.offsetX + 'px';
    this.master.flying_box.style.top = SEMods.B.mousePosY(e) - this.offsetY + 'px';
    this.obj = this.master.flying_box;
    this.curDropTarget = this.master.drop_box;
    this.curDropTarget.stripe = this.master.objects[this.srcElement.id].stripe;
    this.curDropTarget.container = this.master.objects[this.srcElement.id].container;
    this.master.flying_box.appendChild(this.srcElement.parentNode.replaceChild(this.master.drop_box, this.srcElement))
  },
  getElementStyle: function(elem, IEStyleProp, CSSStyleProp) {
    if (elem.currentStyle) {
      return elem.currentStyle[IEStyleProp]
    } else if (window.getComputedStyle) {
      var compStyle = window.getComputedStyle(elem, "");
      return compStyle.getPropertyValue(CSSStyleProp)
    }
    return ""
  },
  mouseMoveHandler: function(x, y) {
    if (!SEMods.Apps.ProfileDragDrop.lock_vertical_move) {
      this.obj.style.left = x - this.offsetX + 'px'
    }
    this.obj.style.top = y - this.offsetY + 'px';
    var stripe = SEMods.Apps.ProfileDragDrop.getStripe(x, y);
    if (stripe == null) return;
    var stripe_id = stripe.id;
    if (SEMods.Apps.ProfileDragDrop.enforce_placements) {
      if (this.identity.stripes.in_array(stripe_id) && (this.identity.container == stripe.c)) {
        SEMods.Apps.ProfileDragDrop.hideWarningBox()
      } else {
        SEMods.Apps.ProfileDragDrop.showWarningBox(x, y - this.offsetY, x - this.offsetX, x - this.offsetX + this.obj.offsetWidth);
        return
      }
    }
    var elem = null;
    var targetX, targetY;
    var target;
    var found_placement = false;
    var curDropTargetX = SEMods.B.findX(this.curDropTarget);
    var curDropTargetY = SEMods.B.findY(this.curDropTarget);
    if ((x >= curDropTargetX) && (x <= curDropTargetX + this.curDropTarget.offsetWidth) && (y >= curDropTargetY) && (y <= curDropTargetY + this.curDropTarget.offsetHeight)) {
      return
    }
    var targets = SEMods.Apps.ProfileDragDrop.getDropTargets(this.identity.container);
    for (var i = 0; i < targets.length; i++) {
      target = targets[i];
      if (this.srcElement == target.e) continue;
      targetX = SEMods.B.findX(target.e);
      targetY = SEMods.B.findY(target.e);
      targetHeight = target.e.offsetHeight;
      if ((x >= targetX) && (x <= targetX + target.e.offsetWidth)) {
        if ((y > (targetY - 20)) && (y < (targetY + targetHeight / 2))) {
          found_placement = true;
          if (this.curDropTarget != target.e.previousSibling) {
            target.e.parentNode.insertBefore(this.curDropTarget, target.e)
          }
          break
        }
        if ((y >= (targetY + targetHeight / 2)) && (y <= (targetY + targetHeight))) {
          found_placement = true;
          if (target.e.nextSibling) {
            if (this.curDropTarget != target.e.nextSibling) {
              target.e.parentNode.insertBefore(this.curDropTarget, target.e.nextSibling)
            }
          } else {
            target.e.parentNode.appendChild(this.curDropTarget, target.e)
          }
          break
        }
      }
    }
    var node = null;
    if (!found_placement) {
      for (var i = 0; i < SEMods.Apps.ProfileDragDrop.stripes.length; i++) {
        stripe = SEMods.Apps.ProfileDragDrop.stripes[i];
        if ((stripe.id == this.curDropTarget.stripe) && (stripe.c == this.curDropTarget.container)) {
          continue
        }
        if ((x >= stripe.x) && (x <= stripe.x1) && (y >= stripe.y) && (y <= stripe.y + stripe.e.offsetHeight)) {
          var y1 = stripe.y;
          for (var i = stripe.e.childNodes.length - 1; i >= 0; i--) {
            node = stripe.e.childNodes[i];
            if (node.nodeType == 1) {
              y1 = SEMods.B.findY(node) + node.offsetHeight;
              break
            }
          }
          if (y > y1) {
            if (node != this.curDropTarget) {
              stripe.e.appendChild(this.curDropTarget)
            }
            found_placement = true;
            break
          }
          if (stripe.e.firstChild != this.curDropTarget) {
            stripe.e.insertBefore(this.curDropTarget, stripe.e.firstChild);
            found_placement = true;
            break
          }
        }
      }
    }
    if (!found_placement) {
      for (var i = 0; i < SEMods.Apps.ProfileDragDrop.stripes.length; i++) {
        stripe = SEMods.Apps.ProfileDragDrop.stripes[i];
        if ((x >= stripe.x) && (x <= stripe.x1)) {
          if (y <= stripe.y) {
            if (stripe.e.firstChild != this.curDropTarget) {
              stripe.e.insertBefore(this.curDropTarget, stripe.e.firstChild)
            }
          } else if (y >= stripe.y + stripe.e.offsetHeight) {
            if (stripe.e.lastChild != this.curDropTarget) {
              stripe.e.appendChild(this.curDropTarget)
            }
          }
          found_placement = true;
          break
        }
      }
    }
    var node = null;
    if (found_placement) {
      this.curDropTarget.stripe = stripe.id;
      this.curDropTarget.container = stripe.c
    }
  },
  onMouseMove: function(e) {
    var x = SEMods.B.mousePosX(e);
    var y = SEMods.B.mousePosY(e);
    this.lazyMouseY = 0;
    this.mouseX = e.clientX;
    this.mouseY = e.clientY;
    this.mouseDocX = x;
    this.mouseDocY = y;
    this.mouseMoveHandler(x, y);
    this.autoScroll(e);
    return this._cancelEvent(e)
  },
  onMouseUp: function(e) {
    if (!e) var e = window.event;
    var src = (e.srcElement) ? e.srcElement: e.target;
    if (this.curDropTarget) {
      if (this.identity.stripe != this.curDropTarget.stripe) {
        stripe_switched = true
      } else {
        stripe_switched = false
      }
      this.curDropTarget.parentNode.replaceChild(this.srcElement, this.curDropTarget);
      this.master.flying_box.style.display = 'none';
      this.master.drop_box.style.display = 'none';
      this.identity.stripe = this.curDropTarget.stripe;
      this.identity.container = this.curDropTarget.container
    }
    SEMods.Apps.ProfileDragDrop.hideWarningBox();
    this.master.flying = false;
    this._removeEvent(document.body, "mouseup");
    this._removeEvent(document.body, "dragend");
    this._removeEvent(document.body, "mousemove");
    this._removeEvent(document.body, "drag");
    this._removeEvent(document.body, "selectstart");
    this.enableSelection(this.srcElement);
    document.onmousedown = this.mouseDownSaver;
    var success = true;
    if (this.identity.onDrop) {
      success = this.identity.onDrop(this.identity)
    }
    if (success != false) {
      if (stripe_switched && this.identity.contentvaries) {
        SEMods.Apps.ProfileDragDrop.reloadContent(this.srcElement.id, this.identity.stripe, this.identity.container)
      }
      SEMods.Apps.ProfileDragDrop.updateLayout()
    }
  },
  _addEvent: function($obj, $event, $handler) {
    var fn = $handler;
    if (!$obj.attachedEvents) $obj.attachedEvents = new Array();
    if ($obj.attachedEvents[$event]) this._removeEvent($obj, $event);
    $obj.attachedEvents[$event] = fn;
    if (typeof $obj.addEventListener != 'undefined') $obj.addEventListener($event, $handler, false);
    else if (typeof $obj.attachEvent != 'undefined') $obj.attachEvent('on' + $event, $handler)
  },
  _removeEvent: function($obj, $event) {
    if (!$obj.attachedEvents || !$obj.attachedEvents[$event]) return;
    if (typeof $obj.removeEventListener != 'undefined') $obj.removeEventListener($event, $obj.attachedEvents[$event], false);
    else if (typeof $obj.detachEvent != 'undefined') $obj.detachEvent('on' + $event, $obj.attachedEvents[$event])
  },
  _cancelEvent: function(e) {
    var e = e ? e: window.event;
    if (e.preventDefault) e.preventDefault();
    if (e.stopPropagation) e.stopPropagation();
    e.cancelBubble = true;
    e.returnValue = false;
    return false
  }
}
SEMods.Apps.JSON = new
function() {
  this.encode = function() {
    var self = arguments.length ? arguments[0] : this,
    result,
    tmp;
    if (self === null) result = "null";
    else if (self !== undefined && (tmp = $[typeof self](self))) {
      switch (tmp) {
      case Array:
        result = [];
        for (var i = 0, j = 0, k = self.length; j < k; j++) {
          if (self[j] !== undefined && (tmp = JSON.encode(self[j]))) result[i++] = tmp
        };
        result = "[".concat(result.join(","), "]");
        break;
      case Boolean:
        result = String(self);
        break;
      case Date:
        result = '"'.concat(self.getFullYear(), '-', d(self.getMonth() + 1), '-', d(self.getDate()), 'T', d(self.getHours()), ':', d(self.getMinutes()), ':', d(self.getSeconds()), '"');
        break;
      case Function:
        break;
      case Number:
        result = isFinite(self) ? String(self) : "null";
        break;
      case String:
        result = '"'.concat(self.replace(rs, s).replace(ru, u), '"');
        break;
      default:
        var i = 0,
        key;
        result = [];
        for (key in self) {
          if (self[key] !== undefined && (tmp = JSON.encode(self[key]))) result[i++] = '"'.concat(key.replace(rs, s).replace(ru, u), '":', tmp)
        };
        result = "{".concat(result.join(","), "}");
        break
      }
    };
    return result
  };
  this.toDate = function() {
    var self = arguments.length ? arguments[0] : this,
    result;
    if (rd.test(self)) {
      result = new Date;
      result.setHours(i(self, 11, 2));
      result.setMinutes(i(self, 14, 2));
      result.setSeconds(i(self, 17, 2));
      result.setMonth(i(self, 5, 2) - 1);
      result.setDate(i(self, 8, 2));
      result.setFullYear(i(self, 0, 4))
    } else if (rt.test(self)) result = new Date(self * 1000);
    return result
  };
  var c = {
    "\b": "b",
    "\t": "t",
    "\n": "n",
    "\f": "f",
    "\r": "r",
    '"': '"',
    "\\": "\\",
    "/": "/"
  },
  d = function(n) {
    return n < 10 ? "0".concat(n) : n
  },
  e = function(c, f, e) {
    e = eval;
    delete eval;
    if (typeof eval === "undefined") eval = e;
    f = eval("" + c);
    eval = e;
    return f
  },
  i = function(e, p, l) {
    return 1 * e.substr(p, l)
  },
  p = ["", "000", "00", "0", ""],
  rc = null,
  rd = /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,
  rs = /(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g,
  rt = /^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/,
  ru = /([\x00-\x07]|\x0b|[\x0e-\x1f])/g,
  s = function(i, d) {
    return "\\".concat(c[d])
  },
  u = function(i, d) {
    var n = d.charCodeAt(0).toString(16);
    return "\\u".concat(p[n.length], n)
  },
  v = function(k, v) {
    return $[typeof result](result) !== Function && (v.hasOwnProperty ? v.hasOwnProperty(k) : v.constructor.prototype[k] !== v[k])
  },
  $ = {
    "boolean": function() {
      return Boolean
    },
    "function": function() {
      return Function
    },
    "number": function() {
      return Number
    },
    "object": function(o) {
      return o instanceof o.constructor ? o.constructor: null
    },
    "string": function() {
      return String
    },
    "undefined": function() {
      return null
    }
  },
  $$ = function(m) {
    function $(c, t) {
      t = c[m];
      delete c[m];
      try {
        e(c)
      } catch(z) {
        c[m] = t;
        return 1
      }
    };
    return $(Array) && $(Object)
  };
  try {
    rc = new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')
  } catch(z) {
    rc = /^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/
  }
};
SEMods.Apps.PageEditor = function() {};
SEMods.Apps.PageEditor = {
  apps_pagemenu_active: null,
  apps_pagemenu2_active: null,
  layout: {},
  page_id: 0,
  view_id: 0,
  editor_elem: null,
  editor_elem_html: '',
  editor_elem_slide_direction: 0,
  slide_timer: 0,
  slide_chain: [],
  status: 0,
  designmode: 0,
  pageeditor_slide: function() {
    var m = parseInt(this.editor_elem.style.top);
    var delta = Math.round(Math.max(2, Math.min(12, Math.abs(m) / 3)));
    if (this.editor_elem_slide_direction == 0) {
      if (m >= 0) {
        this.slide_timer = 0;
        next = this.slide_chain.pop();
        if (next) {
          next()
        }
        return
      }
    } else {
      if (m <= -this.editor_elem.offsetHeight) {
        this.slide_timer = 0;
        next = this.slide_chain.pop();
        if (next) {
          next()
        }
        return
      }
      delta = -delta
    }
    this.editor_elem.style.top = m + delta + "px";
    this.slide_timer = setTimeout(this.pageeditor_slide.bind(this), 50)
  },
  load_page_editor: function(page_id, view_id) {
    if (this.status > 0) return;
    this.status = 1;
    this.editor_elem = document.createElement("DIV");
    this.editor_elem.id = "pageeditor_wrapper";
    this.editor_elem.innerHTML = "<div id='pageeditor_topbar' Xstyle='height:30px'><div style='padding: 5px'><img style='float:left;margin-right: 4px' src='./images/apps_ajaxprogress1.gif'>Loading...</div></div>";
    this.editor_elem.style.top = -100 + 'px';
    document.body.appendChild(this.editor_elem);
    this.editor_elem.style.top = -this.editor_elem.offsetHeight + 'px';
    this.slide_timer = setTimeout(this.pageeditor_slide.bind(this), 50);
    this.page_id = page_id;
    this.view_id = view_id;
    var ajax = new SEMods.Ajax(this.onLayoutPageEditorSuccess.bind(this), this.onLayoutPageEditorFail.bind(this));
    var params = 'task=loadpageeditor&pid=' + this.page_id + '&vid=' + this.view_id + '&user=' + SEMods.Apps.ProfileDragDrop.owner;
    ajax.post(SEMods.Apps.api_endpoint, params)
  },
  load_page_editor2: function(page_id, view_id, default_section) {
    if (this.status == 2) {
      this.show_page_editor2();
      return;
    }
    if (!$("apps_overlay")) {
      new Element('div').setProperty('id', 'apps_overlay').inject(document.body);
      $('apps_overlay').setOpacity(0.6)
    }
    if (!$("apps_load")) {
      new Element('div').setProperty('id', 'apps_load').inject(document.body);
      $('apps_load').innerHTML = "<img src='./images/tbex_loadingAnimation.gif' alt='Loading' />"
    }
    $('apps_load').setStyle('display', 'block');
    this.editor_elem = document.createElement("DIV");
    this.editor_elem.id = "pageeditor2_wrapper";
    this.editor_elem.style.display = "none";
    document.body.appendChild(this.editor_elem);
    this.editor_elem_iframe = document.createElement("IFRAME");
    this.editor_elem_iframe.id = "pageeditor2_wrapper_iframe";
    this.editor_elem_iframe.style.display = "none";
    this.editor_elem_iframe.frameBorder = 0;
    document.body.appendChild(this.editor_elem_iframe);
    this.page_id = page_id;
    this.view_id = view_id;
    this.default_section = default_section;
    var ajax = new SEMods.Ajax(this.onLayoutPageEditor2Success.bind(this), this.onLayoutPageEditor2Fail.bind(this));
    var params = 'task=loadpageeditor2&pid=' + this.page_id + '&vid=' + this.view_id + '&user=' + SEMods.Apps.ProfileDragDrop.owner;
    ajax.post(SEMods.Apps.api_endpoint, params)
  },
  show_page_editor2 : function() {
    // adjust to screen height
    // pageeditmenu2_left (550), pageeditmenu2_right(550), pageeditor2_scroller_widgets(max-height: 480), pageeditor2_scroller_blocks(480), custom css textarea(450)
    var window_height = window.getHeight();
    var pageeditormenu2_height = 640;
    if(window_height < 700) {
      var height_shift = 100;
      $('pageeditmenu2_left').setStyle('height', 550 - height_shift + 'px');
      $('pageeditmenu2_right').setStyle('height', 550 - height_shift + 'px');
      $('pageeditor2_scroller_widgets').setStyle('max-height', 480 - height_shift + 'px');
      if($('pageeditor2_scroller_blocks') != null) {
        $('pageeditor2_scroller_blocks').setStyle('height', 480 - height_shift + 'px');
      }
      if($('pageeditor2_style_customcss') != null) {
        $('pageeditor2_style_customcss').setStyle('height', 450 - height_shift + 'px');
      }
      pageeditormenu2_height -= height_shift;
    }
    $('pageeditor2_wrapper').setStyle('left', (window.getWidth() - 700) / 2 + 'px');
    $('pageeditor2_wrapper').setStyle('top', (window.getHeight() - pageeditormenu2_height) / 2 + 'px');
    $('pageeditor2_wrapper').setStyle('display', 'block');

    $('pageeditor2_wrapper_iframe').setStyle('height', pageeditormenu2_height + 'px');
    $('pageeditor2_wrapper_iframe').setStyle('left', (window.getWidth() - 700) / 2 + 'px');
    $('pageeditor2_wrapper_iframe').setStyle('top', (window.getHeight() - pageeditormenu2_height) / 2 + 'px');
    $('pageeditor2_wrapper_iframe').setStyle('display', 'block');

    $('apps_overlay').setStyle('display', 'block');
  },
  onAppPlaceCallback: function(identity) {
    if (identity.stripe == -1) {
      return
    }
    if (identity.placed) {
      return
    }
    identity.placed = true;
    SEMods.Apps.placeApp(identity.id, 1, SEMods.Apps.ProfileDragDrop.page_id, SEMods.Apps.ProfileDragDrop.view_id, SEMods.Apps.PageEditor.onAppPlaceFinished);
    return false
  },
  onAppPlaceFinished: function(app_id) {
    $('appcontent_' + app_id).highlight('#FFFFCC');
    SEMods.Apps.ProfileDragDrop.updateLayout();
    if (SEMods.Apps.PageEditor.designmode == 1) {
      SEMods.B.show('appcontent_' + app_id);
      SEMods.Apps.ProfileDragDrop.reloadContentEx(app_id)
    }
  },
  onDragStart2: function() {
    SEMods.Apps.PageEditor.padeeditor2_close()
  },
  padeeditor2_close: function() {
    $('pageeditor2_wrapper').setStyle('display', 'none');
    $('pageeditor2_wrapper_iframe').setStyle('display', 'none');
    $('apps_overlay').setStyle('display', 'none')
  },
  onLayoutPageEditor2Success: function(obj, responseText) {
    var r = [];
    try {
      r = eval('(' + responseText + ')')
    } catch(e) {
      r.status = 1
    };
    $('apps_load').setStyle('display', 'none');
    if (r.status == 0) {
      this.layout = r.layout;
      this.page_id = r.layout.page_id;
      this.view_id = r.layout.view_id;
      this.status = 2;
      this.designmode = 1;
      this.editor_elem_html = r.html;
      this.editor_elem.innerHTML = this.editor_elem_html;
      SEMods.Apps.ProfileDragDrop.add_new_objects(this.layout.newobjects, {
        'onDrop': SEMods.Apps.PageEditor.onAppPlaceCallback,
        'onDragStart': SEMods.Apps.PageEditor.onDragStart2.bind(this)
      });
      var elem = SEMods.B.ge("pageeditor2_appsettings");
      if (elem) {
        document.body.appendChild(elem.parentNode.removeChild(elem))
      }
      this.show_page_editor2();
      if (this.default_section) {
        SEMods.Apps.PageEditor.apps_pageeditmenu2_onclick(this.default_section)
      } else {
        SEMods.Apps.PageEditor.apps_pageeditmenu2_onclick('layout')
      }
    } else {
      this.status = 0;
      $('apps_overlay').setStyle('display', 'none');
      apps_show_error_message(r.err_msg ? r.err_msg: '')
    }
  },
  onLayoutPageEditorSuccess: function(obj, responseText) {
    var r = [];
    try {
      r = eval('(' + responseText + ')')
    } catch(e) {
      r.status = 1
    };
    this.slide_chain.unshift(function() {
      this.editor_elem_slide_direction = 1;
      this.slide_timer = setTimeout(this.pageeditor_slide.bind(this), 50)
    }.bind(this));
    if (r.status == 0) {
      this.layout = r.layout;
      this.page_id = r.layout.page_id;
      this.view_id = r.layout.view_id;
      this.status = 2;
      this.editor_elem_html = r.html;
      this.slide_chain.unshift(function() {
        this.editor_elem_slide_direction = 0;
        this.editor_elem.innerHTML = this.editor_elem_html;
        SEMods.Apps.ProfileDragDrop.add_new_objects(this.layout.newobjects, {
          'onDrop': SEMods.Apps.PageEditor.onAppPlaceCallback
        });
        this.slide_timer = setTimeout(this.pageeditor_slide.bind(this), 50)
      }.bind(this));
      this.slide_chain.unshift(function() {
        var elem = SEMods.B.ge("pageeditor_appsettings");
        if (elem) {
          document.body.appendChild(elem.parentNode.removeChild(elem))
        }
      }.bind(this))
    } else {
      this.status = 0;
      apps_show_error_message(r.err_msg ? r.err_msg: '')
    }
    if (this.slide_timer == 0) {
      var func = this.slide_chain.pop();
      func()
    }
  },
  onLayoutPageEditor2Fail: function(obj, responseText) {
    $('apps_load').setStyle('display', 'none');
    $('apps_overlay').setStyle('display', 'none');
    apps_show_error_message()
  },
  onLayoutPageEditorFail: function(obj, responseText) {
    apps_show_error_message()
  },
  save_layout: function() {
    if((this.layout.style_custom == 1) && ($('pageeditor2_style_customcss') != null)){
      //params += '&style_css=' + $('pageeditor2_style_customcss').value;
      this.layout.style_css = $('pageeditor2_style_customcss').value.replace(/"/g, "jsedq");
    } else {
      this.layout.style_css = '';
    }
    var ajax = new SEMods.Ajax(this.onSaveLayoutSuccess.bind(this), this.onSaveLayoutFail.bind(this));
    var params = 'task=savepagelayout&pid=' + this.page_id + '&vid=' + this.view_id + '&user=' + SEMods.Apps.ProfileDragDrop.owner;
    params += '&layout=' + SEMods.Apps.JSON.encode(this.layout);
    ajax.post(SEMods.Apps.api_endpoint, params)
  },
  onSaveLayoutSuccess: function(obj, responseText) {
    var r = [];
    try {
      r = eval('(' + responseText + ')')
    } catch(e) {
      r.status = 1
    };
    if (r.status == 0) {
      document.location = document.location
    } else {
      apps_show_error_message(r.err_msg ? r.err_msg: '')
    }
  },
  onSaveLayoutFail: function(obj, responseText) {
    apps_show_error_message()
  },
  apps_layoutmenu_onclick: function(id) {
    if (!SEMods.B.ge('widget_' + id).disabled) {
      SEMods.B.ge('widget_' + id).checked = !SEMods.B.ge('widget_' + id).checked;
      this.layout.widgets[id] = SEMods.B.ge('widget_' + id).checked * 1
    }
  },
  apps_pageeditmenu_onclick: function(id) {
    var apps_pagemenu_wasactive = this.apps_pagemenu_active;
    this.apps_pageeditmenu_hideall();
    if (apps_pagemenu_wasactive != id) {
      SEMods.B.ge("menubutton_" + id).className = "pageeditor_button_active";
      SEMods.B.show("pageeditor_menu_" + id);
      this.apps_pagemenu_active = id
    }
  },
  apps_pageeditmenu2_onclick: function(id) {
    var apps_pagemenu_wasactive = this.apps_pagemenu2_active;
    this.apps_pageeditmenu2_hideall();
    SEMods.B.ge("editor2_" + id).className = "pageeditor2_button_active";
    SEMods.B.show("pageeditor2_menu_" + id);
    this.apps_pagemenu2_active = id
  },
  apps_pageeditmenu2_hideall: function() {
    if (this.apps_pagemenu2_active) {
      SEMods.B.hide("pageeditor2_menu_" + this.apps_pagemenu2_active);
      SEMods.B.ge("editor2_" + this.apps_pagemenu2_active).className = '';
      this.apps_pagemenu2_active = null
    }
  },
  apps_pageeditmenu_hideall: function() {
    if (this.apps_pagemenu_active) {
      var elem = SEMods.B.ge("menubutton_" + this.apps_pagemenu_active);
      if (elem) elem.className = "pageeditor_button";
      SEMods.B.hide("pageeditor_menu_" + this.apps_pagemenu_active);
      this.apps_pagemenu_active = null
    }
  },
  apps_layout_select: function(id) {
    var elems = SEMods.Apps.ProfileDragDrop.getElementsByName_compat("apps_layout_selector", "A");
    for (var i = 0; i < elems.length; i++) {
      elems[i].className = "ymenu_item layout_unselected"
    }
    SEMods.B.ge("apps_layout_selector_" + id).className = "ymenu_item layout_selected";
    this.layout.layout_id = id
  },
  apps_theme_select: function(id) {
    var elems = SEMods.Apps.ProfileDragDrop.getElementsByName_compat("apps_style_selector", "A");
    for (var i = 0; i < elems.length; i++) {
      elems[i].className = "smenu_item style_unselected"
    }
    SEMods.B.ge("apps_style_selector_" + id).className = "smenu_item style_selected";
    this.layout.style_id = id
  },
  add_app: function(app_id) {
    this.onDragStart2();
    SEMods.Apps.ProfileDragDrop.buildStripes();
    identity = SEMods.Apps.ProfileDragDrop.getBoxIdentity(app_id);
    app_block_id = app_id;
    curDropTarget = SEMods.B.ge(app_block_id);
    stripe = SEMods.Apps.ProfileDragDrop.stripes[0];
    stripe.e.insertBefore(curDropTarget, stripe.e.firstChild);
    identity.stripe = stripe.id;
    identity.container = stripe.c;
    if (identity.onDrop) {
      identity.onDrop(identity)
    }
  },
  choose_style : function() {
    $('pageeditor2_style_choose').className = "active_style_tab";
    $('pageeditor2_style_custom').className = "";
    
    $('pageeditor2_style_custom_showroom').style.display = "none";
    $('pageeditor2_style_choose_showroom').style.display = "block";

    this.layout.style_custom = 0
  },
  custom_style : function() {
    $('pageeditor2_style_custom').className = "active_style_tab";
    $('pageeditor2_style_choose').className = "";
    
    $('pageeditor2_style_custom_showroom').style.display = "block";
    $('pageeditor2_style_choose_showroom').style.display = "none";

    this.layout.style_custom = 1
  },
  _cancelEvent: function(e) {
    var e = e ? e: window.event;
    if (e.preventDefault) e.preventDefault();
    if (e.stopPropagation) e.stopPropagation();
    e.cancelBubble = true;
    e.returnValue = false;
    return false
  }
}
SEMods.Paginator = function(ajax_endpoint, total_items, nohide) {
  this.ajax_endpoint = ajax_endpoint;
  this.total_items = total_items;
  if (nohide) this.nohide = true
}
SEMods.Paginator.prototype = {
  obj: null,
  ajax_endpoint: '',
  current_page: 1,
  total_items: 1,
  last_visible_item: 1,
  ajaxProgressElem: 'paginator_ajax_progress',
  ajaxContentElem: 'ajax_content',
  nohide: false,
  params: '',
  onError_callback: null,
  onComplete_callback: null,
  set_url: function(url) {
    this.ajax_endpoint = url
  },
  set_params: function(params) {
    this.params = params
  },
  paginate_left: function() {
    SEMods.B.ge("left_paginator").blur();
    if (this.current_page == 1) return false;
    this.paginate(this.current_page - 1)
  },
  paginate_right: function() {
    SEMods.B.ge("right_paginator").blur();
    if (this.total_items == this.last_visible_item) return false;
    this.paginate(this.current_page + 1)
  },
  paginate: function(page) {
    SEMods.B.toggle(this.ajaxProgressElem, this.ajaxContentElem);
    var ajax = new SEMods.Ajax(this.onPaginateSuccess.bind(this), this.onPaginateFail.bind(this));
    var params = "task=getitems" + "&p=" + page + this.params;
    ajax.post(this.ajax_endpoint, params)
  },
  refresh: function() {
    this.paginate(this.current_page)
  },
  hideAll: function() {
    SEMods.B.hide(this.ajaxProgressElem, this.ajaxContentElem, "paginator")
  },
  showAll: function() {
    SEMods.B.show(this.ajaxContentElem);
    if ((this.current_page == 1) && (this.last_visible_item == this.total_items)) {} else SEMods.B.show("paginator")
  },
  onPaginateSuccess: function(ajaxObj, responseText) {
    var r = [];
    try {
      r = eval('(' + responseText + ')')
    } catch(e) {
      r.status = 1;
      r.html = 'Error loading content.'
    };
    if (typeof r != 'object') {
      r = [];
      r.status = 1;
      r.html = 'Error loading content.'
    }
    if (r.status == 0) {
      this.current_page = r.page;
      this.total_items = r.total;
      this.last_visible_item = r.to;
      SEMods.B.ge("page_from").innerHTML = r.from;
      SEMods.B.ge("page_to").innerHTML = r.to;
      SEMods.B.ge("total_items").innerHTML = r.total;
      if (this.total_items == 0) {} else {
        if ((this.current_page == 1) && (this.last_visible_item == this.total_items)) {
          if (!this.nohide) SEMods.B.hide("paginator")
        } else {
          SEMods.B.show("paginator")
        }
      }
      if (this.current_page == 1) {
        SEMods.B.ge("left_paginator").className = "paginator_disabled"
      } else {
        SEMods.B.ge("left_paginator").className = ""
      }
      if (r.total == r.to) {
        SEMods.B.ge("right_paginator").className = "paginator_disabled"
      } else {
        SEMods.B.ge("right_paginator").className = ""
      }
    } else if (this.onError_callback) {
      this.onError_callback()
    }
    SEMods.B.ge(this.ajaxContentElem).innerHTML = r.html;
    SEMods.B.toggle(this.ajaxProgressElem, this.ajaxContentElem)
    if (this.onComplete_callback) {
      this.onComplete_callback();
    }
  },
  onPaginateFail: function(ajaxObj, respText) {
    SEMods.B.ge(this.ajaxContentElem).innerHTML = "Error";
    SEMods.B.toggle(this.ajaxProgressElem, this.ajaxContentElem);
    if (this.onError_callback) {
      this.onError_callback()
    }
  }
}
function SEModsBase() {};
SEModsBase.version = "1.0.1";
SEModsBase.prototype = {
  extend: function(source, value) {
    var extend = SEModsBase.prototype.extend;
    if (arguments.length == 2) {
      var ancestor = this[source];
      if ((ancestor instanceof Function) && (value instanceof Function) && ancestor.valueOf() != value.valueOf() && /\b_super\b/.test(value)) {
        var method = value;
        value = function() {
          var previous = this._super;
          this._super = ancestor;
          var returnValue = method.apply(this, arguments);
          this._super = previous;
          return returnValue
        };
        value.valueOf = function() {
          return method
        };
        value.toString = function() {
          return String(method)
        }
      }
      return this[source] = value
    } else if (source) {
      var _prototype = {
        toSource: null
      };
      var _protected = ["toString", "valueOf"];
      if (SEModsBase._prototyping) _protected[2] = "constructor";
      for (var i = 0;
      (name = _protected[i]); i++) {
        if (source[name] != _prototype[name]) {
          extend.call(this, name, source[name])
        }
      }
      for (var name in source) {
        if (!_prototype[name]) {
          extend.call(this, name, source[name])
        }
      }
    }
    return this
  },
  _super: function() {}
};
SEModsBase.extend = function(_instance, _static) {
  var extend = SEModsBase.prototype.extend;
  if (!_instance) _instance = {};
  if (_instance.constructor == Object) {
    _instance.constructor = new Function
  }
  SEModsBase._prototyping = true;
  var _prototype = new this;
  extend.call(_prototype, _instance);
  var constructor = _prototype.constructor;
  _prototype.constructor = this;
  delete SEModsBase._prototyping;
  var klass = function() {
    if (!SEModsBase._prototyping) constructor.apply(this, arguments);
    this.constructor = klass
  };
  klass.prototype = _prototype;
  klass.extend = this.extend;
  klass.toString = function() {
    return String(constructor)
  };
  extend.call(klass, _static);
  var object = constructor ? klass: _prototype;
  if (object.constructor instanceof Function) object.constructor();
  return object
};
var semods_app = SEModsBase.extend({
  app_id: '',
  page_id: '',
  view_id: '',
  instance_id: '',
  stripe: '',
  container: '',
  placement: '',
  app_block_id: '',
  owner: '',
  timer: null,
  timer_period: 60 * 1000,
  APPS_PAGE_PROFILE: 1,
  APPS_PAGE_USERHOME: 2,
  APPS_PAGE_MYPAGE: 3,
  APPS_PAGE_GROUP: 4,
  APPS_PAGE_HOME: 5,
  APPS_PAGE_EVENT: 6,
  APPS_PAGE_NETWORK: 7,
  APPS_PAGE_CANVAS: 100,
  constructor: function(app_id, page_id, view_id, instance_id, stripe_id, container, placement) {
    this.app_id = app_id;
    this.page_id = page_id;
    this.view_id = view_id;
    this.instance_id = instance_id;
    this.stripe_id = stripe_id;
    this.container = container;
    this.placement = placement;
    this.app_block_id = 'app_' + app_id
  },
  request: function(params, onDone, onFail) {
    var ajax = new SEMods.Ajax(onDone, onFail);
    var ajax_params = 'pageid=' + this.page_id + '&viewid=' + this.view_id + '&appid=' + this.app_id + '&instanceid=' + this.instance_id;
    if (this.stripe_id) {
      ajax_params += '&stripe=' + this.stripe_id
    }
    if (this.container) {
      ajax_params += '&container=' + this.container
    }
    if (this.placement) {
      ajax_params += '&placement=' + this.placement
    }
    if (params) {
      ajax_params += '&' + params
    }
    ajax.post(SEMods.Apps.ProfileDragDrop.api_content_endpoint, ajax_params)
  },
  set_timer_period_in_seconds: function(timer_period) {
    this.timer_period = timer_period * 1000
  },
  start_timer: function(timer_period) {
    if (typeof timer_period == 'undefined') timer_period = this.timer_period;
    if (timer_period == 0) return;
    if (this.on_timer) {
      this.timer = setTimeout(this.on_timer.bind(this), timer_period)
    }
  },
  stop_timer: function() {
    clearTimeout(this.timer)
  },
  register_on_drop: function() {
    if (this.on_drop) {
      SEMods.Apps.register_on_drop(this.app_id, this.on_drop.bind(this))
    }
  },
  register_on_ajax_load: function() {
    if (this.on_ajax_load) {
      SEMods.Apps.register_on_ajax_load(this.app_id, this.on_ajax_load.bind(this))
    }
  },
  submit_form: function(form_id) {
    var elem = SEMods.B.ge(form_id);
    if (!elem) {
      return
    }
    var editinplace = 1;
    var editor = new SEMods.Apps.ContentEditor(this.page_id, this.view_id, this.app_id, this.app_block_id, this.stripe_id, this.placement, this.container, this.owner, editinplace);
    editor.form = elem;
    editor.submit_form()
  },
  load_content: function() {
    SEMods.Apps.ProfileDragDrop.reloadContentEx(this.app_block_id)
  }
});



SEMods.Apps.RssFeedReader = {};
SEMods.Apps.RssFeedReader = {
  feeds : [],
  status : 0,
  app_id : 0,
  item_id : 0,
  iframe_elem : null,
  iframe_wrapper_elem : null,
  iframe_active : false,
  position_save_y : 0,
  reader_hidden : true,
  unread_count : 0,
  content_window : null,
  current_feed_item_id : null,
  overlay_iframe : null,  

  read_content_inline : false,
  
  setting_dock_to_menu : 1,
  setting_rssreader_enabled : 1,
  setting_show_bottom_ad : 0,
  setting_bottom_ad_height : 60,
  
  lang_feed_view : '',
  lang_web_view : '',
  
  browser_overlay_iframe : !SEMods.Browser.isOpera && !/Safari/i.test(navigator.userAgent),
  
  read_all : function() {
    $$('div.rss_feed_reader_headline').each( function(el) { el.removeClass('rss_feed_reader_headline_unread'); el.addClass('rss_feed_reader_headline_read');} );
    var read_items = [];
    for (var i in this.feeds[this.app_id].items) {
      this.feeds[this.app_id].items[i].unread = false;
      read_items.push(i);
    }
    this.unread_count = 0;
    this.update_unread_counter();
    
    read_items.join(',');

    var params = 'task=rss_feed_read_all&pid=' + SEMods.Apps.ProfileDragDrop.page_id+ '&vid=' + SEMods.Apps.ProfileDragDrop.view_id + '&appid=' + this.app_id + '&feed_read_items=' + read_items;
    new SEMods.Ajax().post(SEMods.Apps.ProfileDragDrop.api_endpoint, params)
  },

  unread_all : function() {
    $$('div.rss_feed_reader_headline').each( function(el) { el.removeClass('rss_feed_reader_headline_read'); el.addClass('rss_feed_reader_headline_unread');} );
    for (var i in this.feeds[this.app_id].items) {
      this.feeds[this.app_id].items[i].unread = true;
    }
    this.unread_count = $$('div.rss_feed_reader_headline').length;
    this.update_unread_counter();
    
    var params = 'task=rss_feed_unread_all&pid=' + SEMods.Apps.ProfileDragDrop.page_id+ '&vid=' + SEMods.Apps.ProfileDragDrop.view_id + '&appid=' + this.app_id;
    new SEMods.Ajax().post(SEMods.Apps.ProfileDragDrop.api_endpoint, params)
  },
  
  switch_content_view : function() {
    // iframe -> inline
    if(this.read_content_inline == 1) {
      $('rss_feed_reader_button_contentviewswitch').innerHTML = this.lang_feed_view;
      this.read_content_inline = 0;
    } else {
      $('rss_feed_reader_button_contentviewswitch').innerHTML = this.lang_web_view;
      this.read_content_inline = 1;
      this.iframe_active = 0;
      if(this.iframe_elem) {
        this.iframe_elem.parentNode.removeChild(this.iframe_elem);
      }
    }
    this.show_item(this.current_feed_item_id);
  },
  
  update_unread_counter : function() {
    $('rss_feed_reader_unreadcount').innerHTML = this.unread_count;
  },
  
  read_item : function (app_id,feed_item_id) {
    this.app_id = app_id;
    this.item_id = feed_item_id;
    
    this.current_feed_item_id = null;

    if(this.setting_rssreader_enabled == 1) {
      
      this.populate_items();
      this.show_feed_reader();
      this.show_item(feed_item_id);
      
    } else {
      
      this.show_item_in_new_window(feed_item_id);
      
    }
    
  },

  show_item_in_new_window : function(feed_item_id) {
    var feed_item = this.feeds[this.app_id].items[feed_item_id];
    if (typeof feed_item == 'undefined') {
      feed_item = this.current_feed_item_obj;
    }
    this.current_feed_item_id = feed_item_id;
    this.current_feed_item_obj = feed_item;

    if(feed_item.unread) {
      this.unread_count--;
      feed_item.unread = false;
      this.report_read_item(feed_item_id);
    }

    window.open(feed_item.link);

  },
  
  set_feed : function(app_id, feed) {
    this.feeds[app_id] = feed;
    
    // TODO: make new items slide from top
    if(!this.reader_hidden && (this.app_id == app_id)) {
      this.populate_items();
    }
    
  },
  
  show_item : function(feed_item_id) {
    var feed_item = this.feeds[this.app_id].items[feed_item_id];
    if (typeof feed_item == 'undefined') {
      // try to recover from current item
      feed_item = this.current_feed_item_obj;
    }
    this.current_feed_item_id = feed_item_id;
    this.current_feed_item_obj = feed_item;
    
    var src_elem = this.app_id + "_" + feed_item_id;
    
    try {
      $(src_elem).removeClass('rss_feed_reader_headline_unread');
      $(src_elem).addClass('rss_feed_reader_headline_read');
    } catch(ex) {}
      
    try {
      if(this.current_feed_item) {
        $(this.current_feed_item).removeClass('rss_feed_reader_headline_selected');
      }
    } catch(ex) {}
      
    try {
      this.current_feed_item = src_elem;
      $(src_elem).addClass('rss_feed_reader_headline_selected');
    } catch(ex) {}
    
    if(this.read_content_inline == 1) {
      $('rss_feed_reader_content_title_link').href = feed_item.link;
      $('rss_feed_reader_content_title_link').innerHTML = feed_item.title;
      $('rss_feed_reader_content_title_date').innerHTML = feed_item.date;
      $('rss_feed_reader_content_content').innerHTML = feed_item.content;
      $('rss_feed_reader_content_inline').style.display = 'block';
    } else {
      $('rss_feed_reader_content_inline').style.display = 'none';
      if(this.iframe_elem == null) {
        this.iframe_elem = document.createElement("IFRAME");
        this.iframe_elem.id = "rss_feed_reader_content_iframe";

        //var height_delta = 18; // offsets
        var height_delta = 2; // offsets

        $(this.iframe_elem).setStyle('height', $('rss_feed_reader_content').offsetHeight - height_delta + 'px');
        //$(this.iframe_elem).setStyle('width', $('rss_feed_reader_content').offsetWidth - 4 + 'px');
        $(this.iframe_elem).setStyle('width', $('rss_feed_reader_content').offsetWidth - 2 + 'px');
        this.iframe_elem.frameBorder = 0;
      }
      if(!this.iframe_active) {
        $('rss_feed_reader_content').appendChild(this.iframe_elem);
        this.iframe_active = true;
      }
      this.iframe_elem.src = feed_item.link;
        
    }
    
    if(feed_item.unread) {
      this.unread_count--;
      feed_item.unread = false;
      this.report_read_item(feed_item_id);
    }
    
    this.update_unread_counter();
    
  },
  
  report_read_item : function(feed_item_id) {
    var feed_item = this.feeds[this.app_id].items[feed_item_id];
    var ajax = new SEMods.Ajax();
    var params = 'task=rss_feed_read_item&pid=' + SEMods.Apps.ProfileDragDrop.page_id+ '&vid=' + SEMods.Apps.ProfileDragDrop.view_id + '&appid=' + this.app_id + '&feed_item_id=' + feed_item_id + '&feed_item_link=' + escape(feed_item.link) + '&feed_item_title=' + encodeURIComponent(feed_item.title);
    ajax.post(SEMods.Apps.ProfileDragDrop.api_endpoint, params)
  },
  
  populate_items : function() {


    items = '';
    var unread_count = 0;
    
    for (var i in this.feeds[this.app_id].items) {
      readundreadclass = this.feeds[this.app_id].items[i].unread ? "rss_feed_reader_headline_unread" : "rss_feed_reader_headline_read";
      if(this.feeds[this.app_id].items[i].unread) {
        unread_count++;
      }
      items += "<div id=\"" + this.app_id + "_" + this.feeds[this.app_id].items[i].id + "\" class=\"rss_feed_reader_headline " + readundreadclass + "\"><a onclick=\"SEMods.Apps.RssFeedReader.show_item('" + this.feeds[this.app_id].items[i].id + "'); this.blur(); return false\" href=\"\">" + this.feeds[this.app_id].items[i].title + "</a></div>";
    }
    this.unread_count = unread_count;

    $('rss_feed_reader_headlines').innerHTML = items;
    
  },
  
  show_feed_reader : function() {
    this.position_save_y = $(document.body).getScrollTop();
    
    if(this.browser_overlay_iframe) {
      if(this.iframe_wrapper_elem == null) {
        this.iframe_wrapper_elem = document.createElement("IFRAME");
        this.iframe_wrapper_elem.id = "rss_feed_reader_wrapper_iframe";
        this.iframe_wrapper_elem.style.display = "none";
        this.iframe_wrapper_elem.frameBorder = 0;
        document.body.appendChild(this.iframe_wrapper_elem);
      }
    }
    
    $('rss_feed_reader_wrapper').setStyle('display', 'block');    
    if(this.browser_overlay_iframe) {
      $('rss_feed_reader_wrapper_iframe').setStyle('display', 'block');
    }
    $(document.body).setStyle('overflow', 'hidden');
    document.body.scroll = "no";
    this.adjust_to_screen();

    new Fx.Scroll($(document.body)).set(0, 0);
    this.reader_hidden = false;

    if(!this.browser_overlay_iframe) {

      // hide "content" div
      var content_window = $$('div.content');
      if(content_window && content_window.length > 0) {
        this.content_window = content_window[0];
        if(SEMods.Browser.isIE) {
          this.content_window.setStyle('margin-left', '-9999px');    
        } else {
          this.content_window.style.display = "none";
        }
      }

    }
    
    
    // ad
    if(this.setting_show_bottom_ad == 1) {
      $('rss_feed_reader_ads').setStyle('height', this.setting_bottom_ad_height + 'px');    
      $('rss_feed_reader_ads').setStyle('display', 'block');    
    }

    // feed title
    var feed = this.feeds[this.app_id];
    $('rss_feed_reader_title_link').innerHTML = feed.title;

    this._addEvent(document.body, "resize", this.onResize.bind(this));
    
  },
  
  adjust_to_screen : function() {
    // adjust to screen height
    // pageeditmenu2_left (550), pageeditmenu2_right(550), pageeditor2_scroller_widgets(max-height: 480), pageeditor2_scroller_blocks(480)
    var window_height = window.getHeight();
    var window_width = window.getWidth();
    
    var height_shift = 0;
    
    if(this.setting_dock_to_menu == '1') {

      var content_window = $$('div.content');
      if(content_window && content_window.length > 0) {
        content_window = content_window[0];
        height_shift = SEMods.B.findY(content_window);
      }
      
    }
    
    var height_delta = 30 + 10 + 10 + 10 + 4*2;  // header height+padding + border (4)
    var width_delta = 5*2 + 4*2;  // margin + border

    // chat plugin
    var bottom_height_shift = 0;
    if($('seIM_tray') && ($$('td.seIMInvisible').length == 0) ) {
      bottom_height_shift = $('seIM_tray').getHeight();
    }
    
    $('rss_feed_reader_headlines').setStyle('height', window_height - height_shift - bottom_height_shift - height_delta + 'px');

    var content_height_shift = 0;

    if(this.setting_show_bottom_ad == 1) {
      content_height_shift += this.setting_bottom_ad_height; // ads
      //content_height_shift += 100; // ads
    }

      
    $('rss_feed_reader_content').setStyle('height', window_height - height_shift - bottom_height_shift - height_delta - content_height_shift + 'px');

    $('rss_feed_reader_wrapper').setStyle('width', window_width - width_delta + 'px');

    $('rss_feed_reader_wrapper').setStyle('left', '0px');
    $('rss_feed_reader_wrapper').setStyle('top', height_shift + 'px');
    $('rss_feed_reader_wrapper').setStyle('display', 'block');

    if(this.browser_overlay_iframe) {
      $('rss_feed_reader_wrapper_iframe').setStyle('width', window_width - width_delta + 'px');
      $('rss_feed_reader_wrapper_iframe').setStyle('left', '0px');
      $('rss_feed_reader_wrapper_iframe').setStyle('top', height_shift + 'px');
      $('rss_feed_reader_wrapper_iframe').setStyle('display', 'block');
      $('rss_feed_reader_wrapper_iframe').setStyle('height', $('rss_feed_reader_wrapper').getHeight() + 'px' );
    }

    if(!this.browser_overlay_iframe) {
      $('rss_feed_reader_wrapper').setStyle('z-index', '0');
    }

  },
  
  hide_feed_reader : function() {

    this._removeEvent(document.body, "resize");

    this.reader_hidden = true;

    if(!this.browser_overlay_iframe) {
      if(this.content_window) {
        if(SEMods.Browser.isIE) {
          this.content_window.setStyle('margin-left', '0px');    
        } else {
          this.content_window.style.display = "block";
        }
      }
    }


    new Fx.Scroll($(document.body)).set(0, this.position_save_y);

    $('rss_feed_reader_wrapper').setStyle('display', 'none');    
    if(this.browser_overlay_iframe) {
      $('rss_feed_reader_wrapper_iframe').setStyle('display', 'none');
    }
    $(document.body).setStyle('overflow', 'auto');
    document.body.scroll = "auto";
    
    // also hide iframe
    if(this.iframe_elem) {
      this.iframe_elem.src = "";
    }
    
  },
  
  onResize : function() {
    this.adjust_to_screen();
  },
  
  load_feed_reader : function() {
  },

  _addEvent: function($obj, $event, $handler) {
    var fn = $handler;
    if (!$obj.attachedEvents) $obj.attachedEvents = new Array();
    if ($obj.attachedEvents[$event]) this._removeEvent($obj, $event);
    $obj.attachedEvents[$event] = fn;
    if (typeof $obj.addEventListener != 'undefined') $obj.addEventListener($event, $handler, false);
    else if (typeof $obj.attachEvent != 'undefined') $obj.attachEvent('on' + $event, $handler)
  },
  _removeEvent: function($obj, $event) {
    if (!$obj.attachedEvents || !$obj.attachedEvents[$event]) return;
    if (typeof $obj.removeEventListener != 'undefined') $obj.removeEventListener($event, $obj.attachedEvents[$event], false);
    else if (typeof $obj.detachEvent != 'undefined') $obj.detachEvent('on' + $event, $obj.attachedEvents[$event])
  },
  _cancelEvent: function(e) {
    var e = e ? e: window.event;
    if (e.preventDefault) e.preventDefault();
    if (e.stopPropagation) e.stopPropagation();
    e.cancelBubble = true;
    e.returnValue = false;
    return false
  }
  
}
