Files
sourceforge-ossez/oss/vtiger/trunk/modules/Emails/GmailBookmarklet.js
T
YuCheng Hu 2c19d432c2 添加到 trunk
+YUCHENG HU+



git-svn-id: https://svn.code.sf.net/p/hawebs/svn@111 a2543c7e-f6e9-4f8a-8bff-1ffc34733512
2010-06-10 20:18:29 +00:00

553 lines
15 KiB
JavaScript

function init(){
function XHR(type,url,params){
this.xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
this.url = url;
this.params = params;
this.type = type;
};
XHR.prototype.load=function(async,callback){
this.onload=callback;
this.async=async;
if(this.type.toLowerCase()=="get"){
this.url = this.url+"?"+this.params;
}
this.xhr.open(this.type,this.url,this.async);
try{
if(async){
var request = this;
this.xhr.onreadystatechange=function(){
request.readyStateChange();
}
}
if(this.type.toLowerCase()=="post"){
this.xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
this.xhr.setRequestHeader("Content-length", this.params.length);
}
this.xhr.send(this.params);
}catch(e){
alert("error: "+e);
}
};
XHR.prototype.readyStateChange=function(){
var ready=this.xhr.readyState;
if(ready==4){
var httpStatus=null;
httpStatus=this.xhr.status;
if(httpStatus==200 || httpStatus==0){
if(this.async){
this.onload.call(this,this.xhr);
}
}
}
};
function VtigerWebservice(vtigerurl,username,accesskey){
var vtigerURL=vtigerurl;
var username=username;
var accessKey=accesskey;
var userId=null;
var sessionId=null;
function getResult(response){
return response.result;
}
function getError(response){
return response.error;
}
function extendsession(){
var req = new XHR("post",vtigerURL,"operation=extendsession");
req.load(false);
var res = JSON.parse(req.xhr.responseText);
if(res.success){
var result = getResult(res);
this.userId=result.userId;
this.sessionId=result.sessionName;
}
}
function create(object, objectType, callback){
var objectJson = JSON.stringify(object);
var req = new XHR("post",doc.vtigerURL,("operation=create&elementType="+objectType+"&sessionName="+this.sessionId+
"&element="+encodeURIComponent(objectJson)));
req.load(true,callback);
}
function query(query, callback){
var req = new XHR("get",doc.vtigerURL,"operation=query&query="+encodeURIComponent(query)+"&sessionName="+this.sessionId);
req.load(true,callback);
}
return {extendSession:extendsession,query:query,getResult:getResult,userId:userId,create:create,getError:getError};
};
if (!this.JSON) {
JSON = function () {
function f(n) {
return n < 10 ? "0" + n : n;
}
Date.prototype.toJSON = function () {
return this.getUTCFullYear() + "-" +
f(this.getUTCMonth() + 1) + "-" +
f(this.getUTCDate()) + "T" +
f(this.getUTCHours()) + ":" +
f(this.getUTCMinutes()) + ":" +
f(this.getUTCSeconds()) + "Z";
};
var m = {
"\b": "\\b",
"\t": "\\t",
"\n": "\\n",
"\f": "\\f",
"\r": "\\r",
"\"" : "\\\"",
"\\": "\\\\"
};
function stringify(value, whitelist) {
var a, // The array holding the partial texts.
i, // The loop counter.
k, // The member key.
l, // Length.
r = /["\\\x00-\x1f\x7f-\x9f]/g,
v; // The member value.
switch (typeof value) {
case "string":
return r.test(value) ?
"\"" + value.replace(r, function (a) {
var c = m[a];
if (c) {
return c;
}
c = a.charCodeAt();
return "\\u00" + Math.floor(c / 16).toString(16) +
(c % 16).toString(16);
}) + "\"" :
"\"" + value + "\"";
case "number":
return isFinite(value) ? String(value) : "null";
case "boolean":
case "null":
return String(value);
case "object":
if (!value) {
return "null";
}
if (typeof value.toJSON === "function") {
return stringify(value.toJSON());
}
a = [];
if (typeof value.length === "number" &&
!(value.propertyIsEnumerable("length"))) {
l = value.length;
for (i = 0; i < l; i += 1) {
a.push(stringify(value[i], whitelist) || "null");
}
return "[" + a.join(",") + "]";
}
if (whitelist) {
l = whitelist.length;
for (i = 0; i < l; i += 1) {
k = whitelist[i];
if (typeof k === "string") {
v = stringify(value[k], whitelist);
if (v) {
a.push(stringify(k) + ":" + v);
}
}
}
} else {
for (k in value) {
if (typeof k === "string") {
v = stringify(value[k], whitelist);
if (v) {
a.push(stringify(k) + ":" + v);
}
}
}
}
return "{" + a.join(",") + "}";
}
return undefined;
}
return {
stringify: stringify,
parse: function (text, filter) {
var j;
function walk(k, v) {
var i, n;
if (v && typeof v === "object") {
for (i in v) {
if (Object.prototype.hasOwnProperty.apply(v, [i])) {
n = walk(i, v[i]);
if (n !== undefined) {
v[i] = n;
}
}
}
}
return filter(k, v);
}
if (/^[\],:{}\s]*$/.test(text.replace(/\\./g, "@").
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, "]").
replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
j = eval("(" + text + ")");
return typeof filter === "function" ? walk("", j) : j;
}
throw new SyntaxError("parseJSON");
}
};
}();
}
var doc = document;
function trim(str) {
var s = str.replace(/\s+$/, "");
s = s.replace(/^\s+/, "");
return s;
}
function getGmailSubject() {
var subject = top.document.title;
var firstIndexOf = subject.indexOf("-");
var lastIndexOf = subject.lastIndexOf("-");
subject = subject.substring(firstIndexOf+1, lastIndexOf-1);
return trim(subject);
}
function getVtigerBaseURL(){
var url = document.location.href.substring(0,document.location.href.lastIndexOf('/')+1);
if(url.length > 0){
if(url.charAt(url.length-1) !="/"){
url += "/";
}
return url;
}
return null;
}
function getVtigerURL(){
if(doc.vtigerBaseURL.length > 0){
var url =doc.vtigerBaseURL;
url +="webservice.php";
return url;
}
return null;
}
function getGmailURL() {
var locationhref = location.href;
if(locationhref.indexOf("?")) {
var lsplits = locationhref.split("?");
locationhref = lsplits[0];
} else if(locationhref.indexOf("#")) {
var lsplits = locationhref.split("#");
locationhref = lsplits[0];
}
return locationhref;
}
var elementId = "__vtigerBookMarkletDiv__";
var busyElementId = "__vtigerBookMarkletDivBusy__"
function showBookMarkletUI(){
var bookMarkletDiv = doc.getElementById(elementId);
if(bookMarkletDiv == null){
bookMarkletDiv.style.display="block";
}
}
function hideBookMarkletUI(){
var bookMarkletDiv = doc.getElementById(elementId);
if(bookMarkletDiv != null){
bookMarkletDiv.style.display="none";
}
}
function destroyBookMarkletUI(){
var closeElementId = '__vtigetGmailCloseElement';
var parentLocation = location.href.split("location=");
if(parentLocation.length>1){
var closeElement = doc.getElementById(closeElementId);
if(closeElement==null){
closeElement = doc.createElement("iframe");
closeElement.style.width="0px";
closeElement.frameBorder="0px";
closeElement.style.height="0px";
closeElement.style.display="none";
closeElement.id = closeElementId;
closeElement.src = decodeURIComponent(parentLocation[1])+"#";
doc.body.appendChild(closeElement);
}
closeElement.onload=function(){
eval('window.parent.parent.removeMe()');
}
}
}
function showBusy(){
var bookMarkletDiv = doc.getElementById(elementId);
var busyElem = doc.getElementById(busyElementId);
if(busyElem==null){
busyElem = doc.createElement('div');
busyElem.id = busyElementId;
busyElem.innerHTML="Working...";
busyElem.style.position="absolute";
busyElem.style.top="5px";
busyElem.style.right="5px";
busyElem.style.color="white";
busyElem.style.backgroundColor="#D75235";
busyElem.style.padding="2px";
bookMarkletDiv.appendChild(busyElem);
}else{
busyElem.style.display="block";
}
}
function hideBusy(){
var busyElem = doc.getElementById(busyElementId);
if(busyElem!=null){
busyElem.style.display="none";
}
}
if(typeof doc.vtigerURL =="undefined" || doc.vtigerURL == null || doc.vtigerURL == ""){
doc.vtigerBaseURL = getVtigerBaseURL();
if(doc.vtigerBaseURL ==null){
alert("Please Provide a Valid URL");
return;
}
doc.vtigerURL = getVtigerURL();
}
var client = new VtigerWebservice(doc.vtigerURL,null,null);
showBusy();
client.extendSession();
hideBusy();
showBookMarkletUI();
function onReady(id,callback){
var interval = window.setInterval(function(){
var elem = doc.getElementById(id);
if(elem != null && typeof elem != "undefined"){
callback();
window.clearInterval(interval);
}
},10);
}
function createBookMarkletUI(){
onReady("__saveVtigerEmail__",function(){
doc.getElementById("__saveVtigerEmail__").onclick=function(){
createEmail();
}
});
onReady("parentType",function(){
doc.getElementById("parentName").innerHTML = "No "+doc.getElementById("parentType").value+" Selected.";
doc.getElementById("parentType").onchange=function(){
doc.getElementById("parentName").innerHTML = "No "+this.value+" Selected.";
}
});
function getQuery(searchValue){
var moduleName = doc.getElementById("parentType").value;
var moduleDetails = JSON.parse(moduleNameFields);
var entityNameFields = moduleDetails[moduleName];
var selectFields = '';
var whereFields = '';
each(entityNameFields,function(k,v){
if(selectFields.length > 0){
selectFields +=',';
}
selectFields += v;
if(whereFields.length > 0){
whereFields +=" or ";
}
whereFields += v+" like '%"+searchValue+"%'";
});
return "select "+selectFields+" from "+moduleName+" where "+whereFields+";";
}
onReady("__searchVtigerAccount__",function(){
doc.getElementById("__searchVtigerAccount__").onclick=function(e){
var elem = doc.getElementById("__vtigerAccountSearchList___");
elem.style.display="";
var accountName = doc.getElementById("__searchaccount__").value;
if(accountName.length < 1){
alert("Please enter the search critiria");
return;
}
showBusy();
var q = getQuery(accountName);
var moduleName = doc.getElementById("parentType").value;
var responseElem = doc.getElementById("__vtigerAccountSearchResponse___");
if(responseElem != null){
responseElem.innerHTML = '';
}
client.query(q,function(response){
var responseElem = doc.getElementById("__vtigerAccountSearchResponse___");
if(responseElem == null){
var sibling = doc.createElement("tr");
var td = doc.createElement("td");
td.colSpan = "3";
str = "<div id=\"__vtigerAccountSearchResponse___\" "+
"style=\"width: 100%;overflow: auto;\"> </div>";
td.innerHTML = str;
sibling.appendChild(td);
elem.parentNode.appendChild(sibling);
}
onReady("__vtigerAccountSearchResponse___",function(){
displaySearchResult(moduleName,response,accountName);
});
});
}
});
}
function getSiblingByTagName(elem,tagName){
var sibling = elem.nextSibling;
while(sibling.nodeName.toLowerCase()!=tagName.toLowerCase()){
sibling = sibling.nextSibling;
}
return sibling;
}
function each(object,callback){
var name, i = 0, length = object.length;
if ( length == undefined ) {
for ( name in object )
if ( callback.call( object[ name ], name, object[ name ] ) === false )
break;
} else
for ( var value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
return object;
}
function findObject(array,needle){
var name, i = 0, length = array.length;
var propect = null;
for (; i < length; ++i ){
var object = array[i];
for ( name in object ){
if(object[name] === needle){
prospect=object;
break;
}
}
}
return prospect;
}
function getEntityName(moduleName,row){
var moduleDetails = JSON.parse(moduleNameFields);
var entityNameFields = moduleDetails[moduleName];
var entityName = '';
var entityNameField = '';
each(entityNameFields,function(k,v){
if(entityName.length>0){
entityName += " ";
}
entityName +=row[v];
});
return entityName;
}
function displaySearchResult(moduleName,response,accountName){
hideBusy();
var queryResponse = JSON.parse(response.responseText);
if(queryResponse.success == true){
var queryResult = client.getResult(queryResponse);
var str ="<ul class='searchResult'>";
if(queryResult.length > 0){
each(queryResult, function(i, row){
var entityName = getEntityName(moduleName,row);
str+="<li><a id=\""+row['id']+"\" class='small searchLinks'>"+
entityName+"</a></li>";
});
}else{
str +="<li>No Record Match \""+accountName+"\"</li>";
}
str += "</ul>";
var elem = doc.getElementById("__vtigerAccountSearchResponse___");
elem.style.height="120px";
elem.innerHTML = str;
each(elem.getElementsByTagName("a"),function(i,v){
v.onclick=function(){
var elem = findObject(queryResult,this.id);
var entityName = getEntityName(moduleName,elem);
setAccountId(elem.id,entityName);
var wrap = doc.getElementById("__vtigerAccountSearchList___");
wrap.style.display="none";
doc.getElementById('__searchaccount__').value='';
}
});
}else{
var error = client.getError(queryResponse);
alert("Vtiger returned Error: \nerrorCode: "+error.code+"\nerror Message: "+error.message);
}
}
function waitForObject(obj,callback){
var interval = window.setInterval(function(){
if(typeof obj != "undefined"){
callback();
window.clearInterval(interval);
}
},10);
}
function setAccountId(id,entityName){
var elem = doc.getElementById("parent_id");
var elemName = doc.getElementById("parentName");
elem.value = id;
elemName.innerHTML = entityName;
}
function closeOnSuccess(response){
var createResponse = JSON.parse(response.responseText);
if(createResponse.success == true){
alert("Email added to vtigerCRM.");
}else{
doc.getElementById("__saveVtigerEmail__").disabled=false;
var error = client.getError(createResponse);
alert("Error while creating: \nerrorCode: "+error.code+"\nerror Message: "+error.message);
}
}
function getTodayDate(format){
var date = new Date();
return date.getDay()+"-"+date.getMonth()+"-"+date.getFullYear();
}
function createEmail(){
var parent_id = doc.getElementById("parent_id").value;
var type = doc.getElementById("parentType").value;
if(parent_id.length < 1){
alert("No "+type+" selected.");
return ;
}
var subject = doc.getElementById("subject").value;
if(subject.length < 1){
alert("Please provide a value for Subject");
return;
}
var description = doc.getElementById("description").value;
if(description.length < 1){
alert("Please provide a value for Body of the email.");
return;
}
doc.getElementById("__saveVtigerEmail__").disabled=true;
var email ={"description":description,"subject":subject,
"description":description,"assigned_user_id":client.userId,
"date_start":getTodayDate(),"activitytype":"Emails","parent_id": parent_id};
client.create(email,"Emails",closeOnSuccess)
}
createBookMarkletUI();
}