/*
* SocialEngineMods Javascript Library v0.4
* http://www.SocialEngineMods.Net
* CRC: f878f2a8e604f44b6469facb904a9db0
*
* Copyright SocialEngineMods.Net
* This code is licensed GPL for use exclusively on SocialEngine sites
*
*/
/* Extensions */
Function.prototype.bind = function(obj) {
var method = this, temp = function() {
return method.apply(obj, arguments)
};
return(temp);
};
__super_class = function (obj) {
this.__super=obj;
this.__parent=obj.prototype.parent;
};
__super_class.prototype = {
__super_method : function(method, pointer) {
var __pointer=pointer;
this[method]=function() {
var __parent=this.__context.parent;
this.__context.parent=__parent ? __parent.parent : null;
var __ret=__pointer.apply(this.__context, arguments);
this.__context.parent=__parent;
__parent=null;
return __ret;
};
},
construct : function(context) {
this.__context=context;
var a=new Array();
for (var i=1; i/g, '>') : '';
},
toHtml : function (text) {
return SEMods.Utils.htmlspecialchars(text).replace(/\n/g, '
');
},
debug : function (message) {
if(SEMods.debug)
this.dbgFunc ? this.dbgFunc(message) : alert(message);
},
setDebugger : function(dbgFunc) {
this.dbgFunc = dbgFunc;
},
unescapeQuotes : function (word) {
// jsesq is a key/acronym for javascript escaped single quote
// jsdsq is a key/acronym for javascript escaped double quote
escaped = word.replace(/:jsesq:/g, "'");
escaped = escaped.replace(/:jsedq:/g, '"');
escaped = escaped.replace(/:jselb:/g, '\[');
escaped = escaped.replace(/:jserb:/g, '\]');
escaped = escaped.replace(/:jsebs:/g, '\\');
return escaped;
},
arrayToQueryString : function (queryArray) {
var query = '';
for( var key in queryArray ) {
query += encodeURIComponent(key) + '=' + encodeURIComponent(queryArray[key]) + '&';
}
return query.slice(0, -1);
}
};
/* SEMods Browser */
SEMods.Browser = function () {};
SEMods.Browser = {
isIE : (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) ),
isFireFox : (/FireFox/i.test(navigator.userAgent)),
isOpera : (/Opera/i.test(navigator.userAgent)),
addEvent : function (obj, type, func) {
if (obj.addEventListener) {
obj.addEventListener(type, func, 0);
} else if (obj.attachEvent) {
obj.attachEvent("on" + type, func);
}
},
register_onload : function (handler) {
if (window.onload) {
var original_handler=window.onload;
window.onload=function() { original_handler(); handler(); };
}
else {
window.onload=handler;
}
},
ge : function(element) {
var elem;
if( typeof element == 'string' ) {
elem = document.getElementById(element);
// try by name, first in array
if(!elem)
elem = this.geByName(element);
} else {
elem = element;
}
return elem;
},
geByName : function(element) {
var elems = document.getElementsByName(element);
if(elems.length == 1)
return elems[0];
return null;
},
show : function () {
for( var i = 0; i < arguments.length; i++ ) {
var element = SEMods.B.ge(arguments[i]);
if (element && element.style) element.style.display = 'block';
}
},
hide : function () {
for( var i = 0; i < arguments.length; i++ ) {
var element = SEMods.B.ge(arguments[i]);
if (element && element.style) element.style.display = 'none';
}
},
toggle : function () {
for( var i = 0; i < arguments.length; i++ ) {
var element = SEMods.B.ge(arguments[i]);
element.style.display = (element.style.display == 'block') ? 'none' : 'block';
}
},
// Get Absolute X Position of HTML Element
findX : function(obj) {
var curleft = 0;
if (obj.offsetParent) {
while (obj.offsetParent) {
curleft += obj.offsetLeft
obj = obj.offsetParent;
}
}
else if (obj.x)
curleft += obj.x;
return curleft;
},
// Get Absolute Y Position of HTML Element
findY : function (obj) {
var curtop = 0;
if(obj.offsetParent) {
while (obj.offsetParent) {
curtop += obj.offsetTop
obj = obj.offsetParent;
}
}
else if (obj.y)
curtop += obj.y;
return curtop;
},
mousePosX : function (e) {
var posx = 0;
if (!e) var e = window.event;
if (e.pageX)
posx = e.pageX;
else if (e.clientX && document.body.scrollLeft)
posx = e.clientX + document.body.scrollLeft;
else if (e.clientX && document.documentElement.scrollLeft)
posx = e.clientX + document.documentElement.scrollLeft;
else if (e.clientX)
posx = e.clientX;
return posx;
},
mousePosY : function (e) {
var posy = 0;
if (!e) var e = window.event;
if (e.pageY)
posy = e.pageY;
else if (e.clientY && document.body.scrollTop)
posy = e.clientY + document.body.scrollTop;
else if (e.clientY && document.documentElement.scrollTop)
posy = e.clientY + document.documentElement.scrollTop;
else if (e.clientY)
posy = e.clientY;
return posy;
},
getStyle : function(obj, property) {
if (window.getComputedStyle) {
return window.getComputedStyle(obj, null).getPropertyValue(property);
}
if (document.defaultView && document.defaultView.getComputedStyle) {
var computedStyle = document.defaultView.getComputedStyle(obj, null);
if (computedStyle) return computedStyle.getPropertyValue(property);
}
if (obj.currentStyle) {
return obj.currentStyle[property];
}
return obj.style[property];
},
getStyleName : function(stylename) {
return SEMods.Browser.isIE ? stylename : stylename.replace(/[A-Z]/g, function(a){return'-'+a.toLowerCase();} );
},
// em's not supported for now
getPXMetrics : function(metric, defvalue) {
var metricBase = parseFloat(metric);
if(isNaN(metricBase)) return defvalue!=null ? defvalue : metricBase;
return /px/i.test(metric) ? metricBase : /pt/i.test(metric) ? 1.3333*metricBase : metricBase;
},
createDiv : function( parent, id, cname ) {
var div = document.createElement("div");
if(id) div.id = id;
if(cname) div.className = cname;
parent.appendChild( div );
return div;
}
};
/* Shortcuts */
SEMods.B = SEMods.Browser;
SEMods.U = SEMods.Utils;
/* SEMods TextAreaControl */
SEMods.TextAreaControl = function(object) {
this.obj = object;
this.obj.style['overflow'] = 'hidden';
this.originalHeight = this.obj.offsetHeight;
var updater = this.update.bind(this);
SEMods.Browser.addEvent(object, "focus", this.onFocus.bind(this));
SEMods.Browser.addEvent(object, "blur", this.onBlur.bind(this));
this.update();
};
SEMods.TextAreaControl.prototype = {
obj : null,
updating : false,
autoGrow : false,
originalHeight : null,
shadowElement : null,
increment : 0,
timer : null,
lastLength : 0,
fontFamily : SEMods.Browser.getStyleName('fontFamily'),
fontSize : SEMods.Browser.getStyleName('fontSize'),
paddingLeft : SEMods.Browser.getStyleName('paddingLeft'),
paddingRight : SEMods.Browser.getStyleName('paddingRight'),
lineHeight : SEMods.Browser.getStyleName('lineHeight'),
setAutoGrow : function(autoGrow) {
this.autoGrow = autoGrow;
this.createShadowElement();
this.update();
},
onUpdate : function() {
if(this.autoGrow && this.lastLength != this.obj.value.length) {
this.lastLength = this.obj.value.length;
this.updateShadowElement();
this.obj.style.height = Math.max(this.originalHeight, this.shadowElement.offsetHeight + this.increment) + 'px';
}
},
beginUpdate : function() {
if(this.updating)
return false;
this.updating = true;
return true;
},
endUpdate : function() {
this.updating = false;
},
update : function() {
if(!this.beginUpdate())
return;
this.onUpdate();
this.endUpdate();
},
createShadowElement : function() {
if(this.shadowElement)
return;
this.shadowElement = document.createElement("DIV");
this.shadowElement.style.position = "absolute";
this.shadowElement.style.top = "-99999px";
this.shadowElement.style.left = "-99999px";
document.body.appendChild(this.shadowElement);
},
updateShadowElement : function () {
if(this.shadowElement) {
this.shadowElement.innerHTML = SEMods.Utils.toHtml(this.obj.value + '
');
var fontSize = SEMods.Browser.getPXMetrics( SEMods.Browser.getStyle(this.obj, this.fontSize), 10);
var lineHeight = SEMods.Browser.getStyle(this.obj, this.lineHeight);
// Opera misses on line-height
if(SEMods.Browser.isOpera)
lineHeight = SEMods.Browser.getPXMetrics( lineHeight, 0) + 3 + 'px';
this.increment = fontSize + 10;
this.shadowElement.style['width'] = this.obj.offsetWidth + 'px';
this.shadowElement.style['lineHeight'] = lineHeight;
this.shadowElement.style['fontSize'] = SEMods.Browser.getStyle(this.obj, this.fontSize);
this.shadowElement.style['fontFamily'] = SEMods.Browser.getStyle(this.obj, this.fontFamily);
this.shadowElement.style['paddingLeft'] = SEMods.Browser.getStyle(this.obj, this.paddingLeft);
this.shadowElement.style['paddingRight'] = SEMods.Browser.getStyle(this.obj, this.paddingRight);
}
},
onFocus : function() {
this.timer = setInterval(this.update.bind(this), 500);
},
onBlur : function() {
if(this.timer) {
clearInterval(this.timer);
this.timer = null;
}
}
};
/* SEMods TextAreaControl */
SEMods.Ajax = function (doneHandler, failHandler)
{
this.onDone = doneHandler;
this.onFail = failHandler;
this.transport = this.getTransport();
this.transport.onreadystatechange = this.stateDispatch.bind(this);
};
SEMods.Ajax.prototype = {
get : function (uri, query, force_sync) {
// Firefox doesn't call onDone and onFail handlers if you force_sync
force_sync = force_sync || false;
if( typeof query != 'string' )
query = SEMods.U.arrayToQueryString(query);
fullURI = uri+(query ? ('?'+query) : '');
this.transport.open('GET', fullURI, !force_sync );
this.transport.send('');
},
post : function (uri, data, force_sync) {
force_sync = force_sync || false;
if( typeof data != 'string' )
data = SEMods.U.arrayToQueryString(data);
this.transport.open('POST', uri, !force_sync);
this.transport.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
this.transport.send(data);
},
stateDispatch : function () {
if( this.transport.readyState == 4 ) {
if( this.transport.status >= 200 &&
this.transport.status < 300 &&
this.transport.responseText.length > 0 ) {
if( this.onDone ) this.onDone(this, this.transport.responseText);
} else {
if( this.onFail ) this.onFail(this);
}
}
},
getTransport : function () {
var ajax = null;
try { ajax = new XMLHttpRequest(); }
catch(e) { ajax = null; }
try { if(!ajax) ajax = new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) { ajax = null; }
try { if(!ajax) ajax = new ActiveXObject("Microsoft.XMLHTTP")}
catch(e) { ajax = null; }
return ajax;
}
};
/* Global namespace helper functions */
if (typeof textarea_autogrow == 'undefined') {
textarea_autogrow = function (elementid) {
var el = SEMods.Browser.ge(elementid);
if(!el) SEMods.Utils.debug("textarea_autogrow(): element not found");
if(el && !el._controlled) {
el._controlled = true;
new SEMods.TextAreaControl(el).setAutoGrow(true);
}
};
}