/*
* Copyright 2004-2006 the Seasar Foundation and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
if (typeof(Kumu) == 'undefined') {
Kumu = {};
}
if (typeof(Kumu.Ajax) == 'undefined') {
Kumu.Ajax = {};
};
Kumu.Ajax = {
AJAX_COMPONENT_NAME : "AjaxComponent",
HTTP_STATUS_OK : 200,
HTTP_STATUS_NOT_FOUND : 404,
XML_HTTP_REQUEST_STATUS_UNINITIALIZED : 0,
XML_HTTP_REQUEST_STATUS_LOADING : 1,
XML_HTTP_REQUEST_STATUS_LOADED : 2,
XML_HTTP_REQUEST_STATUS_INTERACTIVE : 3,
XML_HTTP_REQUEST_STATUS_COMPLETE : 4,
RESPONSE_TYPE_XML : 1,
RESPONSE_TYPE_JSON : 2,
RESPONSE_TYPE_TEXT : 3,
RESPONSE_TYPE_HTML : 4,
READY_STATE : ['Uninitialized', 'Loading', 'Loaded', 'Interactive'],
axo : new Array(
"Microsoft.XMLHTTP",
"Msxml2.XMLHTTP.4.0",
"Msxml2.XMLHTTP.3.0",
"Msxml2.XMLHTTP"
),
URL : 'teeda.ajax',
ASYNC : true,
DEBUG : false,
getS2AjaxComponent : function() {
return new this.AjaxComponent();
},
AjaxComponent : function () {
var self = Kumu.Ajax;
this.name = self.AJAX_COMPONENT_NAME;
this.responseType = null;
this.url = self.URL;
this.async = self.ASYNC;
this.params = null;
this.doAction = function(ajaxResponse){}
},
AjaxProcess : function (req, ajaxComponent) {
var self = Kumu.Ajax;
this.xhr = req;
this.ajaxComponent = ajaxComponent;
this.cancel = self._createCanceler(req, ajaxComponent);
},
_createXmlHttp : function(){
var xmlHttp = false;
/*@cc_on
@if (@_jscript_version >= 5)
var self = Kumu.Ajax;
for (var i = 0; !xmlHttp && i < self.axo.length; i++) {
try {
xmlHttp = new ActiveXObject(self.axo[i]);
} catch(e) {
}
}
@else
xmlHttp = false;
@end @*/
if (!xmlHttp && typeof XMLHttpRequest != "undefined") {
try{
// for Firefox, safari
xmlHttp = new XMLHttpRequest();
//xmlHttp.overrideMimeType("text/xml");
} catch(e) {
xmlHttp = false;
}
}
return xmlHttp
},
debugPrint : function(message, errorFlg) {
if (errorFlg) {
try {
var div = document.createElement("div");
document.body.appendChild(div);
div.setAttribute("id", "ajax_msg");
message = "" + message + "";
document.getElementById("ajax_msg").innerHTML = "
" + message;
} catch (e) {
}
} else {
try {
var br = document.createElement("br");
var span = document.createElement("span");
document.body.appendChild(br);
document.body.appendChild(span.appendChild(document.createTextNode(message)));
} catch (e) {
}
}
},
_checkComponent : function(component) {
var self = Kumu.Ajax;
var name;
try {
name = component.name;
} catch(e) {
return false;
}
if (self.AJAX_COMPONENT_NAME != name || !component.doAction || !component.url) {
return false;
}
return true;
},
executeAjax : function(ajaxComponent) {
var self = Kumu.Ajax;
if (!self._checkComponent(ajaxComponent)) {
self.debugPrint("IllegalArgument. argument object is not AjaxComponent. implements url or doAction!", true);
return;
}
var xmlHttp = self._createXmlHttp();
if (!xmlHttp || !document.getElementById) {
self.debugPrint("This browser does not support Ajax.", true);
return;
}
var sysdate = new String(new Date());
var url = ajaxComponent.url;
var async = ajaxComponent.async;
var parameters = "";
var params = ajaxComponent.params;
if(!params){
params = {};
}
var method = 'GET';
if(params.method){
method = params.method.toUpperCase();
if(method != 'GET' && method != 'POST'){
method = 'GET';
}
delete params.method;
}
if(ajaxComponent.timeout){
var timerId = self._setTimeout(xmlHttp, ajaxComponent, ajaxComponent.timeout, ajaxComponent.onTimeout);
ajaxComponent._clearTimeout = function(){
clearTimeout(timerId);
}
}
var process = new Kumu.Ajax.AjaxProcess(xmlHttp, ajaxComponent);
var onreadystatechange = null;
if(method == 'GET'){
url += "?time=" + self.encodeURL(sysdate);
if(null != params){
for(var key in params){
var v = params[key];
if (v instanceof Function) {
continue;
}
parameters += "&" + key + "=" + self.encodeURL(v);
}
}
url += parameters;
if(xmlHttp){
onreadystatechange = self._registAjaxListener(xmlHttp, ajaxComponent);
xmlHttp.open("GET", url, async);
xmlHttp.setRequestHeader("If-Modified-Since", sysdate);
xmlHttp.send(null);
}
}else{
params['time'] = self.encodeURL(sysdate);
if(params){
var array = new Array();
for(var key in params) {
var v = params[key];
if (v instanceof Function) {
continue;
}
array.push(key + "=" + encodeURIComponent(v));
}
parameters = array.join("&");
}
if(xmlHttp){
onreadystatechange = self._registAjaxListener(xmlHttp, ajaxComponent);
xmlHttp.open("POST", url, async);
xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlHttp.setRequestHeader("If-Modified-Since", sysdate);
xmlHttp.send(parameters);
}
}
if (!async && onreadystatechange && xmlHttp.overrideMimeType) {
onreadystatechange();
}
return process;
},
_setTimeout : function(req, ajaxComponent, time, callback){
var timerId;
var self = Kumu.Ajax;
var canceler = self._createCanceler(req, ajaxComponent);
var onTimeout = function(){
canceler();
if(callback){
callback(req, ajaxComponent);
}
clearTimeout(timerId);
}
timerId = setTimeout(onTimeout, time * 1000);
return timerId;
},
_createCanceler : function(req, ajaxComponent){
return function(){
var self = Kumu.Ajax;
if (req.readyState == 0 || req.readyState == self.XML_HTTP_REQUEST_STATUS_COMPLETE){
return;
}
req.abort();
if (ajaxComponent._clearTimeout){
ajaxComponent._clearTimeout();
}
};
},
_onReadyStateChange : function(req, ajaxComponent){
var self = Kumu.Ajax;
var event = 'on'+self.READY_STATE[req.readyState];
if (ajaxComponent[event] && !(ajaxComponent._called)){
ajaxComponent[event](req, ajaxComponent);
ajaxComponent[event]._called = true;
}else if (ajaxComponent.doAction && ajaxComponent.doAction[event] && !(ajaxComponent.doAction[event]._called)){
ajaxComponent.doAction[event](req, ajaxComponent);
ajaxComponent.doAction[event]._called = true;
}
},
_onException : function(exception, ajaxComponent){
if(ajaxComponent.doAction && ajaxComponent.doAction.onException){
ajaxComponent.doAction.onException(exception, ajaxComponent);
}else if(ajaxComponent && ajaxComponent['onException']){
ajaxComponent['onException'](exception, ajaxComponent);
}
if (ajaxComponent._clearTimeout){
ajaxComponent._clearTimeout();
}
},
_evalResult : function(req, ajaxComponent) {
var self = Kumu.Ajax;
var status;
try{
status = req.status;
}catch(e){
}
if (status >= self.HTTP_STATUS_OK && status < 300) {
if (self.DEBUG) self.debugPrint(req.responseText);
if (self.RESPONSE_TYPE_JSON == ajaxComponent.responseType) {
var resText = req.responseText;
ajaxComponent.doAction(eval('(' + resText + ')'));
} else if (self.RESPONSE_TYPE_XML == ajaxComponent.responseType) {
var responseText = req.responseXML;
ajaxComponent.doAction(responseText);
} else {
ajaxComponent.doAction(req.responseText);
}
if (ajaxComponent._clearTimeout){
ajaxComponent._clearTimeout();
}
} else {
if(status > 0){
if (ajaxComponent.doAction && ajaxComponent.doAction.onFailure){
ajaxComponent.doAction.onFailure(req, ajaxComponent);
}else if (ajaxComponent && ajaxComponent['onFailure']){
ajaxComponent['onFailure'](req, ajaxComponent);
}else{
self.debugPrint("AjaxError! status["+status+"] message["+req.responseText+"]", true);
}
}
if (ajaxComponent._clearTimeout){
ajaxComponent._clearTimeout();
}
}
},
_registAjaxListener : function(req, ajaxComponent) {
var self = Kumu.Ajax;
var onreadystatechange = req.onreadystatechange = function() {
try{
if (self.XML_HTTP_REQUEST_STATUS_COMPLETE == req.readyState) {
self._evalResult(req, ajaxComponent);
}else{
self._onReadyStateChange(req, ajaxComponent);
}
}catch(e){
self._onException(e, ajaxComponent);
}
};
return onreadystatechange;
},
toQueryString : function(params){
var array = new Array();
for(var key in params) {
var v = params[key];
if (v instanceof Function) {
continue;
}
array.push(key + "=" + encodeURIComponent(v));
}
return array.join("&");
},
encodeURL : function(val) {
if (encodeURIComponent) {
return encodeURIComponent(val);
}
if (encodeURI) {
return encodeURI(val);
}
if (escape) {
return escape(val);
}
},
_getComponentName : function(func){
var str = func.toString();
var ret = str.match(/[0-9A-Za-z_]+\s*\(/).toString();
ret = ret.substring(0,ret.length-1);
ret = ret.replace(/[\s ]+$/, '');
var idx = ret.lastIndexOf("_");
if (idx == -1) {
return [];
}
var componentName = ret.substring(0, idx);
var actionName = ret.substring(idx + 1);
var arr = new Array(componentName, actionName);
return arr;
},
executeTeedaAjax : function(callback, param, responseType){
var self = Kumu.Ajax;
var ajax = self.getS2AjaxComponent();
var components = self._getComponentName(callback);
if(!param){
param = {};
}
if('onUninitialized' in param){
ajax.onUninitialized = param['onUninitialized'];
delete param['onUninitialized'];
}
if('onLoading' in param){
ajax.onLoading = param['onLoading'];
delete param['onLoading'];
}
if('onLoaded' in param){
ajax.onLoaded = param['onLoaded'];
delete param['onLoaded'];
}
if('onFailure' in param){
ajax.onFailure = param['onFailure'];
delete param['onFailure'];
}
if('onException' in param){
ajax.onException = param['onException'];
delete param['onException'];
}
if('timeout' in param){
ajax.timeout = param['timeout'];
delete param['timeout'];
}
if('onTimeout' in param){
ajax.onTimeout = param['onTimeout'];
delete param['onTimeout'];
}
ajax.params = self._clone(param);
if(param instanceof Array){
for(var i = 0; i < param.length; i++){
ajax.params["AjaxParam" + new String(i)] = param[i];
}
}
if(!("component" in param) && !("action" in param) && (components.length == 2) ){
//callback name bind
ajax.params["component"] = components[0];
ajax.params["action"] = components[1];
}
ajax.doAction = callback;
if (!responseType) {
responseType = self.RESPONSE_TYPE_JSON;
}
ajax.responseType = responseType;
return self.executeAjax(ajax);
},
_clone : function(o){
var f = function(){};
f.prototype = o;
return new f;
},
_setJSONData : function(node, data){
if(node.style.display == 'none'){
node.style.display = '';
}
node.innerHTML = data;
},
render : function(json){
var self = Kumu.Ajax;
for(var v in json){
var nodes = [];
var elem = document.getElementById(v);
while(elem){
nodes.push(elem);
elem.id = "";
elem = document.getElementById(v);
}
for(var i = 0; i < nodes.length; i++){
var node = nodes[i];
node.id = v;
var o = json[v];
if(o && o instanceof Array){
var parent = node.parentNode;
if(parent.nodeType == 3){
parent = parent.parentNode;
}
var orig = node.cloneNode(true);
parent.removeChild(node);
for(var j = 0; j < o.length; j++){
var obj = o[j];
var clone = orig.cloneNode(true);
if(clone.style.display && clone.style.display == 'none'){
clone.style.display = '';
}
parent.appendChild(clone);
for(var k in obj){
var temp = document.getElementById(k);
if(temp){
self._setJSONData(temp, obj[k]);
temp.id = temp.id+":rendered";
}
}
clone.id = clone.id+":rendered";
}
parent.appendChild(orig);
}else{
self._setJSONData(node, o);
}
}
}
},
removeRender : function(id){
var removeId = id+":rendered";
var elem = document.getElementById(removeId);
while(elem){
elem.parentNode.removeChild(elem);
elem = document.getElementById(removeId);
}
}
};
Kumu.FormHelper = {
endsWith : function(str, suffix) {
if (suffix.length > str.length){
return false;
}
return str.lastIndexOf(suffix) == (str.length - suffix.length);
},
getValue : function(element){
return Kumu.FormHelper.Serializer[element.tagName.toLowerCase()](element);
},
getItem : function(form, element){
if (typeof form == 'string'){
form = document.getElementById(form);
}
var formId = form.getAttribute('id');
var name = element.name;
var names = name.split(':');
if(names && names.length > 0){
var child_name = names[names.length-1];
if(child_name.indexOf(formId) == 0){
return null;
}else{
var count = names[names.length-2];
if(count == formId){
return null;
}else{
var f = Kumu.FormHelper.create(form, 't');
return f[names[names.length-3]][count];
}
}
}
},
getItemsIndex : function(form, element){
if (typeof form == 'string'){
form = document.getElementById(form);
}
var formId = form.getAttribute('id');
var name = element.name;
var names = name.split(':');
if(names && names.length > 0){
var child_name = names[names.length-1];
if(child_name.indexOf(formId) == 0){
return null;
}else{
var count = names[names.length-2];
if(count == formId){
return null;
}else{
return count;
}
}
}
},
create : function(form, type, hash){
if(!type){
type = 'r';
}
if(!hash){
hash = false;
}
var result = {};
if (typeof form == 'string'){
form = document.getElementById(form);
}
var formId = form.getAttribute('id');
var nodes = form.getElementsByTagName('*');
for(var i = 0; i < nodes.length; i++){
var node = nodes[i];
if(!node.disabled && node.name){
var name;
var serializer = Kumu.FormHelper.Serializer[node.tagName.toLowerCase()];
var value = (serializer) ? serializer(node) : null;
if(type == 'i'){
name = node.id;
}else if(type == 't'){
name = node.name;
names = name.split(':');
if(names && names.length > 0){
var child_name = names[names.length-1];
if(child_name.indexOf(formId) == 0){
name = child_name;
}else{
var count = names[names.length-2];
if(count == formId){
name = child_name;
}else{
name = names[names.length-3];
}
}
}
}else{
name = node.name;
}
if (name && value != undefined) {
var o = result[name];
if (o) {
if(type != 't'){
if(typeof o != 'Array'){
result[name] = [o];
}
result[name].push(value);
}else{
if(node.tagName.toLowerCase() == 'input' && Kumu.FormHelper.endsWith(name, 'Items')){
if(result[name][count]){
result[name][count][child_name] = value;
}else{
var child = {};
child[child_name] = value;
result[name][count] = child;
}
}else{
if(typeof o != 'Array'){
result[name] = [o];
}
result[name].push(value);
}
}
}else{
if(type != 't'){
result[name] = value;
}else{
if(node.tagName.toLowerCase() == 'input' && Kumu.FormHelper.endsWith(name, 'Items')){
var child = {};
child[child_name] = value;
result[name] = [child];
}else{
result[name] = value;
}
}
}
}
}
}
return hash ? Kumu.Ajax.toQueryString(result) : result;
}
}
Kumu.FormHelper.Serializer = {
input : function(element){
switch(element.type.toLowerCase()){
case 'checkbox':
case 'radio':
return Kumu.FormHelper.Serializer._getCheckedValue(element);
default:
return Kumu.FormHelper.Serializer.textarea(element);
}
},
_getCheckedValue: function(element) {
return element.checked ? element.value : null;
},
textarea : function(element){
return element.value;
},
select: function(element) {
if(element.type == 'select-one'){
return Kumu.FormHelper.Serializer._getSelectOneValue(element);
}else{
return Kumu.FormHelper.Serializer._getSelectManyValue(element);
}
},
_getSelectOneValue: function(element) {
var index = element.selectedIndex;
if(index >= 0){
return Kumu.FormHelper.Serializer._getOptionValue(element.options[index]);
}
return null;
},
_getSelectManyValue: function(element) {
var values = [];
for (var i = 0; i < element.length; i++) {
var opt = element.options[i];
if (opt.selected) {
values.push(Kumu.FormHelper.Serializer._getOptionValue(opt));
}
}
return values;
},
_getOptionValue: function(option) {
var v = option.getAttribute('value')
return v ? option.value : option.text;
}
}
Kumu.JSONSerializer = {
serialize:function (o) {
var type = typeof (o);
if (type == "undefined") {
return "undefined";
} else {
if ((type == "number") || (type == "boolean")) {
return o + "";
} else {
if (o === null) {
return "null";
}
}
}
if (type == "string") {
return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
).replace(/[\f]/g, "\\f"
).replace(/[\b]/g, "\\b"
).replace(/[\n]/g, "\\n"
).replace(/[\t]/g, "\\t"
).replace(/[\r]/g, "\\r");
}
var me = arguments.callee;
if (type != "function" && typeof (o.length) == "number") {
var res = [];
for (var i = 0; i < o.length; i++) {
var val = me(o[i]);
if (typeof (val) != "string") {
val = "undefined";
}
res.push(val);
}
return "[" + res.join(",") + "]";
}
if (type == "function") {
return null;
}
res = [];
for (var k in o) {
var useKey;
if (typeof k == "number") {
useKey = "\"" + k + "\"";
} else {
if (typeof k == "string") {
useKey = k;
} else {
continue;
}
}
val = me(o[k]);
if (typeof (val) != "string") {
continue;
}
res.push(useKey + ":" + val);
}
return "{" + res.join(",") + "}";
}
};