<?xml version="1.0" encoding="UTF-8"?>
<Module>
  <ModulePrefs 
    title="Random module every __UP_freq__ minute(s)" 
    directory_title="random module"
    description="Random module from googlemodues.com. Note: Because this module works using cookies. This module has to be inlined. Please use the developer.xml to inline this module. Also note that since this keeps track of the client side id's of the modules that this module adds, any updates to the page might cause orphaned modules (i.e modules won't be automatically cleaned by this module in that scenario). "
    author="Kishore Senji"
    author_email="ksenji@gmail.com"
    screenshot="http://myjavaserver.com/~ksenji/random.ig.gif"
    author_location=""
    author_affiliation="none"
    title_url="http://googlemodules.com"
    render_inline="optional">
    <Locale lang="en" country="us" />
  </ModulePrefs>
  <UserPref name="freq" display_name="Frequency (in minutes)" required="false" datatype="string" default_value="5"/>
  <Content type="html">
    <![CDATA[
      <script>
        var TIMER_ID__MODULE_ID__;
        var GUID_COOKIE__MODULE_ID__ = 'rgmguid';
        var TIMESTAMP_COOKIE__MODULE_ID__ = 'rgmts';
        var XMLParser__MODULE_ID__ = {
	  parse : function(xml, elementName) {
	    var regexp = new RegExp("<" + elementName + ">(([\r\n.]|.)*?)<\/" + elementName + ">");
	    if(m = xml.match(regexp)){
	      return m;
	    } else {
	      return 'no-match';
	    }
	  },
	  
	  allElementsWithTagName : function(xml, elementName) {
	    var elements = new Array();
	    while(xml.length > 0) {
	      var pValue = this.parse(xml, elementName);
	      if(pValue != 'no-match') {
	        elements.push(pValue);
	      } else {
	        break;
	      }
	      xml = xml.substring(xml.indexOf("</" + elementName + ">") + 1);
	    }
	    return elements;
	  }
        };
        var prefs__MODULE_ID__ = new _IG_Prefs(__MODULE_ID__);
        
        function sortNumber__MODULE_ID__(a, b) {
          return (a - b);
        }
        
        function getFrequencyInMinutes__MODULE_ID__(s) {
          try {
            return parseFloat(s);
          } catch(e) {
            return 0;
          }
        }
        
        function deleteModule__MODULE_ID__() {
          var previousModuleId = getCookie__MODULE_ID__(GUID_COOKIE__MODULE_ID__);
          setCookie__MODULE_ID__(GUID_COOKIE__MODULE_ID__, '');
          setCookie__MODULE_ID__(TIMESTAMP_COOKIE__MODULE_ID__, '');          
          http__MODULE_ID__({
            method : 'GET',
            url    : 'http://www.google.com/ig/setp?et='+_et+'&pid='+_pid+'&url=http%3A%2F%2Fwww.google.com%2Fig&'+previousModuleId+'_enab=0&'+previousModuleId+'_t=32',
            onload : function(request) {
              if(TIMER_ID__MODULE_ID__ != 0) {
                window.clearTimeout(TIMER_ID__MODULE_ID__);
              }
            }
          });	        
        }
        
        function _addLatestModule__MODULE_ID__() {
          _IG_FetchContent('http://www.googlemodules.com/rss/latest.xml',
	    function(responseText) {
	      var items = XMLParser__MODULE_ID__.allElementsWithTagName(responseText, 'item');
	      var latestModule = (items[0][1]);
	      var latestModuleGUID = XMLParser__MODULE_ID__.parse(latestModule, 'guid')[1];
	      if(m = latestModuleGUID.match(/(\d)+/)) {
	        var moduleId = m[0];
	        moduleId = Math.floor(4+(Math.random()*(moduleId-4)));
	        latestModuleGUID = 'http://www.googlemodules.com/module/' + moduleId; 
	      }
	      _IG_FetchContent(latestModuleGUID, function(latestModuleResponseText){
	        var div = document.createElement('div');
	        var sString = '<div class="source">';
	        var sIndex = latestModuleResponseText.indexOf(sString)+sString.length;
	        var eIndex = latestModuleResponseText.indexOf('</div>', sIndex);
	        latestModuleResponseText = latestModuleResponseText.substring(sIndex, eIndex);
	        div.innerHTML = latestModuleResponseText;
	        var link = div.getElementsByTagName('a')[0].href;
	        if(!link.match(/^http:\/\/www\.google\.com.*/)) {
                  http__MODULE_ID__({
                    method : 'GET',
                    url    : 'http://www.google.com/ig/setp?et='+_et+'&pid='+_pid+'&url=http%3A%2F%2Fwww.google.com%2Fig&n_32=url%3D'+link,
                    onload : function(request) {
                      var _currentModules  = getModules__MODULE_ID__(request).sort(sortNumber__MODULE_ID__);
                      setCookie__MODULE_ID__(GUID_COOKIE__MODULE_ID__, 'm_'+_currentModules.pop());
                      setCookie__MODULE_ID__(TIMESTAMP_COOKIE__MODULE_ID__, new Date().getTime());
                      document.location.href = 'http://www.google.com/ig';
                    }
                  });
                }
	      });
	    }
	  );
        }
        
	function addLatestModule__MODULE_ID__() {
	  var ts = getCookie__MODULE_ID__(TIMESTAMP_COOKIE__MODULE_ID__);
	  if(_trim(ts) != "") {
	    http__MODULE_ID__({
	      method : 'GET',
	      url    : 'http://www.google.com/ig',
	      onload : function(request) {
	        var currentModules = getModules__MODULE_ID__(request);
	        var guidCookie = getCookie__MODULE_ID__(GUID_COOKIE__MODULE_ID__);
	        var found = false;
	        for(var i=0; i<currentModules.length; i++) {
	          if(('m_'+currentModules[i]) == guidCookie) {
	            found = true;
	            break;
	          }
	        }
	        var time = new Date().getTime() - parseInt(ts);
	        var freq = getFrequencyInMinutes__MODULE_ID__(prefs__MODULE_ID__.getString("freq"));
	        freq = (freq==0) ? 1 : freq;
	        if(found) {
	          if(time < (freq * 60000)) {
	            if(TIMER_ID__MODULE_ID__ != 0) {
	              window.clearTimeout(TIMER_ID__MODULE_ID__);
	            }
	            TIMER_ID__MODULE_ID__ = window.setTimeout(addLatestModule__MODULE_ID__, ((freq * 60000) - time));
	          } else {
	            deleteModule__MODULE_ID__();  
	            _addLatestModule__MODULE_ID__();
	          }
	        } else {
	          _addLatestModule__MODULE_ID__();
	        }
	      }
	    });
	  } else {
	    _addLatestModule__MODULE_ID__();
	  }
	}
	
	function getCookie__MODULE_ID__(name) {
	  var cookies = document.cookie;
	  var value = "";
	  var key = escape(name);
	  var i = cookies.indexOf(key);
	  if(i != -1) {
	    var s = i + key.length;
	    var e = cookies.indexOf(';', s);
	    e = (e==-1) ? cookies.length : e;
	    value = cookies.substring((s+1), e);
	  }
	  return unescape(value);
	}
	
	function setCookie__MODULE_ID__(name, value) {
	  var c = escape(name) + '=' + escape(value);
	  document.cookie = c;
	}
	
	function getModules__MODULE_ID__(request) {
	  var allModules = [];
	  var ig = request.responseText;
	  var div = document.createElement('div');
	  div.innerHTML = ig;
	  var allDivs = div.getElementsByTagName('div');
	  for(var i=0; i<allDivs.length; i++) {
	    if(m = allDivs[i].id.match(/^m_(\d+)$/)) {
	      allModules.push(parseInt(m[1]));
	    }
	  }
	  return (allModules);
	}
	
	
	function http__MODULE_ID__(params) {
	  var request;
	  var sendNull = false;
	  if(window.XMLHttpRequest) {
	    request = new XMLHttpRequest();
	    sendNull = true;
	  } else if(window.ActiveXObject) {
	    request = new ActiveXObject("Microsoft.XMLHTTP");
	  }
	  request.open(params['method'], params['url'], true);
	  if(sendNull) {
	    request.send(null);
	  } else {
	    request.send();
	  }
	  var onloadFunc = params['onload'];
	  request.onreadystatechange = function() {
	    if(request.readyState == 4) {
	      if(request.status == 200) {
	        onloadFunc(request);
	      }
	    }
	  }	    
	}
	_IG_RegisterOnloadHandler(addLatestModule__MODULE_ID__);
      </script>
    ]]>
  </Content>
</Module>
