var selectMonth = {
  go_selected_month: function() {
	var y = document.getElementById("year").value;
	var m = document.getElementById("month").value;
	var uri = "../" + y + "_" + m + "/index_j.htm";
        window.location.href = uri;
  },

  exists_this_month: "yet",

  head_file: function(url) {
    var oXMLHttpRequest= new XMLHttpRequest;
    var value = false;
    oXMLHttpRequest.open("HEAD", url, false);
    oXMLHttpRequest.onreadystatechange= function() {
      if (this.readyState == XMLHttpRequest.DONE) {
	if (this.status == 200) {
	  value = true;
	}
      }
    };
    oXMLHttpRequest.send(null);
    return value;
  },

  check_exists_this_month: function() {
    if (selectMonth.exists_this_month == "yet") {
      var today = new Date();
      var year = today.getFullYear();
      var month = today.getMonth()+1;
      var index = "index_j.htm";
      var yyyy = "" + year;
      var mm = (month < 10 ? "0" : "") + month;
      var href = window.location.href;
      var pattern = /\/([1-2][0-9][0-9][0-9])_([0-1][0-9])\/[^\/]*$/;
      var url = href.replace(pattern, "/"+yyyy+"_"+mm+"/"+index);
      selectMonth.exists_this_month = selectMonth.head_file(url);
    }
    return selectMonth.exists_this_month;
  },

  filtered_months: function(y, max_year) {
    var value;
    if (y > max_year || y < 1995) {
      value = [null];
    } else if (y == 1995) {
      value = [null, null, null, "03","04","05","06","07", null, null, null, "11","12"];
    } else if (y == max_year) {
      var max_month = new Date().getMonth() + 1;
      value = [null];
      for (var i = 1; i < max_month; i++) {
	// IMPLEMENTATION NOTE:
	// assumes existence of the last month directory index.
	var m = (i < 10 ? "0"+i : ""+i);
	value.push(m);
      }
      if (selectMonth.check_exists_this_month()) {
	i = max_month;
	var m = (i < 10 ? "0"+i : ""+i);
	value.push(m);
      }
    } else {
      value = [null, "01","02","03","04","05","06","07","08","09","10","11","12"];
    };
    return value;
  },

  month_options: function(y, selected_month) {
    var year = new Date().getFullYear();
    var months = selectMonth.filtered_months(y, year);
    var value = "";
    selected_month = selectMonth.load_params().m || selected_month;

    for (var i = 1; i < months.length; i++) {
      var v = months[i];
      if (v) {
	var selected = selected_month == i ? ' selected="selected"' : '';
	value += '<option value="' + v + '"' + selected + '>';
	value += selectMonth.month_name[i];
	value += '</option>\n';
      }
    }
    return value;
  },
  
  update_month_options: function() {
    var y = document.getElementById("year").value;
    var year = new Date().getFullYear();
    var sel = document.getElementById("month");
    var options = selectMonth.month_options(y, false);
    var select = '<select name="month" id="month">\n'+options+'</select>\n';

    if (sel.outerHTML) {
      sel.outerHTML = select;
    } else {
      sel.innerHTML = options;
    }
    return false;
  },
  
  month_name: [
		null,
		'1\u6708',
		'2\u6708',
		'3\u6708',
		'4\u6708',
		'5\u6708',
		'6\u6708',
		'7\u6708',
		'8\u6708',
		'9\u6708',
		'10\u6708',
		'11\u6708',
		'12\u6708'
  ],

  _get_cookie: function(key) {
    var c = document.cookie;
    var value = null;
    var vec = c.split("; ");
    if (vec) {
      var pat = new RegExp("^"+key+"="+"(.*)");
      for (var i = 0; i < vec.length; i++) {
        if (vec[i].match(pat)) {
          value = unescape(RegExp.$1);
          break;
        }
      }
    }
    return value;
  },
  
  _set_cookie: function(key, value) {
    document.cookie = ""+key+"="+escape(value);
  },
  
  _remove_cookie: function(key) {
    document.cookie = ""+key+"= ; expires=Thu, 1-Jan-1969 00:00:00 GMT; ";
  },

  _get_ym_from_location: function() {
    var href = window.location.href;
    var pattern = /\/([1-2][0-9][0-9][0-9])_([0-1][0-9])\/[^\/]*$/;
    var yyyy, mm, y, m;
    href.match("/([1-2][0-9][0-9][0-9])_([0-1][0-9])/[^/]*$");
    yyyy = RegExp.$1;
    mm = RegExp.$2;
    y = parseInt(yyyy);
    m = parseInt(mm.charAt(0) == '0' ? mm.charAt(1) : mm);

    return {y: y, m: m, yyyy: yyyy, mm: mm};
  },

  store_params: function(y,m){
    //selectMonth._set_cookie("y", y);
    //selectMonth._set_cookie("m", m);
  },

  load_params: function(y,m){
    //var y = parseInt(selectMonth._get_cookie("y"));
    //var m = parseInt(selectMonth._get_cookie("m"));
    //return {y: y, m: m};
    return selectMonth._get_ym_from_location();
  },
  
  clear_params: function(y,m){
    //selectMonth._remove_cookie("y");
    //selectMonth._remove_cookie("m");
  },

  _select_x_as_location: function(prop, pattern, eid){
    var x = selectMonth.load_params()[prop];
    if (pattern.test(""+x)) {
      if (document.getElementById) {
        var sel = document.getElementById(eid);
        sel.selectedIndex = 0;
        for (var i = 0; i < sel.length; i++) {
          if (sel.options[i].value == x) {
            sel.selectedIndex = i;
            break;
          }
        }
      }
    }
  },

  select_month_as_location: function(){
    selectMonth._select_x_as_location('mm', /^[0-9][0-9]$/, 'month');
  },
  
  select_year_as_location: function(){
    selectMonth._select_x_as_location('yyyy', /^[0-9][0-9][0-9][0-9]$/, 'year');
  },
  
  select_form_as_location: function(){
    selectMonth.select_year_as_location();
    selectMonth.select_month_as_location();
  },

  build_ui: function() {
    if (!document.getElementById) return false;
    var href = window.location.href;
    var year = new Date().getFullYear();
    var yyyy, mm, y, m;
    href.match("/([1-2][0-9][0-9][0-9])_([0-1][0-9])/[^/]*$");
    yyyy = RegExp.$1;
    mm = RegExp.$2;
    if (!yyyy) return false;
    
    y = parseInt(yyyy);
    m = parseInt(mm.charAt(0) == '0' ? mm.charAt(1) : mm);
    
    if (y > year) { year = y; }
    document.write('<form action="#">\n');
    document.write('<select name="year" id="year" onchange="selectMonth.update_month_options()">\n');
    for (var i = year; i > 1994; i--) {
      var v = "" + i;
	var selected = i == y ? ' selected="selected"' : '';
      document.write('<option value="' + v + '"' + selected + '>');
      document.write(v+'\u5E74');
      document.write('</option>\n');
    }
    document.write('</select>\n');
    document.write('<select name="month" id="month">\n');
    document.write(selectMonth.month_options(y, m));
    document.write('</select>\n');
    document.write('<input name="GO" value=" \u79FB\u52D5 " class="go-button" type="button" onclick="selectMonth.go_selected_month()" />');
    document.write('</form>\n');
    return false;
  },

  unloadhandler_installed: false
};

