/*global YAHOO,AZCAT,isFCKEditorBrowse,urllib_quote,portal_url,user,alert */

/*jslint browser: true, unparam: true, sloppy: true, indent: 2 */

(function () {

  var $l = YAHOO.lang,
    $s = AZCAT.siteman;

  $s.prefs = (function () {
    // Private member variables
    var m_dirtyPreferences = {},
      m_preferences = {},
      m_preferencesDefault,
      m_isLoaded = false;
    function m_setDirty(column, dirty) {
      var x, xlen;
      if (column !== undefined && dirty !== undefined) {
        if ($l.isString(column)) {
          m_dirtyPreferences[column] = !!dirty;
        } else if ($l.isArray(column)) {
          dirty = !!dirty;
          for (x = 0, xlen = column.length; x < xlen; x += 1) {
            m_dirtyPreferences[column[x]] = dirty;
          }
        }
      }
    }
    function m_getDirty(column) {
      if (column !== undefined) {
        return m_dirtyPreferences[column];
      }
      var retVal = [], x;
      for (x in m_dirtyPreferences) {
        if (m_dirtyPreferences.hasOwnProperty(x) && m_dirtyPreferences[x]) {
          retVal.push(x);
        }
      }
      return retVal;
    }
    function m_setDefaultPreference(name, value) {
      var retVal = {};
      m_preferencesDefault[name] = value;
      retVal[name] = value;
      return retVal;
    }
    function m_setDefaultPreferencesFromServer(o) {
      var dataDict = JSON.parse(o.responseText), name;
      for (name in dataDict) {
        if (dataDict.hasOwnProperty(name)) {
          m_setDefaultPreference(name, dataDict[name]);
        }
      }
    }
    function m_setPreference(name, value, root_id) {
      var retVal, view, last;
      // Using JSON.parse(JSON.stringify()) as a hacky deep clone
      if ($l.isArray(value) || $l.isObject(value)) {
        value =  JSON.parse(JSON.stringify(value));
      }
      switch (name) {
      case "columns":
      case "perPage":
      case "perRow":
        view = m_preferences.view && m_preferences.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"] && m_preferences.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id];
        if (!view) {
          if (!m_preferences.view) {
            m_preferences.view = {};
          }
          if (!m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"]) {
            m_preferences.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"] = {};
          }
          m_preferences.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id] = {};
          view = m_preferences.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id];
        }
        if (!view[$s.dataView.getViewType()]) {
          view[$s.dataView.getViewType()] = {};
        }
        if (!view[$s.dataView.getViewType()][name]) {
          view[$s.dataView.getViewType()][name] = {};
        }
        view[$s.dataView.getViewType()][name] = value;
        return {"view": m_preferences.view};

      case "lastViewMethod":
      case "lastSearchedBy":
      case "lastSearchedByType":
      case "lastSortedOn":
      case "lastSortedOrder":
        last = m_preferences.last && m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"] && m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id];
        if (!last) {
          if (!m_preferences.last) {
            m_preferences.last = {};
          }
          if (!m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"]) {
            m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"] = {};
          }
          m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id] = {};
          last = m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id];
        }
        if (!last[name]) {
          last[name] = {};
        }
        last[name] = value;
        return {"last": m_preferences.last};

      default:
        m_preferences[name] = value;
        retVal = {};
        retVal[name] = value;
        return retVal;
      }
    }
    function m_setPreferencesFromServer(o, callback, root_id) {
      var dataDict, name;
      if (user !== "Anonymous User") {
        dataDict = JSON.parse(o.responseText);
        for (name in dataDict) {
          if (dataDict.hasOwnProperty(name)) {
            m_setPreference(name, dataDict[name], root_id);
          }
        }
      }
      m_isLoaded = true;
      if (callback) {
        callback();
      }
    }
    function m_getPreferencesFromServer_real(callback) {
      var load_request = YAHOO.util.Connect.getConnectionObject(), httpStatus;
      load_request.conn.open("POST", portal_url + "/getMemberPreferences", false);
      load_request.conn.send('');
      httpStatus = load_request.conn.status;
      if ((httpStatus >= 200 && httpStatus < 300) || httpStatus === 1223) {
        m_setPreferencesFromServer(load_request.conn, callback);
      } else {
        AZCAT.utils.connFail();
      }
    }
    function m_getPreferencesFromServer(callback) {
      var load_request = YAHOO.util.Connect.getConnectionObject(), httpStatus;
      if (!m_preferencesDefault) {
        m_preferencesDefault = {};
        load_request.conn.open("POST", portal_url + "/getDefaultMemberPreferences", false);
        load_request.conn.send('');
        httpStatus = load_request.conn.status;
        if ((httpStatus >= 200 && httpStatus < 300) || httpStatus === 1223) {
          m_setDefaultPreferencesFromServer(load_request.conn, callback);
          m_getPreferencesFromServer_real(callback);
        } else {
          AZCAT.utils.connFail();
        }
      } else {
        m_getPreferencesFromServer_real(callback);
      }
    }
    function m_getPreference(name, root_id) {
      var returnme = null, view, last;
      if (!m_isLoaded) {
        m_getPreferencesFromServer();
      }
      switch (name) {
      case "perPage":
      case "perRow":
      case "columns":
        view = m_preferences.view && m_preferences.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"] && m_preferences.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id];
        if (!$l.isUndefined(view) && !$l.isUndefined(view[$s.dataView.getViewType()]) && !$l.isUndefined(view[$s.dataView.getViewType()][name])) {
          returnme = view[$s.dataView.getViewType()][name];
          break;
        }
        view = m_preferencesDefault.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id];
        if (!$l.isUndefined(view) && !$l.isUndefined(view[$s.dataView.getViewType()]) && !$l.isUndefined(view[$s.dataView.getViewType()][name])) {
          returnme = view[$s.dataView.getViewType()][name];
          break;
        }
        returnme = m_preferencesDefault.view[isFCKEditorBrowse ? "FCKEditor" : "site_manager"]["default"][$s.dataView.getViewType()][name];
        break;
      case "lastViewMethod":
      case "lastSearchedBy":
      case "lastSearchedByType":
      case "lastSortedOn":
      case "lastSortedOrder":
        last = m_preferences.last && m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"] && m_preferences.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id];
        if (!$l.isUndefined(last) && !$l.isUndefined(last[name])) {
          returnme = last[name];
          break;
        }
        last = m_preferencesDefault.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"][root_id];
        if (!$l.isUndefined(last) && !$l.isUndefined(last[name])) {
          returnme = last[name];
          break;
        }
        returnme = m_preferencesDefault.last[isFCKEditorBrowse ? "FCKEditor" : "site_manager"]["default"][name];
        break;
      default:
        if (m_preferences[name]) {
          returnme = m_preferences[name];
          break;
        }
        returnme = m_preferencesDefault[name];
        break;
      }
      if (returnme !== null) {
        // Using JSON.parse(JSON.stringify()) as a hacky deep clone
        if ($l.isArray(returnme) || $l.isObject(returnme)) {
          return JSON.parse(JSON.stringify(returnme));
        } else {
          return returnme;
        }
      }
      throw "UnknownPreference"; // Somebody did it wrong
    }
    return {
      // Privileged methods
      savePreferences: function () {
        var dirtyColumns, i, iLen, column, preferenceDict;
        if (user === 'Anonymous User') {
          return;
        }
        preferenceDict = {};
        dirtyColumns = m_getDirty();
        for (i = 0, iLen = dirtyColumns.length; i < iLen; i += 1) {
          column = dirtyColumns[i];
          preferenceDict[column] = m_getPreference(column);
        }
        m_setDirty(dirtyColumns, false);
        preferenceDict = JSON.stringify(preferenceDict);
        if (preferenceDict !== '{}') {
          YAHOO.util.Connect.asyncRequest("POST", [portal_url, "/saveMemberPreferences"].join(""), {"success": function () {
          }, "failure": function (o) {
            alert(["There was an error saving preferences: ", o.statusText].join(""));
          }}, 'prefs=' + urllib_quote(preferenceDict));
        }
      },
      setPreferences: function (dataDict, root_id) {
        var name, currentPrefData;
        for (name in dataDict) {
          if (dataDict.hasOwnProperty(name)) {
            currentPrefData = AZCAT.siteman.prefs.getPreference(name, root_id);
            if (currentPrefData === dataDict[name]) {
              continue;
            }
            m_setPreference(name, dataDict[name], root_id);
            switch (name) {
            case "perPage":
            case "perRow":
            case "columns":
              m_setDirty('view', true);
              break;
            case "lastViewMethod":
            case "lastSearchedBy":
            case "lastSearchedByType":
            case "lastSortedOn":
            case "lastSortedOrder":
              m_setDirty('last', true);
              break;
            default:
              m_setDirty(name, true);
            }
          }
        }
      },
      isPreferenceDirty: function (name) {
        return m_getDirty(name);
      },
      getPreference: function (name, root_id) {
        return m_getPreference(name, root_id);
      },
      getPreferencesFromServer: m_getPreferencesFromServer
    };

  }());

}());

AZCAT.register("prefs", AZCAT.siteman.prefs, {version: "2.0.0", build: "???"});

