284 lines
8.3 KiB
JavaScript
284 lines
8.3 KiB
JavaScript
var Xinha = {};
|
|
|
|
// Auto detect _editor_url if it's not set.
|
|
if (!window._editor_url)
|
|
{
|
|
(function() // wrap this in an ad-hoc function to avoid unecessary pollution of global namespace
|
|
{
|
|
// Because of the way the DOM is loaded, this is guaranteed to always pull our script tag.
|
|
var scripts = document.getElementsByTagName('script');
|
|
var this_script = scripts[scripts.length - 1];
|
|
|
|
// We'll allow two ways to specify arguments. We'll accept them in the
|
|
// argument of the script, or we'll accept them embedded into our script tag.
|
|
var args = this_script.src.split('?');
|
|
args = args.length == 2 ? args[1].split('&') : '';
|
|
for (var index = 0; index < args.length; ++index)
|
|
{
|
|
var arg = args[index].split('=');
|
|
if (arg.length == 2)
|
|
{
|
|
switch (arg[0])
|
|
{
|
|
case 'lang':
|
|
case 'icons':
|
|
case 'skin':
|
|
case 'url':
|
|
window['_editor_' + arg[0]] = arg[1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// We can grab the script innerHTML and execute that to cut down on script
|
|
// tags. Thanks John Resig!
|
|
// http://ejohn.org/blog/degrading-script-tags/
|
|
if (this_script.innerHTML.replace(/\s+/, ''))
|
|
{
|
|
eval(this_script.innerHTML);
|
|
}
|
|
|
|
// Default values
|
|
_editor_lang = window._editor_lang || 'en';
|
|
|
|
// Chop off any query string. Chop the filename off of the URL.
|
|
_editor_url = window._editor_url || this_script.src.split('?')[0].split('/').slice(0, -1).join('/');
|
|
|
|
})()
|
|
}
|
|
_editor_url = _editor_url.replace(/\x2f*$/, '/');
|
|
|
|
Xinha.agt = navigator.userAgent.toLowerCase();
|
|
Xinha.is_ie = ((Xinha.agt.indexOf("msie") != -1) && (Xinha.agt.indexOf("opera") == -1));
|
|
Xinha.ie_version= parseFloat(Xinha.agt.substring(Xinha.agt.indexOf("msie")+5));
|
|
Xinha.is_opera = (Xinha.agt.indexOf("opera") != -1);
|
|
Xinha.is_khtml = (Xinha.agt.indexOf("khtml") != -1);
|
|
Xinha.is_webkit = (Xinha.agt.indexOf("applewebkit") != -1);
|
|
Xinha.is_safari = (Xinha.agt.indexOf("safari") != -1);
|
|
Xinha.opera_version = navigator.appVersion.substring(0, navigator.appVersion.indexOf(" "))*1;
|
|
Xinha.is_mac = (Xinha.agt.indexOf("mac") != -1);
|
|
Xinha.is_mac_ie = (Xinha.is_ie && Xinha.is_mac);
|
|
Xinha.is_win_ie = (Xinha.is_ie && !Xinha.is_mac);
|
|
Xinha.is_gecko = (navigator.product == "Gecko" && !Xinha.is_safari); // Safari lies!
|
|
Xinha.isRunLocally = document.URL.toLowerCase().search(/^file:/) != -1;
|
|
Xinha.is_designMode = (typeof document.designMode != 'undefined' && !Xinha.is_ie); // IE has designMode, but we're not using it
|
|
Xinha.isSupportedBrowser = Xinha.is_gecko || (Xinha.is_opera && Xinha.opera_version >= 9.1) || Xinha.ie_version >= 5.5 || Xinha.is_safari;
|
|
|
|
Xinha.loadPlugins = function(plugins, callbackIfNotReady)
|
|
{
|
|
if ( !Xinha.isSupportedBrowser ) return;
|
|
|
|
Xinha.loadStyle(typeof _editor_css == "string" ? _editor_css : "Xinha.css","XinhaCoreDesign");
|
|
Xinha.createLoadingMessages(xinha_editors);
|
|
var loadingMessages = Xinha.loadingMessages;
|
|
Xinha._loadback(_editor_url + "XinhaCore.js",function () {
|
|
Xinha.removeLoadingMessages(xinha_editors);
|
|
Xinha.createLoadingMessages(xinha_editors);
|
|
callbackIfNotReady()
|
|
});
|
|
return false;
|
|
}
|
|
|
|
Xinha._loadback = function(Url, Callback, Scope, Bonus)
|
|
{
|
|
var T = !Xinha.is_ie ? "onload" : 'onreadystatechange';
|
|
var S = document.createElement("script");
|
|
S.type = "text/javascript";
|
|
S.src = Url;
|
|
if ( Callback )
|
|
{
|
|
S[T] = function()
|
|
{
|
|
if ( Xinha.is_ie && ( ! ( /loaded|complete/.test(window.event.srcElement.readyState) ) ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
Callback.call(Scope ? Scope : this, Bonus);
|
|
S[T] = null;
|
|
};
|
|
}
|
|
document.getElementsByTagName("head")[0].appendChild(S);
|
|
};
|
|
|
|
Xinha.getElementTopLeft = function(element)
|
|
{
|
|
var curleft = 0;
|
|
var curtop = 0;
|
|
if (element.offsetParent)
|
|
{
|
|
curleft = element.offsetLeft
|
|
curtop = element.offsetTop
|
|
while (element = element.offsetParent)
|
|
{
|
|
curleft += element.offsetLeft
|
|
curtop += element.offsetTop
|
|
}
|
|
}
|
|
return { top:curtop, left:curleft };
|
|
}
|
|
|
|
// find X position of an element
|
|
Xinha.findPosX = function(obj)
|
|
{
|
|
var curleft = 0;
|
|
if ( obj.offsetParent )
|
|
{
|
|
return Xinha.getElementTopLeft(obj).left;
|
|
}
|
|
else if ( obj.x )
|
|
{
|
|
curleft += obj.x;
|
|
}
|
|
return curleft;
|
|
};
|
|
|
|
// find Y position of an element
|
|
Xinha.findPosY = function(obj)
|
|
{
|
|
var curtop = 0;
|
|
if ( obj.offsetParent )
|
|
{
|
|
return Xinha.getElementTopLeft(obj).top;
|
|
}
|
|
else if ( obj.y )
|
|
{
|
|
curtop += obj.y;
|
|
}
|
|
return curtop;
|
|
};
|
|
|
|
Xinha.createLoadingMessages = function(xinha_editors)
|
|
{
|
|
if ( Xinha.loadingMessages || !Xinha.isSupportedBrowser )
|
|
{
|
|
return;
|
|
}
|
|
Xinha.loadingMessages = [];
|
|
|
|
for (var i=0;i<xinha_editors.length;i++)
|
|
{
|
|
if (!document.getElementById(xinha_editors[i]))
|
|
{
|
|
continue;
|
|
}
|
|
Xinha.loadingMessages.push(Xinha.createLoadingMessage(document.getElementById(xinha_editors[i])));
|
|
}
|
|
}
|
|
|
|
Xinha.createLoadingMessage = function(textarea,text)
|
|
{
|
|
if ( document.getElementById("loading_" + textarea.id) || !Xinha.isSupportedBrowser)
|
|
{
|
|
return;
|
|
}
|
|
// Create and show the main loading message and the sub loading message for details of loading actions
|
|
// global element
|
|
var loading_message = document.createElement("div");
|
|
loading_message.id = "loading_" + textarea.id;
|
|
loading_message.className = "loading";
|
|
|
|
loading_message.style.left = (Xinha.findPosX(textarea) + textarea.offsetWidth / 2) - 106 + 'px';
|
|
loading_message.style.top = (Xinha.findPosY(textarea) + textarea.offsetHeight / 2) - 50 + 'px';
|
|
// main static message
|
|
var loading_main = document.createElement("div");
|
|
loading_main.className = "loading_main";
|
|
loading_main.id = "loading_main_" + textarea.id;
|
|
loading_main.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait!")));
|
|
// sub dynamic message
|
|
var loading_sub = document.createElement("div");
|
|
loading_sub.className = "loading_sub";
|
|
loading_sub.id = "loading_sub_" + textarea.id;
|
|
text = text ? text : Xinha._lc("Loading Core");
|
|
loading_sub.appendChild(document.createTextNode(text));
|
|
loading_message.appendChild(loading_main);
|
|
loading_message.appendChild(loading_sub);
|
|
document.body.appendChild(loading_message);
|
|
|
|
return loading_sub;
|
|
}
|
|
|
|
Xinha.loadStyle = function(style, id)
|
|
{
|
|
var url = _editor_url || '';
|
|
|
|
url += style;
|
|
|
|
var head = document.getElementsByTagName("head")[0];
|
|
var link = document.createElement("link");
|
|
link.rel = "stylesheet";
|
|
link.href = url;
|
|
if (id) link.id = id;
|
|
head.appendChild(link);
|
|
};
|
|
Xinha._lc = function(string) {return string;}
|
|
|
|
Xinha._addEvent = function(el, evname, func)
|
|
{
|
|
if ( document.addEventListener )
|
|
{
|
|
el.addEventListener(evname, func, true);
|
|
}
|
|
else
|
|
{
|
|
el.attachEvent("on" + evname, func);
|
|
}
|
|
}
|
|
Xinha.addOnloadHandler = function (func)
|
|
{
|
|
// Dean Edwards/Matthias Miller/John Resig
|
|
// http://dean.edwards.name/weblog/2006/06/again/
|
|
// IE part from jQuery
|
|
|
|
|
|
var init = function ()
|
|
{
|
|
// quit if this function has already been called
|
|
if (arguments.callee.done) return;
|
|
// flag this function so we don't do the same thing twice
|
|
arguments.callee.done = true;
|
|
// kill the timer
|
|
if (Xinha.onloadTimer) clearInterval(Xinha.onloadTimer);
|
|
|
|
func.call();
|
|
}
|
|
if (Xinha.is_ie)
|
|
{
|
|
// ensure firing before onload,
|
|
// maybe late but safe also for iframes
|
|
document.attachEvent("onreadystatechange", function(){
|
|
if ( document.readyState === "complete" ) {
|
|
document.detachEvent( "onreadystatechange", arguments.callee );
|
|
init();
|
|
}
|
|
});
|
|
if ( document.documentElement.doScroll && typeof window.frameElement === "undefined" ) (function(){
|
|
if (arguments.callee.done) return;
|
|
try {
|
|
// If IE is used, use the trick by Diego Perini
|
|
// http://javascript.nwbox.com/IEContentLoaded/
|
|
document.documentElement.doScroll("left");
|
|
} catch( error ) {
|
|
setTimeout( arguments.callee, 0 );
|
|
return;
|
|
}
|
|
// and execute any waiting functions
|
|
init();
|
|
})();
|
|
}
|
|
else if (/WebKit/i.test(navigator.userAgent))
|
|
{
|
|
Xinha.onloadTimer = setInterval(function()
|
|
{
|
|
if (/loaded|complete/.test(document.readyState))
|
|
{
|
|
init(); // call the onload handler
|
|
}
|
|
}, 10);
|
|
}
|
|
else /* for Mozilla/Opera9 */
|
|
{
|
|
document.addEventListener("DOMContentLoaded", init, false);
|
|
}
|
|
}
|