// XMLHttpRequest.js Copyright (C) 2010 Sergey Ilinsky (http://www.ilinsky.com)
//
// This work is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.

// This work is distributed in the hope that it will be useful,
// but without any warranty; without even the implied warranty of
// merchantability or fitness for a particular purpose. See the
// GNU Lesser General Public License for more details.

// You should have received a copy of the GNU Lesser General Public License
// along with this library; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

(function () {

	// Save reference to earlier defined object implementation (if any)
	var oXMLHttpRequest	= window.XMLHttpRequest;

	// Define on browser type
	var bGecko	= !!window.controllers,
		bIE		= window.document.all && !window.opera,
		bIE7	= bIE && window.navigator.userAgent.match(/MSIE ([\.0-9]+)/) && RegExp.$1 == 7;

	// Constructor
	function cXMLHttpRequest() {
		this._object	= oXMLHttpRequest && !bIE7 ? new oXMLHttpRequest : new window.ActiveXObject("Microsoft.XMLHTTP");
		this._listeners	= [];
	};

	// BUGFIX: Firefox with Firebug installed would break pages if not executed
	if (bGecko && oXMLHttpRequest.wrapped)
		cXMLHttpRequest.wrapped	= oXMLHttpRequest.wrapped;

	// Constants
	cXMLHttpRequest.UNSENT				= 0;
	cXMLHttpRequest.OPENED				= 1;
	cXMLHttpRequest.HEADERS_RECEIVED	= 2;
	cXMLHttpRequest.LOADING				= 3;
	cXMLHttpRequest.DONE				= 4;

	// Public Properties
	cXMLHttpRequest.prototype.readyState	= cXMLHttpRequest.UNSENT;
	cXMLHttpRequest.prototype.responseText	= '';
	cXMLHttpRequest.prototype.responseXML	= null;
	cXMLHttpRequest.prototype.status		= 0;
	cXMLHttpRequest.prototype.statusText	= '';

	// Instance-level Events Handlers
	cXMLHttpRequest.prototype.onreadystatechange	= null;

	// Class-level Events Handlers
	cXMLHttpRequest.onreadystatechange	= null;
	cXMLHttpRequest.onopen				= null;
	cXMLHttpRequest.onsend				= null;
	cXMLHttpRequest.onabort				= null;

	// Public Methods
	cXMLHttpRequest.prototype.open	= function(sMethod, sUrl, bAsync, sUser, sPassword) {
		// Delete headers, required when object is reused
		delete this._headers;

		// When bAsync parameter value is omitted, use true as default
		if (arguments.length < 3)
			bAsync	= true;

		// Save async parameter for fixing Gecko bug with missing readystatechange in synchronous requests
		this._async		= bAsync;

		// Set the onreadystatechange handler
		var oRequest	= this,
			nState		= this.readyState,
			fOnUnload;

		// BUGFIX: IE - memory leak on page unload (inter-page leak)
		if (bIE && bAsync) {
			fOnUnload = function() {
				if (nState != cXMLHttpRequest.DONE) {
					fCleanTransport(oRequest);
					// Safe to abort here since onreadystatechange handler removed
					oRequest.abort();
				}
			};
			window.attachEvent("onunload", fOnUnload);
		}

		// Add method sniffer
		if (cXMLHttpRequest.onopen)
			cXMLHttpRequest.onopen.apply(this, arguments);

		if (arguments.length > 4)
			this._object.open(sMethod, sUrl, bAsync, sUser, sPassword);
		else
		if (arguments.length > 3)
			this._object.open(sMethod, sUrl, bAsync, sUser);
		else
			this._object.open(sMethod, sUrl, bAsync);

		if (!bGecko && !bIE) {
			this.readyState	= cXMLHttpRequest.OPENED;
			fReadyStateChange(this);
		}

		this._object.onreadystatechange	= function() {
			if (bGecko && !bAsync)
				return;

			// Synchronize state
			oRequest.readyState		= oRequest._object.readyState;

			//
			fSynchronizeValues(oRequest);

			// BUGFIX: Firefox fires unnecessary DONE when aborting
			if (oRequest._aborted) {
				// Reset readyState to UNSENT
				oRequest.readyState	= cXMLHttpRequest.UNSENT;

				// Return now
				return;
			}

			if (oRequest.readyState == cXMLHttpRequest.DONE) {
				//
				fCleanTransport(oRequest);
				// BUGFIX: IE - memory leak in interrupted
				if (bIE && bAsync)
					window.detachEvent("onunload", fOnUnload);
			}

			// BUGFIX: Some browsers (Internet Explorer, Gecko) fire OPEN readystate twice
			if (nState != oRequest.readyState)
				fReadyStateChange(oRequest);

			nState	= oRequest.readyState;
		};
	};
	cXMLHttpRequest.prototype.send	= function(vData) {
		// Add method sniffer
		if (cXMLHttpRequest.onsend)
			cXMLHttpRequest.onsend.apply(this, arguments);

		// BUGFIX: Safari - fails sending documents created/modified dynamically, so an explicit serialization required
		// BUGFIX: IE - rewrites any custom mime-type to "text/xml" in case an XMLNode is sent
		// BUGFIX: Gecko - fails sending Element (this is up to the implementation either to standard)
		if (vData && vData.nodeType) {
			vData	= window.XMLSerializer ? new window.XMLSerializer().serializeToString(vData) : vData.xml;
			if (!this._headers["Content-Type"])
				this._object.setRequestHeader("Content-Type", "application/xml");
		}

		this._object.send(vData);

		// BUGFIX: Gecko - missing readystatechange calls in synchronous requests
		if (bGecko && !this._async) {
			this.readyState	= cXMLHttpRequest.OPENED;

			// Synchronize state
			fSynchronizeValues(this);

			// Simulate missing states
			while (this.readyState < cXMLHttpRequest.DONE) {
				this.readyState++;
				fReadyStateChange(this);
				// Check if we are aborted
				if (this._aborted)
					return;
			}
		}
	};
	cXMLHttpRequest.prototype.abort	= function() {
		// Add method sniffer
		if (cXMLHttpRequest.onabort)
			cXMLHttpRequest.onabort.apply(this, arguments);

		// BUGFIX: Gecko - unnecessary DONE when aborting
		if (this.readyState > cXMLHttpRequest.UNSENT)
			this._aborted	= true;

		this._object.abort();

		// BUGFIX: IE - memory leak
		fCleanTransport(this);
	};
	cXMLHttpRequest.prototype.getAllResponseHeaders	= function() {
		return this._object.getAllResponseHeaders();
	};
	cXMLHttpRequest.prototype.getResponseHeader	= function(sName) {
		return this._object.getResponseHeader(sName);
	};
	cXMLHttpRequest.prototype.setRequestHeader	= function(sName, sValue) {
		// BUGFIX: IE - cache issue
		if (!this._headers)
			this._headers	= {};
		this._headers[sName]	= sValue;

		return this._object.setRequestHeader(sName, sValue);
	};

	// EventTarget interface implementation
	cXMLHttpRequest.prototype.addEventListener	= function(sName, fHandler, bUseCapture) {
		for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++)
			if (oListener[0] == sName && oListener[1] == fHandler && oListener[2] == bUseCapture)
				return;
		// Add listener
		this._listeners.push([sName, fHandler, bUseCapture]);
	};

	cXMLHttpRequest.prototype.removeEventListener	= function(sName, fHandler, bUseCapture) {
		for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++)
			if (oListener[0] == sName && oListener[1] == fHandler && oListener[2] == bUseCapture)
				break;
		// Remove listener
		if (oListener)
			this._listeners.splice(nIndex, 1);
	};

	cXMLHttpRequest.prototype.dispatchEvent	= function(oEvent) {
		var oEventPseudo	= {
			'type':			oEvent.type,
			'target':		this,
			'currentTarget':this,
			'eventPhase':	2,
			'bubbles':		oEvent.bubbles,
			'cancelable':	oEvent.cancelable,
			'timeStamp':	oEvent.timeStamp,
			'stopPropagation':	function() {},	// There is no flow
			'preventDefault':	function() {},	// There is no default action
			'initEvent':		function() {}	// Original event object should be initialized
		};

		// Execute onreadystatechange
		if (oEventPseudo.type == "readystatechange" && this.onreadystatechange)
			(this.onreadystatechange.handleEvent || this.onreadystatechange).apply(this, [oEventPseudo]);

		// Execute listeners
		for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++)
			if (oListener[0] == oEventPseudo.type && !oListener[2])
				(oListener[1].handleEvent || oListener[1]).apply(this, [oEventPseudo]);
	};

	//
	cXMLHttpRequest.prototype.toString	= function() {
		return '[' + "object" + ' ' + "XMLHttpRequest" + ']';
	};

	cXMLHttpRequest.toString	= function() {
		return '[' + "XMLHttpRequest" + ']';
	};

	// Helper function
	function fReadyStateChange(oRequest) {
		// Sniffing code
		if (cXMLHttpRequest.onreadystatechange)
			cXMLHttpRequest.onreadystatechange.apply(oRequest);

		// Fake event
		oRequest.dispatchEvent({
			'type':			"readystatechange",
			'bubbles':		false,
			'cancelable':	false,
			'timeStamp':	new Date + 0
		});
	};

	function fGetDocument(oRequest) {
		var oDocument	= oRequest.responseXML,
			sResponse	= oRequest.responseText;
		// Try parsing responseText
		if (bIE && sResponse && oDocument && !oDocument.documentElement && oRequest.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/)) {
			oDocument	= new window.ActiveXObject("Microsoft.XMLDOM");
			oDocument.async				= false;
			oDocument.validateOnParse	= false;
			oDocument.loadXML(sResponse);
		}
		// Check if there is no error in document
		if (oDocument)
			if ((bIE && oDocument.parseError != 0) || !oDocument.documentElement || (oDocument.documentElement && oDocument.documentElement.tagName == "parsererror"))
				return null;
		return oDocument;
	};

	function fSynchronizeValues(oRequest) {
		try {	oRequest.responseText	= oRequest._object.responseText;	} catch (e) {}
		try {	oRequest.responseXML	= fGetDocument(oRequest._object);	} catch (e) {}
		try {	oRequest.status			= oRequest._object.status;			} catch (e) {}
		try {	oRequest.statusText		= oRequest._object.statusText;		} catch (e) {}
	};

	function fCleanTransport(oRequest) {
		// BUGFIX: IE - memory leak (on-page leak)
		oRequest._object.onreadystatechange	= new window.Function;
	};

	// Internet Explorer 5.0 (missing apply)
	if (!window.Function.prototype.apply) {
		window.Function.prototype.apply	= function(oRequest, oArguments) {
			if (!oArguments)
				oArguments	= [];
			oRequest.__func	= this;
			oRequest.__func(oArguments[0], oArguments[1], oArguments[2], oArguments[3], oArguments[4]);
			delete oRequest.__func;
		};
	};

	// Register new object with window
	window.XMLHttpRequest	= cXMLHttpRequest;
})();

if (!selectMonth.unloadhandler_installed) {
  if (window.attachEvent) {
    window.attachEvent('onunload', function(){return false;});
  } else if (window.addEventListener) {
    window.addEventListener('unload', function(){return false;}, true);
  }
  selectMonth.unloadhandler_initialized = true;
}

selectMonth.build_ui();
selectMonth.select_form_as_location();

