/**
 * Wrapper functionality for AJAX request using prototype
 *
 * This file is part of Batavi Open E-Commerce Solution.
 *
 * Batavi Open E-Commerce Solution is free software: you can redistribute
 * it and/or modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation version 2 of the
 * License.
 *
 * @copyright 2007-2009 ICEshop BV Copyright (www.batavi.org)
 *
 * @license GNU General Public License v2
 *
 * @see http://www.gnu.org/licenses/
 * @see http://www.gnu.org/licenses/gpl-faq.html
 */

var startedRequest    = false;
var overlayId         = 'overlayAsync';
var overlayImageId    = 'overlayAsyncIntermediateImage';
var overlayCSS        = 'overlayAsync';
var intermediateImage = 'images/default/dynamic/ajax/ajax-loader.gif';
var imageCSS          = 'asyncIntermediateImage';
var imageWidth        = 66;
var imageHeight       = 66;
var asyncContainer;

function AsyncRequest(form, ajaxID, box, instanceKey, waitingImage, waitingImageWidth, waitingImageHeight) {
  if (!startedRequest) {

    var re  = /\?(.+)$/g;
    var re2 = /\&(.+)$/g;

    var matched_str = window.location.href.match(re);
    if (matched_str != undefined) {
      var old_query_str = new String(matched_str);
    } else {
      var old_query_str = new String('');
    }
    matched_str = window.location.href.match(re2);
    if (matched_str != undefined) {
      var param_query_str = new String(matched_str);
    } else {
      var param_query_str = new String('');
    }

    if (old_query_str) {
      var param_index = old_query_str.indexOf(param_query_str);
      if (param_index == -1)
        old_query_str = old_query_str.slice(1, old_query_str.length);
      else
        old_query_str = old_query_str.slice(1, param_index);
    }

    asyncContainer                  = ajaxID;
    overlayId                       = box + overlayId;
    overlayImageId                  = box + overlayImageId;
    if (waitingImageWidth != 0) {
      imageWidth                    = waitingImageWidth;
    } else {
      imageWidth                    = 66;
    }
    if (waitingImageHeight != 0) {
      imageHeight                   = waitingImageHeight;
    } else {
      imageHeight                   = 66;
    }
    var forms                       = document.getElementsByTagName('form');
    var postParameters              = new Array;
    var attribute                   = '';

    postParameters['query_string']  = old_query_str;

    postParameters['box']           = box;
    postParameters['box_instance']  = instanceKey;
    for(var i = 0; i < forms.length; i++) {
      if (forms[i].name == form) {
        for(var j = 0; j < forms[i].elements.length; j++) {
          attribute = forms[i].elements[j].getAttribute('type');
          if (attribute == 'radio' || attribute == 'checkbox') {
            if (forms[i].elements[j].checked){
              postParameters[forms[i].elements[j].name] = forms[i].elements[j].value;
            }
          } else
            postParameters[forms[i].elements[j].name] = forms[i].elements[j].value;
        }
        break;
      }
    }

    for(i = 7; i < AsyncRequest.arguments.length; i = i + 2) {
      if (AsyncRequest.arguments[i] == 'callbackFunction') {
        var callbackFunction = AsyncRequest.arguments[i + 1];
      } else {
        postParameters[AsyncRequest.arguments[i]] = AsyncRequest.arguments[i + 1];
      }

    }

    startedRequest = true;
    if (waitingImage != '') {
      intermediateImage = waitingImage;
    } else {
      intermediateImage = 'images/default/dynamic/ajax/ajax-loader.gif';
    }

    animationStart();
    new Ajax.Request('async.php',
    {
      method:      'post',
      parameters:   postParameters,
      onSuccess:    AsyncRequestSuccess(ajaxID, (callbackFunction != undefined) ? callbackFunction : ''),
      onFailure:    Function ("animationStop(); alert('Something went wrong...'); startedRequest = false;")
    });
  }


}

  /*
   * Function for ajax onsuccess event. Shows rendered box
   *
   */
  AsyncRequestSuccess = function(ajaxID, callbackFunction) {
    return function(transport) {
      startedRequest = false;
      if (callbackFunction != '') {
        if (transport.responseText.indexOf('[[0|stop_rendering]]') < 0) {
          window.eval(callbackFunction);
        } else {
          var scripts = transport.responseText.extractScripts();
          for (var i = 0; i < scripts.length; i++) {
            window.eval(scripts[i]);
          }
        }
        return false;
      }
      if (transport.responseText.indexOf('[[0|stop_rendering]]') < 0) {
        animationStop();
        $(ajaxID).innerHTML = transport.responseText;
      }
      var scripts = transport.responseText.extractScripts();
      for (var i = 0; i < scripts.length; i++) {
        window.eval(scripts[i]);
      }
    }
  }

 /*
  * Function that shows overlay with animation
  *
  */
  animationStart = function() {
    var overlay    = $(overlayId);
    if (overlay == undefined) {
      overlayCreate();
      overlay    = $(overlayId)
    }
    if (overlay != undefined) {
      overlay.innerHTML    = '';
      overlayShow();
      overlay.className    = overlayCSS;
      if (intermediateImage != '') {
        if ($(overlayImageId) == undefined) {
          var image = document.createElement('img');
          image.setAttribute('id', overlayImageId);
        } else {
          var image = $(overlayImageId);
        }
        image.className       = imageCSS;
        image.src             = intermediateImage;
        image.style.position  = 'absolute';
        containerWH           = $(asyncContainer).getDimensions();
        image.style.top       = Math.round((containerWH.height - imageHeight)/2) + 'px';
        image.style.left      = Math.round((containerWH.width - imageWidth)/2) + 'px';
        $(asyncContainer).appendChild(image);
      }
      return true;
    }
    return false;
  }

 /*
  * Function to create overlay
  *
  */
  overlayCreate = function() {
    var overlay    = document.createElement('div');
    overlay.setAttribute('id', overlayId);
    $(asyncContainer).appendChild(overlay);
    var containerWH          = $(asyncContainer).getDimensions();
    overlay.style.width  = containerWH.width + 'px';
    overlay.style.height = containerWH.height + 'px';
    overlay.className = overlayCSS;
    $(asyncContainer).makePositioned();
    overlayHide();
  }

 /*
  * Function that shows overlay
  *
  */
  overlayShow = function() {
    $(overlayId).show();
  }

 /*
  * Function that hides overlay
  *
  */
  overlayHide = function() {
    if ($(overlayId) != undefined) {
      $(overlayId).hide();
    }
  }

 /*
  * Function that hides animation when box loaded
  *
  */
  animationStop = function() {
    overlayHide();
    if ($(overlayImageId) != undefined) {
      $(overlayImageId).remove();
    }
    if ($(overlayId) != undefined) {
      $(overlayId).remove();
    }
    return false;
  }




