/////////////////////////////////////////////////////////////////////////////
// FUNCTIONS
/////////////////////////////////////////////////////////////////////////////

// Get parameter fetching
function gup( name ) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if ( results === null )  return "";
  return results[1];
}

/////////////////////////////////////////////////////////////////////////////
// CLASSES
/////////////////////////////////////////////////////////////////////////////

/**
 * XML/Text RPC
 * 
 * @author  Anders Evenrud <andersevenrud@gmail.com>
 * @class
 */
var RPC = (function() {

  var createXMLObject = function() {
    var ua = navigator.userAgent.toLowerCase();
    var request = null;
    if (!window.ActiveXObject)
      request = new XMLHttpRequest();
    else if (ua.indexOf('msie 5') == -1)
      request = new ActiveXObject("Msxml2.XMLHTTP");
    else
      request = new ActiveXObject("Microsoft.XMLHTTP");

    return request;
  };

  return function(obj, url) {

    var self = this;
    var oXML = null;
    var sURL = url;

    var __construct = function() {
      oXML = createXMLObject();
    };

    var handler = function() {
      if ( oXML.status == 200 ) {
        if ( oXML.readyState == 4 ) {
          obj.onSuccess(("" + oXML.responseText + ""), self);
        }
      }
    };

    var createURI = function(vars) {
      var args = [];
      for ( var i in vars ) {
        args.push(i + "=" + vars[i]);
      }
      return args.join("&");
    };

    this.createPOST = function(vars) {
      var params = createURI(vars);
      oXML.open("POST", sURL, true);
      oXML.onreadystatechange = handler;
      oXML.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      oXML.setRequestHeader("Content-length", params.length);
      oXML.setRequestHeader("Connection", "close");
      oXML.send(params);
    };

    this.createGET = function(vars) {
      oXML.open("GET", sURL + "?" + createURI(vars));
      oXML.onreadystatechange = handler;
      oXML.send("");
    };

    __construct();
  };

})();

/**
 * Simple Image Gallery
 *
 * @author  Anders Evenrud <andersevenrud@gmail.com>
 * @class
 */
var ImageGallery = (function() {

  var SHOW_TIMEOUT = 10;
  var HIDE_TIMEOUT = 300;
  var SLIDE_TIMEOUT = 6000;

  return function(root, uargs, gtype, gopts) {
    var self = this;

    var oInterval = null;

    var aImages = [];
    var eRoot = $(root) || $("ImageGallery");
    var eImage = null;
    var eThumbs = null;
    var eThumbsBack = null;

    var aOptions = {
      'random'    : true,
      'links'     : true
    };

    var aOptionsRPC = {
      'fla'       : 1,
      'mac'       : 'con',
      'sac'       : 'all',
      'site'      : 'swfit2site',
      'cid'       : gup('cid') || 0,
      'fid'       : gup('fid') || 0,
      'aid'       : gup('aid') || 0
    };


    var iIndex = 0;
    var iImageCount = 0;

    /**
     * @constructor
     */
    var __construct = function() {
      if ( eRoot ) {
        eImage = eRoot.select(".ImageGalleryImage")[0];
        eThumbs = eRoot.select(".ImageGalleryThumbs")[0];
        eThumbsBack = eRoot.select(".ImageGalleryThumbsBackground")[0];
      }

      if ( !eRoot || !eImage || !eThumbs ) return;

      eThumbs.style.display = 'none';
      eImage.style.display = 'none';
      eThumbsBack.style.display = 'none';

      var i;

      // Apply user settings
      for ( i in uargs ) {
        if ( uargs.hasOwnProperty(i) ) {
          aOptionsRPC[i] = uargs[i];
        }
      }

      for ( i in gopts ) {
        if ( gopts.hasOwnProperty(i) ) {
          aOptions[i] = gopts[i];
        }
      }

      // Get all images from server
      oRPC = new RPC(self, "/swfit2/servlet/swfit2web");
      oRPC.createGET(aOptionsRPC);
    };

    var start = function() {
      for ( var i = 0; i < aImages.length; i++ ) {
        iImageCount++;

        aImages[i].onclick = function() {
          GoNext();
        };

        eRoot.appendChild(aImages[i]);
      }

      setTimeout(function() {
        StartSlideShow();
      }, 0);
    };


    ///////////////////////////////////////////////////////////////////////////////////////////////

    // The Fade Function
    function SwapImage(x, y) {
      new Effect.Parallel([
        new Effect.Appear($(aImages[x]), { sync: true }),
        new Effect.Fade($(aImages[y]), { sync: true })
      ], { duration: 2.0 });
    }

    // the onload event handler that starts the fading.
    function StartSlideShow() {
      oInterval = setInterval(Play, SLIDE_TIMEOUT);
    }

    function Play() {
      GoNext();
    }

    function Stop () {
      clearInterval(oInterval);
    }

    function GoNext() {
      /*
      if ( !init )
        clearInterval(oInterval);
      */

      var imageShow, imageHide;

      imageShow = iIndex+1;
      imageHide = iIndex;

      if (imageShow === iImageCount) {
        SwapImage(0,imageHide);
        iIndex = 0;
      } else {
        SwapImage(imageShow, imageHide);
        iIndex++;
      }

    }

    function GoPrevious() {
      /*
      if ( !init )
        clearInterval(oInterval);
      */

      var imageShow, imageHide;

      imageShow = iIndex-1;
      imageHide = iIndex;

      if (iIndex === 0) {
        SwapImage(iImageCount-1, imageHide);
        iIndex = iImageCount-1;
      } else {
        SwapImage(imageShow, imageHide);
        iIndex--;
      }
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////


    /**
     * Parse data from swfit request
     */
    this.onSuccess = function(res) {
      var splits = res.split("&");
      var options = {};
      var titles = [];
      var i = 0;

      // Parse URI to object
      for ( i = 0; i < splits.length; i++ ) {
        var splits2 = splits[i].split("=");
        if ( splits2[0] && typeof splits2[1] !== undefined ) {
          options[decodeURIComponent(splits2[0])] = unescape(splits2[1].replace("+"," "));
        }
      }

      // Extract image and text
      i = 0;
      for ( var x in options ) {
        if ( options.hasOwnProperty(x) ) {
          if ( x.match(/img_url_/) ) {
            var img = new Image();
            img.src = options[x] + "_mid.jpg";

            if ( i > 0 ) {
              img.style.display = 'none';
            }

            img.style.position = 'absolute';

            aImages.push(img);

            i++;
          }

          if ( x.match(/img_text_/) ) {
            var text = options[x].replace("+", " ");
            titles.push(text);
          }
        }
      }

      // Parse text
      var tmpEl = document.createElement("DIV");
      tmpEl.style.visibility = 'hidden';
      document.body.appendChild(tmpEl);

      for ( i = 0; i < titles.length; i++ ) {
        tmpEl.innerHTML = titles[i];
        if ( tmpEl.childNodes[0] ) {
          aImages[i].alt = tmpEl.childNodes[0].innerHTML;
        } else {
          aImages[i].alt = "";
        }
        break;
      }

      tmpEl.parentNode.removeChild(tmpEl);

      // Cleanup and startup
      delete options;
      delete splits;

      setTimeout(function() {
        start();
      }, 0);
    };

    this.onFailure = function(res) {
    };



    __construct();
  };


})();

