Index: trunk/core/admin_templates/js/ajax.js
===================================================================
diff -u -r7635 -r8174
--- trunk/core/admin_templates/js/ajax.js (.../ajax.js) (revision 7635)
+++ trunk/core/admin_templates/js/ajax.js (.../ajax.js) (revision 8174)
@@ -115,7 +115,8 @@
}
Request.setOpacity = function (opacity, id) {
- var object = document.getElementById(id).style;
+ var elem = typeof(id)=='string' ? document.getElementById(id) : id;
+ var object = elem.style;
object.opacity = (opacity / 100);
object.MozOpacity = (opacity / 100);
object.KhtmlOpacity = (opacity / 100);
Index: trunk/core/admin_templates/js/uploader.js
===================================================================
diff -u
--- trunk/core/admin_templates/js/uploader.js (revision 0)
+++ trunk/core/admin_templates/js/uploader.js (revision 8174)
@@ -0,0 +1,432 @@
+function Uploader(id, params)
+{
+ this.id = id;
+ if (params.multiple.length == 0) params.multiple = 1;
+ this.params = params;
+ this.files_count = 0;
+ this.files = new Array();
+ this.deleted = new Array()
+
+ this.uploadURL = params.uploadURL;
+ this.deleteURL = params.deleteURL;
+}
+
+Uploader.prototype.Init = function()
+{
+ var holder = document.createElement('DIV');
+ document.body.appendChild(holder);
+
+ // moving out progress div to overcome loosing of flash object after setting opacity
+
+ this.div = document.getElementById(this.id+'_progress');
+ var clone = this.div.cloneNode(true);
+ this.div.parentNode.removeChild(this.div)
+ this.div = document.body.appendChild(clone);
+
+ this.filename = document.getElementById(this.id+'_progress_filename');
+ this.progress = document.getElementById(this.id+'_progress_progress');
+ this.elapsed = document.getElementById(this.id+'_progress_elapsed');
+ this.remaining = document.getElementById(this.id+'_progress_remaining');
+ this.percent = document.getElementById(this.id+'_percent');
+ this.done = document.getElementById(this.id+'_done');
+ this.total = 0;
+ this.uploaded = 0;
+
+ this.flash_id = UploadsManager.NextFlashId();
+ this.swf = new SWFObject('SWFUpload.swf', this.flash_id, "0", "0", "8", "#000000");
+ this.swf.setAttribute('style', '');
+ this.swf.addVariable("uploadScript", '');
+ this.swf.addVariable("maxFiles", escape(this.params.multiple));
+ this.swf.addVariable("allowedFilesize", escape(this.params.allowedFilesize));
+ this.swf.addVariable("allowedFiletypes", escape(this.params.allowedFiletypes));
+ this.swf.addVariable("allowedFiletypesDescription", escape(this.params.allowedFiletypesDescription));
+
+ this.swf.addVariable("uploadFileQueuedCallback", escape('UploadsManager.FileSelected'));
+ this.swf.addVariable("uploadFileStartCallback", escape('UploadsManager.UploadFileStart'));
+ this.swf.addVariable("uploadProgressCallback", escape('UploadsManager.UploadProgress'));
+ this.swf.addVariable("uploadFileCompleteCallback", escape('UploadsManager.UploadFileComplete'));
+ this.swf.addVariable("uploadFileCancelCallback", escape('UploadsManager.FileCancelled'));
+ this.swf.addVariable("uploadQueueCompleteCallback", escape('UploadsManager.UploadQueueComplete'));
+ this.swf.addVariable("uploadFileErrorCallback", escape('UploadsManager.UploadError'));
+ this.swf.addVariable("uploadCancelCallback", escape('uploadCancel'));
+ this.swf.addVariable("autoUpload", escape('false'));
+// this.swf.addVariable("flashLoadedCallback", 'flashLoadedCallback');
+
+ this.swf.addVariable("uploadScriptCallback", escape('UploadsManager.GetUploadScript'));
+ this.swf.addVariable("uploaderId", escape(this.id));
+ this.swf.write(holder);
+
+ this.flash = document.getElementById(this.flash_id);
+ /*if (this.flash != null) {
+ if(this.flash.PercentLoaded() == 100) {
+ alert('done movie: '+this.flash.PercentLoaded());
+ }
+ }
+ else {
+ alert('this.flash is null')
+ }*/
+ if (this.params.urls != '') {
+ var urls = this.params.urls.split('|');
+ var names = this.params.names.split('|');
+ var sizes = this.params.sizes.split('|');
+ for (var i in urls) {
+ var a_file = {
+ id : names[i],
+ name : names[i],
+ url : urls[i],
+ size: sizes[i],
+ uploaded : 1
+ }
+ this.files.push(a_file)
+ this.files_count++;
+ }
+ this.UpdateInfo();
+ }
+}
+
+Uploader.prototype.UpdateInfo = function()
+{
+ var o = '';
+ for (var f in this.files) {
+ this.files[f].name.match(/\.([^.]*)$/);
+ var ext = RegExp.$1;
+ var icon = ext.match(/^(ai|avi|bmp|cs|dll|doc|dot|exe|fla|gif|htm|html|jpg|js|mdb|mp3|pdf|ppt|rdp|swf|swt|txt|vsd|xls|xml|zip)$/) ? ext : 'default.icon';
+ o += '
';
+ if (isset(this.files[f].uploaded)) {
+ o += ''+this.files[f].name + ' ('+this.FormatSize(this.files[f].size)+') [Delete]
';
+ }
+ else {
+ o += this.files[f].name + ' ('+this.FormatSize(this.files[f].size)+') [Delete]
';
+ }
+ }
+ document.getElementById(this.id+'_queueinfo').innerHTML = o;
+ this.PrepareFiles()
+}
+
+Uploader.prototype.RemoveFile = function(file)
+{
+ var n_files = new Array();
+ var count=0;
+ this.total=0;
+ for (var f in this.files) {
+ if (this.files[f].id != file.id && this.files[f].name != file.id ) {
+ n_files.push(this.files[f]);
+ if (!isset(this.files[f].uploaded)) {
+ this.total += file.size
+ }
+ count++;
+ }
+ }
+ this.files = n_files;
+ this.files_count = count;
+ this.UpdateInfo();
+}
+
+Uploader.prototype.GetUploadScript = function(file)
+{
+// document.getElementById(this.id+'[my_tmp]').value = file.id;
+ return this.uploadURL.replace('#ID#', file.id).replace('#FIELD#', this.params.field).replace('#SID#', this.params.flashsid);
+}
+
+Uploader.prototype.PrepareFiles = function()
+{
+ var ids = '';
+ var names = '';
+ for (var f in this.files) {
+ if (isset(this.files[f].uploaded) && !isset(this.files[f].temp)) continue;
+ ids += this.files[f].id + '|'
+ names += this.files[f].name + '|'
+ }
+ ids = ids.replace(/\|$/, '', ids);
+ names = names.replace(/\|$/, '', names);
+ document.getElementById(this.id+'[tmp_ids]').value = ids;
+ document.getElementById(this.id+'[tmp_names]').value = names;
+ document.getElementById(this.id+'[tmp_deleted]').value = this.deleted.join('|');
+}
+
+
+Uploader.prototype.HasQueue = function()
+{
+ for (var f in this.files) {
+ if (isset(this.files[f].uploaded)) continue;
+ return true;
+ }
+ return false;
+}
+
+
+Uploader.prototype.StartUpload = function()
+{
+ if (!this.HasQueue()) return;
+
+ Request.setOpacity(30, Form.Div);
+
+ if (!document.all) {
+ var $winW = window.innerWidth;
+ var $winH = window.innerHeight;
+ }
+ else {
+ var $winW = window.document.body.offsetWidth;
+ var $winH = window.document.body.offsetHeight;
+ }
+
+ var left = Math.round(($winW - 350)/2)+'px';
+ var top = Math.round(($winH - 110)/2)+'px';
+
+ this.div.style.top = top;
+ this.div.style.left = left;
+ this.div.style.display = 'block';
+ Request.setOpacity(100, this.div);
+
+ this.StartTime = this.GetMicroTime();
+ this.ProgressPercent = 0; // progress percent
+ this.ProgressTime = new Array();
+
+ this.uploaded = 0;
+ this.total = 0;
+ for (var f in this.files) {
+ if (isset(this.files[f].uploaded)) continue;
+ this.total += this.files[f].size;
+ }
+
+ document.getElementById(this.flash_id).upload();
+}
+
+Uploader.prototype.GetMicroTime = function() {
+ var $now = new Date();
+ return Math.round($now.getTime() / 1000); // because miliseconds are returned too
+}
+Uploader.prototype.GetEstimatedTime = function() {
+ return Math.ceil((100 - this.ProgressPercent) * this.ProgressTime / this.ProgressPercent);
+}
+
+Uploader.prototype.FormatTime = function ($seconds) {
+ $seconds = parseInt($seconds);
+
+ var $minutes = Math.floor($seconds / 60);
+ if ($minutes < 10) $minutes = '0' + $minutes;
+ $seconds = $seconds % 60;
+ if ($seconds < 10) $seconds = '0' + $seconds;
+
+ return $minutes + ':' + $seconds;
+}
+
+Uploader.prototype.FormatSize = function (bytes) {
+ var kb = Math.round(bytes / 1024);
+ if (kb < 1024) return kb+'Kb';
+ var mb = Math.round(kb / 1024 * 100)/100;
+ return mb+'Mb';
+}
+
+Uploader.prototype.UploadFileStart = function(file, position, queuelength)
+{
+ this.filename.innerHTML = file.name;
+}
+
+Uploader.prototype.UploadProgress = function(file, bytesLoaded)
+{
+ this.cur_file_uploaded = bytesLoaded;
+
+ var uploaded = this.uploaded+this.cur_file_uploaded;
+ this.ProgressTime = this.GetMicroTime() - this.StartTime;
+
+ var speed = 0;
+ if (this.ProgressTime > 0) {
+ speed = Math.round(uploaded/this.ProgressTime*100)/100;
+ }
+
+ this.progress.innerHTML = this.FormatSize(uploaded)+' / '+this.FormatSize(this.total) + ' ('+this.FormatSize(speed)+'/s)';
+ this.ProgressPercent = Math.round(uploaded/this.total*100);
+ this.done.style.width = this.ProgressPercent+'%';
+ this.percent.innerHTML = this.ProgressPercent+'%';
+
+ this.elapsed.innerHTML = this.FormatTime(this.ProgressTime );
+ this.remaining.innerHTML = this.FormatTime( this.GetEstimatedTime() );
+}
+
+Uploader.prototype.UploadFileComplete = function(file)
+{
+ this.uploaded += this.cur_file_uploaded;
+ for (var f in this.files) {
+ if (this.files[f].id == file.id) {
+ this.files[f].uploaded = 1;
+ this.files[f].temp = 1;
+ this.files[f].url = this.params.tmp_url.replace('#ID#', file.id).replace('#FILE#', file.name).replace('#FIELD#', this.params.field);
+ }
+ }
+ this.UpdateInfo();
+}
+
+
+// MANAGER
+
+
+function UploadsManager() {
+ // hooking to standard toolbar select button to peform auto-upload when Save is clicked
+ if (isset(a_toolbar)) {
+ if (a_toolbar.ButtonExists('select')) {
+ var old_onclick = a_toolbar.Buttons['select'].onClick;
+ a_toolbar.Buttons['select'].onClick = function() {
+ UploadsManager.UploadAll(function() {old_onclick()});
+ }
+ }
+ }
+ addLoadEvent(function() {UploadsManager.InitAll()});
+}
+
+UploadsManager = new UploadsManager();
+UploadsManager.Uploaders = new Object();
+UploadsManager.nextId = 0;
+
+
+UploadsManager.NextFlashId = function()
+{
+ this.nextId++;
+ return 'uploaderflash'+this.nextId;
+}
+
+UploadsManager.AddUploader = function(id, params )
+{
+ this.Uploaders[id] = new Uploader(id, params);
+}
+
+UploadsManager.InitAll = function()
+{
+ for (var i in this.Uploaders) {
+ this.Uploaders[i].Init();
+ }
+}
+
+UploadsManager.FileSelected = function(file)
+{
+ var upl = this.Uploaders[file.uploader_id]
+ if (upl.files_count >= upl.params.multiple) {
+ if (upl.params.multiple > 1) {
+ alert('too many files');
+ upl.flash.cancelFile(file.id);
+ }
+ else {
+ upl.files_count++;
+ upl.files.push(file);
+ upl.total += file.size;
+ if (upl.files[0].uploaded) {
+ UploadsManager.DeleteFile(file.uploader_id, upl.files[0].name);
+ }
+ else {
+ upl.flash.cancelFile(upl.files[0].id);
+ }
+ }
+ }
+ else {
+ upl.files_count++;
+ upl.files.push(file);
+ upl.total += file.size;
+ }
+ upl.UpdateInfo();
+}
+
+UploadsManager.FileCancelled = function(file)
+{
+ this.Uploaders[file.uploader_id].RemoveFile(file);
+}
+
+UploadsManager.GetUploadScript = function(file)
+{
+ return this.Uploaders[file.uploader_id].GetUploadScript(file);
+}
+
+UploadsManager.UploadError = function(errno, file, msg)
+{
+ alert('error '+errno)
+ alert('Error: '+msg+' on file '+file.name);
+}
+
+UploadsManager.DeleteFile = function(mov, fname)
+{
+ if (!confirm('Are you sure you want to delete this file?')) return;
+ Request.makeRequest(
+ this.Uploaders[mov].deleteURL.replace('#FILE#', fname),
+ false, '',
+ function(req, fname, upl) {
+ upl.RemoveFile({id:fname})
+ upl.deleted.push(fname);
+ upl.UpdateInfo();
+ },
+ function(req, fname, upl) {alert('Error while deleting file')},
+ fname, this.Uploaders[mov]
+ );
+}
+
+
+UploadsManager.Browse = function(id)
+{
+ this.Uploaders[id].flash.browse()
+}
+
+UploadsManager.StartUpload = function(id)
+{
+ this.uploadCancelled = false;
+ this.Uploaders[id].StartUpload();
+}
+
+UploadsManager.CancelFile = function(id, file_id)
+{
+ this.Uploaders[id].flash.cancelFile(file_id)
+}
+
+UploadsManager.UploadAll = function(onAllUploaded)
+{
+ if (!this.HasQueue()) {
+ onAllUploaded();
+ return;
+ }
+ this.uploadCancelled = false;
+ for (var i in this.Uploaders) {
+ this.Uploaders[i].StartUpload();
+ }
+ this.OnAllUploaded = onAllUploaded;
+}
+
+UploadsManager.UploadFileStart = function(file, position, queuelength)
+{
+ this.Uploaders[file.uploader_id].UploadFileStart(file, position, queuelength);
+}
+
+UploadsManager.UploadProgress = function(file, bytesLoaded)
+{
+ this.Uploaders[file.uploader_id].UploadProgress(file, bytesLoaded);
+}
+
+UploadsManager.UploadFileComplete = function(file)
+{
+ this.Uploaders[file.uploader_id].UploadFileComplete(file);
+}
+
+UploadsManager.HasQueue = function()
+{
+ var has_queue = false;
+ for (var i in this.Uploaders) {
+ var tmp = this.Uploaders[i].HasQueue()
+ has_queue = has_queue || tmp;
+ }
+ return has_queue;
+}
+
+UploadsManager.UploadQueueComplete = function(file)
+{
+ Request.setOpacity(100, Form.Div);
+ var all_done = true;
+ for (var i in this.Uploaders) {
+ this.Uploaders[i].div.style.display='none';
+ all_done == all_done && !this.Uploaders[i].HasQueue();
+ }
+ if (all_done && isset(this.OnAllUploaded) && !this.uploadCancelled) {
+ this.OnAllUploaded();
+ }
+}
+
+UploadsManager.CancelUpload = function(mov)
+{
+ document.getElementById(mov+'_swf').cancelQueue();
+ this.uploadCancelled = true;
+}
\ No newline at end of file
Index: trunk/core/admin_templates/js/swfobject.js
===================================================================
diff -u
--- trunk/core/admin_templates/js/swfobject.js (revision 0)
+++ trunk/core/admin_templates/js/swfobject.js (revision 8174)
@@ -0,0 +1,8 @@
+/**
+ * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
+ *
+ * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ */
+if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="