AjaxResponse.setDefaultHandler('onFatalError', function(msg) {showFatalError(msg)});
AjaxResponse.setDefaultHandler('onError', function(msg) {showError(msg)});
AjaxResponse.setDefaultHandler('onInfo', function(msg) {showSuccess(msg)});

AjaxEngine.setDefaultHandler('onGroupBegin', function(req, args, handlers) {args['groupName'] == 'popup' ? showPopupLoader() : s('wpdc_' + args['groupName'] + '_loader');});
AjaxEngine.setDefaultHandler('onGroupEnd', function(req, args, handlers) {args['groupName'] == 'popup' ? hidePopupLoader() : h('wpdc_' + args['groupName'] + '_loader');});
AjaxEngine.setDefaultHandler('onError', function(req, args, handlers) {showFatalError(req.responseText.substring(0, 200))});

var email_pattern = '([\\!\\#-\\\'\\*\\+\\-\\/-9\\=\\?A-Z\\^-\\~]+\\.?)+\\@([a-z0-9]([0-9a-z-]{0,61}[0-9a-z])?\\.)+[a-z]{2,}';
var regexp_email = new RegExp('^' + email_pattern + '$', 'i');
var regexp_multiple_email = new RegExp('^((' + email_pattern + ')\\s*,?\\s*)+$', 'i');

function enterPressed(o, e) {
  if (e && e.keyCode === 13) {
    e.cancelBubble = true;
    o.blur();
    return true;
  }
  return false;
}

function getFormParameters(form) {
  var params = {};
  if (form) {
    for (var i=0; i<form.elements.length; i++) {
      switch (form.elements[i].type) {
        case 'text': case 'password': case 'hidden': case 'textarea':
          params[form.elements[i].name] = form.elements[i].value;
          break;
        case 'select-one':
          if (typeof(form.elements[i].selectedIndex) != 'undefined' &&
              form.elements[i].selectedIndex >= 0) {
            params[form.elements[i].name] = form.elements[i].options[form.elements[i].selectedIndex].value;
          }
          break;
        case 'checkbox': case 'radio':
          params[form.elements[i].name] = form.elements[i].checked ? 1 : 0;
          break;
      }
    }
  }
  return params;
}

/**************************************************\
                  H I S T O R Y
\**************************************************/

function storeHistoryEvent(hid, handler, data) {
  History[hid] = {};
  History[hid].handler = function() {
    handler(data);
  }
  History[hid].active = 0;
}

function activateHistoryEvent(hid) {
  History[hid].active = 1;
}

function refreshPage(url) {
  return function() {
    location.href = url.replace(/#.*$/, '');
  }
}

function historyHandler(hid) {
  try {
    if (History[hid].active) {
      History[hid].handler();
      return;
    }
  } catch(e) {
    refreshPage(location.href)();
    return;
  }
  activateHistoryEvent(hid);
}

function addHistory(handler, data) {
  if (typeof(History.nextHid[History.hid])) {
    delete(History[History.nextHid[History.hid]]);
    History.nextHid[History.hid] = null;
  }
  var hid = '' + (new Date().getTime());
  History.nextHid[History.hid] = hid;
  History.hid = hid;
  storeHistoryEvent(hid, handler, data);
  window.frames['history_frame'].location.href = "/history.html?t=" + hid;
}

var History = {
  hid : '',
  nextHid : {},
  '' : {
    handler : refreshPage(location.href),
    active : 0
  }
};

/**************************************************\
           S T A T I C   P A G E S
\**************************************************/

function popupHandler(handler) {
  return function() {
    hidePopup();
    handler();
    return false;
  }
}

function focusFieldHandler(o) {
  return function() {
    hidePopup();
    o.focus();
    return false;
  }
}

function ajaxGetStaticPage(type) {
  addHistory(ajaxGetStaticPage, type);
  var args = {
    'url' : '/ajax/handlers/getstaticpage.xml?type=' + type,
    'groupName' : 'global'
  };
  AjaxEngine.makeReplaceCall('getstaticpage', args);
  return false;
}

/**************************************************\
        R E F R E S H   G A L L E R Y
\**************************************************/

function getGalleryForm() {
  return document.forms['gallery'];
}

function ajaxGetGallery(params) {
  addHistory(ajaxGetGallery, params);
  var args = {
    'url' : '/ajax/handlers/getgallery.xml',
    'groupName' : 'global'
  };
  if (!document.getElementById('wpdc_gallery_content')) {
    params['full'] = 1;
  }
  AjaxEngine.makeReplaceCall('getgallery', args, params);
  return false;
}

function getNavigationInfo() {
  try {
    var form = getGalleryForm();
    return getFormParameters(form);
  } catch(e) {
    return {};
  }
}

function refreshGallery(noscroll) {
  var info = getNavigationInfo();
  if (noscroll) {
    info['noscroll'] = 1;
  }
  return ajaxGetGallery(info);
}

function getPage(page) {
  var info = getNavigationInfo();
  info['page'] = page;
  return ajaxGetGallery(info);
}

function getMyWidgets(widget_id) {
  return ajaxGetGallery({'mode' : 'my', 'widget_id' : widget_id, 'noscroll' : 1});
}

function resetGallery() {
  return ajaxGetGallery();
}

function getTopWidgets() {
  return ajaxGetGallery({'mode' : 'top'});
}

function getBestWidgets() {
  return ajaxGetGallery({'mode' : 'best'});
}

function ajaxRefreshWidget(params) {
  var args = {
    'url' : '/ajax/handlers/refreshwidget.xml',
    'groupName' : 'global'
  };
  AjaxEngine.makeReplaceCall('refreshwidget', args, params);
  return false;
}

function refreshMenu(type) {
  var args = {
    'url' : '/ajax/handlers/refreshmenu.xml',
    'groupName' : 'global'
  };
  var params = {
    'type' : type
  };
  var handlers = {
    'onError' : refreshPage(location.href)
  };
  AjaxEngine.makeReplaceCall('refreshmenu', args, params, handlers);
  return false;
}

/******************************************************\
                      S E A R C H
\******************************************************/

function getSearchForm() {
  return document.forms['search'];
}

function handleSearchType(o, e) {
  if (enterPressed(o, e)) {
    handleSearch();
    return false;
  }
  return true;
}

function handleSearch() {
  var form = getSearchForm();
  if (form.elements['keywords'].value == '' || form.elements['keywords'].value == 'Search') {
    return showInfo('Please select one or more keywords to search for.');
  }
  return ajaxGetGallery({'keywords' : form.elements['keywords'].value});
}

function searchKeywords(keywords) {
  var form = getSearchForm();
  form.elements['keywords'].value = keywords;
  return handleSearch();
}

function searchTag(tag) {
  return ajaxGetGallery({'tag' : tag});
}

function showResources() {
  return searchTag('sample');
}

function searchUser(uname) {
  return ajaxGetGallery({'uname' : uname});
}

function searchFavorites(favorites) {
  return ajaxGetGallery({'favorites' : favorites});
}

function searchPlatform(platform) {
  return ajaxGetGallery({'platform' : platform});
}

/*********************************************************\
                        R A T E
\*********************************************************/

function ajaxRate(id, widget_id, rate) {
  var args = {
    'url' : '/ajax/handlers/rate.xml',
    'groupName' : 'global'
  };
  var params = {
    'id' : id,
    'widget_id' : widget_id,
    'rate' : rate
  };
  var handlers = {
    'onSuccess' : manageRate
  };
  AjaxEngine.makeReplaceCall('rate_' + widget_id, args, params, handlers, 1000);
  w('wpdc_rate_msg_' + id, 'Rated ' + rate + '*');
  return false;
}

function manageRate(response, response_data) {
  return ajaxRefreshWidget({
    'id' : response_data['id'],
    'widget_id' : response_data['widget_id'],
    'rating_stars' : 1,
    'rating_count' : 1
  });
}

/*********************************************************\
                     F A V O R I T E
\*********************************************************/

function ajaxFavorite(id, widget_id) {
  var args = {
    'url' : '/ajax/handlers/favorite.xml',
    'groupName' : 'global'
  };
  var params = {
    'id' : id,
    'widget_id' : widget_id
  };
  var handlers = {
    'onSuccess' : manageFavorite
  };
  AjaxEngine.makeInsertCall('favorite_' + widget_id, args, params, handlers);
  return false;
}

function manageFavorite(response, response_data) {
  return ajaxRefreshWidget({
    'id' : response_data['id'],
    'widget_id' : response_data['widget_id'],
    'favorite' : 1,
    'top' : 1
  });
}

/*****************************************************\
             C O N F I R M   E M A I L
\*****************************************************/

var confirmEmail = '';

function getConfirmForm() {
  return document.forms['confirm'];
}

function showConfirmEmailPopup() {
  if (loadAndShowPopup('emailconfirm', '/ajax/resources/emailconfirm.xml')) {
    return true;
  }
  setTimeout("showConfirmEmailPopupLazy()", 500);
  return false;
}

function showConfirmEmailPopupLazy() {
  var form = getConfirmForm();
  if (confirmEmail.length) {
    form.elements['email'].value = confirmEmail;
  }
  form.elements['email'].focus();
}

function ajaxConfirmEmail() {
  var form = getConfirmForm();
  var email = form.elements['email'].value;
  confirmEmail = email;
  hidePopup();
  if (!regexp_email.test(email)) {
    showInfo('Please enter a valid email address.', undefined, popupHandler(showConfirmEmailPopup));
    return false;
  }
  var args = {
    'url' : '/ajax/handlers/confirmemail.xml',
    'groupName' : 'popup'
  };
  var params = {
    'email' : email
  };
  var handlers = {
    'onSuccess' : hidePopup
  }
  AjaxEngine.makeReplaceCall('confirmemail', args, params, handlers);
  return false;
}

function handleConfirmEmailType(o, e) {
  if (enterPressed(o, e)) {
    ajaxConfirmEmail();
    return false;
  }
  return true;
}

/************************************************\
                 D O W N L O A D
\************************************************/

var activeFlyout = null;

function showFlyout(id, pid, left, top) {
  if (id != activeFlyout) {
    hideFlyout(activeFlyout);
  }
  activeFlyout = id;
  s('wpdc_widget_flyout_' + id);
  m('wpdc_widget_flyout_' + id, pid, left, top);
  return false;
}

function hideFlyout() {
  if (activeFlyout != null) {
    h('wpdc_widget_flyout_' + activeFlyout);
    activeFlyout = null;
  }
}

bodyonclick = function() {
  hideFlyout();
}

/************************************************\
                  D E T A I L S
\************************************************/

var detailsInfo = {
  'id' : '',
  'widget_id' : ''
};

function setDetailsInfo(id, widget_id) {
  detailsInfo['id'] = id;
  detailsInfo['widget_id'] = widget_id;
  detailsInfo['offset'] = 0;
}

function showDetails(id, widget_id) {
  setDetailsInfo(id, widget_id);
  return ajaxGetDetails();
}

function ajaxGetDetails(params) {
  if (!params) {
    params = {
      'id' : detailsInfo['id'],
      'widget_id' : detailsInfo['widget_id']
    };
  }
  addHistory(ajaxGetDetails, params);
  var args = {
    'url' : '/ajax/handlers/getdetails.xml',
    'groupName' : 'global'
  };
  var info = getNavigationInfo();
  for (var p in info) {
    params[p] = info[p];
  }
  AjaxEngine.makeReplaceCall('getdetails', args, params);
  return false;
}

function nextWidget(widget_id) {
  return showDetails(detailsInfo['id'], widget_id);
}

/************************************************\
                 F E E D B A C K
\************************************************/

function showFeedbackForm() {
  if (fetchCachedResource('feedback', '/ajax/resources/feedback.xml', 1)) {
    w('wpdc_widget_detail', cachedResources['feedback']);
    setTimeout("getFeedbackForm().elements['nickname'].focus()", 500);
    return false;
  }
  return true;
}

function hideFeedbackForm() {
  return h('wpdc_widget_detail');
}

function getFeedbackForm() {
  return document.forms['feedback'];
}

function getFeedbackRating() {
  return getFeedbackForm().elements['rating'].value - 0;
}

function setFeedbackRating(rating) {
  getFeedbackForm().elements['rating'].value = rating;
  return false;
}

function handleFeedbackType(o, e) {
  if (enterPressed(o, e)) {
    ajaxFeedback();
    return false;
  }
  return true;
}

function ajaxFeedback() {
  var form = getFeedbackForm();
  var fields = {
    'nickname' : 'a name',
    'comment' : 'a message',
    'captcha' : 'the validation code'
  };
  var args = {
    'url' : '/ajax/handlers/feedback.xml',
    'groupName' : 'global'
  };
  var params = getFormParameters(form);
  params['widget_id'] = detailsInfo['widget_id'];
  params['rating'] = getFeedbackRating();
  var handlers = {
    'onSuccess' : manageFeedback
  };
  for (var f in fields) {
    if (form.elements[f].value == '') {
      form.elements[f].blur();
      return showInfo('Please type ' + fields[f] + '.', undefined, focusFieldHandler(form.elements[f]));
    }
    params[f] = form.elements[f].value;
  }
  // SEEME
  /*
  if (!regexp_email.test(form.elements['email'].value)) {
    return showInfo('Please enter a valid email address', undefined, focusFieldHandler(form.elements['email']));
  }
  */
  AjaxEngine.makeInsertCall('feedback', args, params, handlers);
  return false;
}

function manageFeedback(response, response_data) {
  showDetails(detailsInfo['id'], detailsInfo['widget_id']);
}

/************************************************\
                 C O N T A C T
\************************************************/

function getContactForm() {
  return document.forms['contact'];
}

function showContactForm() {
  if (loadAndShowPopup('contact', '/ajax/resources/contact.xml')) {
    return true;
  }
  setTimeout("showContactFormLazy()", 500);
  return false;
}

function showContactFormLazy() {
  var form = getContactForm();
  var fields = ['nickname', 'email', 'comment'];
  for (var i=0; i<fields.length; i++) {
    if (form.elements[fields[i]].value == '') {
      form.elements[fields[i]].focus();
      return;
    }
  }
}

function handleContactType(o, e) {
  if (enterPressed(o, e)) {
    ajaxContact();
    return false;
  }
  return true;
}

function ajaxContact() {
  var form = getContactForm();
  var args = {
    'url' : '/ajax/handlers/contact.xml',
    'groupName' : 'popup'
  };
  var params = getFormParameters(form);
  var handlers = {
    'onSuccess' : hidePopup
  };
  AjaxEngine.makeInsertCall('contact', args, params, handlers);
  return false;
}

function handleInstantFeedbackType(o, e) {
  if (enterPressed(o, e)) {
    ajaxInstantFeedback();
  }
  return true;
}

function getSayItForm() {
  return document.forms['sayit'];
}

function ajaxInstantFeedback() {
  var form = getSayItForm();
  if (form.elements['comment'].value == '' || form.elements['comment'].value == 'What are you looking for?') {
    showInfo('Please select one or more keywords to search for.');
  } else {
    ajaxGetGallery({'keywords' : form.elements['comment'].value});
  }
  return false;
}

function ajaxSayIt() {
  var comment = getSayItForm().elements['comment'].value;
  if (comment == '') {
    // Some clever message here
    return false;
  }
  var args = {
    'url' : '/ajax/handlers/sayit.xml',
    'groupName' : 'popup'
  };
  var params = {
    'comment' : comment
  };
  var handlers = {
    'onSuccess' : manageSayIt
  };
  AjaxEngine.makeInsertCall('sayit', args, params, handlers);
  return false;
}

function manageSayIt(response, response_data) {
  setTimeout("getSayItForm().elements['comment'].value = getSayItForm().elements['default_comment'].value", 100);
}

/************************************************\
        S E N D   T O   A   F R I E N D
\************************************************/

function getContactFriendForm() {
  return document.forms['contactfriend'];
}

function showContactFriendForm(data) {
  var qs = '';
  for (var p in data) {
    if (qs.length) {
      qs += '&';
    }
    qs += encodeURIComponent(p) + '=' + encodeURIComponent(data[p]);
  }
  if (qs.length) {
    qs = '?' + qs;
  }
  if (loadAndShowPopup('contactfriend', '/ajax/resources/contactfriend.xml' + qs)) {
    return true;
  }
  setTimeout("showContactFriendFormLazy()", 500);
  return false;
}

function showContactFriendFormLazy() {
  var form = getContactFriendForm();
  var fields = ['nickname', 'email', 'subject', 'body'];
  for (var i=0; i<fields.length; i++) {
    if (form.elements[fields[i]].value == '') {
      form.elements[fields[i]].focus();
      return;
    }
  }
}

function handleContactFriendType(o, e) {
  if (enterPressed(o, e)) {
    ajaxContactFriend();
    return false;
  }
  return true;
}

function ajaxContactFriend() {
  var form = getContactFriendForm();
  if (!regexp_multiple_email.test(form.elements['email'].value)) {
    return showInfo('Please enter one or more valid email address, separated by commas', undefined, focusFieldHandler(form.elements['email']));
  }
  var args = {
    'url' : '/ajax/handlers/contactfriend.xml',
    'groupName' : 'popup'
  };
  var params = getFormParameters(form);
  var handlers = {
    'onSuccess' : hidePopup
  };
  AjaxEngine.makeInsertCall('contactfriend', args, params, handlers);
  return false;
}

