var Uploader = {
    addInput: function(){
        try {$('addfileinputbutton').disabled = 'disabled';}catch(e){}
	    ajaxRequest('storage/getFileInput', {onSuccess:Uploader.placeInput});
    },
    filekeys: new Array(),
    placeInput: function(key){
        try {$('addfileinputbutton').disabled = false;}catch(e){}
    	Uploader.filekeys.push(key);
    	var input	= document.createElement('input');
    	input.type = 'file';
    	input.name = 'newFiles[' + key + ']';
    	input.style.display = "block";
    	$('inputs').appendChild(input);
    	try{Element.show('uploadbutton');}catch(e){}
    },
    start: function(){
	    ajaxRequest('storageController/startUploading', {silent:true, postBody:'keys='+ Uploader.filekeys.join(), onSuccess:Uploader.startUploading, onError:ActionForm.close}); 
    },
    startUploading: function(){
        Element.hide('uploadfileform');
    	Element.show('progressbar');
    	$('uploadstatus').innerHTML = '';
    	$('progressmeter').style.width = "0%";
    	window.setTimeout("Uploader.pingFiles();", 2000);
    	$('uploadfileform').onsubmit();
    },
    onUploadFinished: function(){
    	Uploader.filekeys = new Array;
    	ActionForm.close();
    },
    pingFiles: function(){ 
    	ajaxRequest('storageController/pingFiles', {silent:true, postBody:'keys='+ Uploader.filekeys.join(), onSuccess:Uploader.analyzePing, onError:Uploader.onUploadFinished}); 
    },
    analyzePing: function(t){
    	var stat = t.substring(0,3);
    	var percents = t.substring(3,6);
    	var msg = t.substring(6);
    	switch(stat){
    		case 'Yes':
    			Uploader.onUploadFinished();
    			showStatus('Upload success!');
    			try {Actions.reloadFiles();}catch(e){}
    			break;
    		case 'No ':
    			$('uploadstatus').innerHTML = msg;
    			try{
    			$('progressmeter').style.width = percents + "%";
    			}catch(e){}
    			Uploader.pingFiles();
    			break;
    		default:
    			showError(t);
    			Uploader.onUploadFinished();
    			break;
    	}
    }
}
var AddressBook = {
    parentcontrolID: 'sharenotifyemails',
    show: function(event, parentcontrolID){
        var offset = Position.cumulativeOffset(Position.offsetParent($('adressbook')));
        $('adressbook').style.top    = parseInt(Event.pointerY(event)-2 - offset[1]) + 'px';
        $('adressbook').style.left   = parseInt(Event.pointerX(event)-2 - offset[0]) + 'px';
	    Element.show('adressbook');
	    if (parentcontrolID != undefined) AddressBook.parentcontrolID = parentcontrolID;
    },
    hide: function(){
        Element.hide('adressbook');
    },
    onClick: function(from){
	    var newmail = $(from).innerHTML;
	    if ($F(AddressBook.parentcontrolID) != '') newmail = $F(AddressBook.parentcontrolID) + ', ' + newmail;
	    $(AddressBook.parentcontrolID).value = newmail;
	    AddressBook.hide();
    },
    load: function(){
	    ajaxUpdate('adressbook', 'addressbook/get');
    }
}
var FilesCheckBoxes = {
    inputName: 'fileid[]',
    inputsDiv: 'files',
    classname: 'idcheckbox',
    changeStates: function(newStat){
    	var boxes = Element.getElementsByClassName(FilesCheckBoxes.inputsDiv, FilesCheckBoxes.classname);
    	boxes.each (function(node){
        		if (node.name != FilesCheckBoxes.inputName) return;
        		node.checked = newStat;
        	});
        	this.scan();
        },
    checkAll: function(){this.changeStates(true);},
    uncheckAll: function(){this.changeStates(false);},
    scan: function(){
    	var boxes = Element.getElementsByClassName(FilesCheckBoxes.inputsDiv, FilesCheckBoxes.classname);
    	var result = false;
    	boxes.each (function(node){
    	    if (node.name != FilesCheckBoxes.inputName) return;
    		result = result || node.checked;
    	});	
    },
    getChecked: function(state){
        var boxes = Element.getElementsByClassName(FilesCheckBoxes.inputsDiv, FilesCheckBoxes.classname);
        if (state == undefined) state = true;
        var result = new Array();
        var j=0;
        for(var i=0; i < boxes.length; i++){
    	    if (boxes[i].checked == state) result[j++] = boxes[i].value;
    	}
    	return result;
    }
}
var Actions = {
    currentFolder:0,
    tryToLoadFolder:0,
    currentFileId:0,
    getIDSasRequestString: function(items){
        var result = new Array();
    	for(var i=0; i < items.length; i++){
    	    result[i] = 'fileid[]=' + items[i];
    	}
    	return result.join('&');
    },
    getCheckedItems: function(){
        var items = FilesCheckBoxes.getChecked();
        if (items.length == 0) {
            showError('No items checked');
            return false;
        }
        return items;
    },
    loadFiles: function(id, nocache){
        if (nocache == undefined) nocache = false;
        if (Cashe.is('files'+id) && !nocache ){
            var obj = Cashe.get('files'+id);
            $('breadcrumbs').innerHTML = obj.path;
            Actions.currentFolder = id;
            Render.bindData(obj.filelist);
            Render.render();
        }else{
    	    overlayObject('files');
    	    Actions.tryToLoadFolder = id;
    	    ajaxRequest('storage/getFiletable', {postBody:'folder='+id, onSuccess:Actions.onLoadFiles, onError:overlayOff});
        }
    },
    onLoadFiles: function(t){
        Render.bindData(t.filelist);
        Render.render();
        Actions.currentFolder = Actions.tryToLoadFolder;
        overlayOff();
        $('breadcrumbs').innerHTML = t.path;
        Cashe.set('files'+Actions.currentFolder, t);
    },
    reloadFiles: function(){
        Cashe.remove('files' + Actions.currentFolder);
        loadFolderFiles(Actions.currentFolder);
    },
    deleteItem: function(id){
        if (!window.confirm(Dict.sure2delete)) return;
        overlayObject('files');
        ajaxRequest('storageController/delete', {silent:true,postBody:'fileid[]='+id, onSuccess:Actions.onDelete, onError:overlayOff});
    },
    deleteChecked: function(){
        if (!window.confirm(Dict.sure2delete)) return;
        var items = this.getCheckedItems();
        if (items == false) return; 
        var request = this.getIDSasRequestString(items);
        overlayObject('files');
        ajaxRequest('storageController/delete', {silent:true,postBody:request, onSuccess:Actions.onDelete, onError:overlayOff});
    },
    onDelete: function(t){
        Actions.onMove(t);
        Cashe.remove('foldersSelector');
        Subaccounts.loaded = false;
    },
    move: function(){
        var items = this.getCheckedItems();
        if (items == false) return; 
        var request = this.getIDSasRequestString(items);
        var moveTo = $('moveto').options[$('moveto').selectedIndex].value;
        Cashe.remove('files'+moveTo);
        ajaxRequest('storageController/move', {silent:true,postBody:request + '&moveto='+moveTo, onSuccess:Actions.onMove, onError:overlayOff});
    },
    onMove: function(t){
        ActionForm.close();
        try{
            for(var i = 0; i < t.length; i++){
                delete Render.list[t[i]];
            }
            Render.render();
            overlayOff();
        }catch(e){
            alert(e);
        }        
    },
    zip: function(){
        var items = this.getCheckedItems();
        if (items == false) return; 
        var request = this.getIDSasRequestString(items);
        overlayObject('files');
            ajaxRequest('storageController/zip', {silent:true,postBody:'folder='+Actions.currentFolder+'&'+request, onSuccess:Actions.reloadFiles, onError: overlayOff});
    },
    getEmbedCode: function(){
	    var items = this.getCheckedItems();
        if (items == false) return; 
        var request = this.getIDSasRequestString(items);	
	    open('embed?view=list&' +request);
	    FilesCheckBoxes.uncheckAll();
    },
    createFolder: function(){
        var toDescend = $('descendintofolder').checked;
        var onSuccess = Actions.onCreateFolder;
        if (toDescend) onSuccess = Actions.onCreateFolderAndDesend;
        ActionForm.close();
        overlayObject('files');
        ajaxRequest('storageController/createFolder', {silent:true,postBody:'folder='+Actions.currentFolder+'&newFolder='+$F('newFolderName'), onSuccess:onSuccess, onError:function(){overlayOff();ActionForm.close();}});        
    },
    onCreateFolder: function(){
        Actions.reloadFiles();
        Cashe.remove('foldersSelector');
    },
    onCreateFolderAndDesend: function(t){
        Cashe.remove('files' + Actions.currentFolder);
        Actions.loadFiles(t);
        Cashe.remove('foldersSelector');
    },
    loadFolderSelector: function(){
        if (!Cashe.is('foldersSelector')){
            ajaxUpdate('foldersselectorplaceholder', 'storage/getFoldersSelector', {onSuccess:function(t){Cashe.set('foldersSelector', t);} });
        }else{
            $('foldersselectorplaceholder').innerHTML = Cashe.get('foldersSelector');
        }
    },
    onShowRename: function(){
        Actions.currentFileId=PopupMenu.fileId;
        var filename = PopupMenu.getFileName();
        regex = /(.+)\..+$/;
        arr = regex.exec(filename);
        if (arr != null) filename = arr[1];
        $('newname').value= filename; 
    },
    rename: function(){
        ActionForm.close();
        ajaxRequest('storageController/rename', {postBody:'id=' + Actions.currentFileId + '&newname=' + $F('newname'), onSuccess: function(){ Actions.currentFileId=0;Actions.reloadFiles(); } });
    },
    onShowComments: function(){
        Comments.fileId = PopupMenu.fileId;
        ajaxUpdate('commentsbox', 'comments/getBox', {postBody:'id='+PopupMenu.fileId } );        
    },
    onShowMeta: function(){
        Actions.currentFileId = PopupMenu.fileId;
        Actions.fillAllTagsList();
        Actions.addTagProxyFunction = Actions.addTag;
        ajaxRequest('storageController/getMeta', {postBody:'id='+Actions.currentFileId, onSuccess:Actions.onGetMeta});
    },
    onGetMeta: function(t){
        $('itemdescription').value = t.descr;
        Tags.bindData(t.tags);
        Tags.render();
    },
    saveDescr: function(){
	    var d =  $('itemdescription').value;
	    ajaxRequest('storageController/saveDescription', {postBody:'id=' + Actions.currentFileId + '&text=' + d });
    },
    /**
     * TAGS
     */
    onShowTagToFewFiles: function(){
        Actions.addTagProxyFunction = Actions.tagItems;
        Actions.fillAllTagsList();
    },
    removeTag: function(tagId){
	    ajaxRequest('tags/removeTag', {postBody:'id=' + Actions.currentFileId + '&tag=' + tagId, onSuccess:Actions.onRemoveTag });
    },
    onRemoveTag: function(t){
        delete Tags.list[t];
        Tags.render();
    },
    addTagProxyFunction: function(){},
    tagItems: function(){
        var tag = $F('newtag');
	    var items = this.getCheckedItems();
            if (items == false) return; 
        var request = this.getIDSasRequestString(items);
        if (tag != ''){
            ActionForm.close();
            ajaxRequest('tags/addTagToFewFiles', {postBody:'commontag='+tag+'&'+request, onSuccess:Actions.onAddTagToFewFiles } );
        }
    },
    onAddTagToFewFiles: function(t){
        Organizer.loaded = false;
        Cashe.remove('taglist');
        FilesCheckBoxes.uncheckAll();
    },
    addTag: function(){
	    ajaxRequest('tags/addTag', {postBody:'id=' + Actions.currentFileId + '&tag=' + $F('newtag'), onSuccess:Actions.onAddTag });
	    return false;
    },
    onAddTag: function(t, param){
        Tags.list[t.id] = t;
        Tags.render();
        $('newtag').value = '';
        Organizer.loaded = false;
        Cashe.remove('taglist');
    },
	deleteTag: function(id, onSuccess){
	    if (!confirm(Dict.tagToBeDeleted)) return;
	},
	cleanupTags: function(){ ajaxRequest('tags/cleanup', {onSuccess:Actions.reloadTags}); },
	reloadTags: function(){ ajaxRequest('tags/getAllTagsList', {onSuccess: function(t){Cashe.set('taglist', t);Actions.fillAllTagsList();} }); },
	fillAllTagsList: function(){ 
	    if (Cashe.is('taglist')) {
	        try{ $('organizetagsholder').innerHTML = Cashe.get('taglist'); }catch(e){}
            try{ $('organizetagsholder_fewfiles').innerHTML = Cashe.get('taglist'); }catch(e){} 
        }else{
	        Actions.reloadTags();
	    } 
    },
	/**
	 * SHARE
	 */    
    onShowShare: function(){
        Actions.currentFileId = PopupMenu.fileId;
        var tpl = new Template($(ActionForm.contentId).innerHTML, /(^|.|\r|\n)(\{\$\s*(\w+)\s*\})/);
        var obj = Render.list[PopupMenu.fileId];
        var pass = obj.password;obj.password = '_'; // IE bug
        $(ActionForm.contentId).innerHTML = tpl.evaluate( obj );
        obj.password = pass;
        Actions.configureShareButtons(obj.shared);
        $('sharedataform').pass.value = obj.password; // IE bug;
        try{$('sharedataform').privateshare.checked = ( (obj.shared & 4) != 0);}catch(e){}
        try{$('sharedataform').paidperiod.selectedIndex = obj.paidperiod;}catch(e){}
        if (Organizer.publicAccess > 0){
        	$('privatesharebox').show();
        }else{
        	try{$('privatesharebox').hide();}catch(e){}
        } 
        var codeTabs = new TabControl('sharecodetabs', {callback: {onclick: Actions.onClickShareCodeTab } });
    },
    configureShareButtons: function(shared){
    	var sharedMasked = parseInt(shared & 3);
        var canbeDisabled = (sharedMasked > 0);
        var canbeEnabled = (sharedMasked == 0);
        var canbeUpdated = (shared != 0) && !canbeEnabled;
        if (canbeUpdated) Element.show('updateShareButton'); else Element.hide('updateShareButton'); 
        if (canbeDisabled) Element.show('disableShareButton'); else Element.hide('disableShareButton'); 
        if (canbeEnabled) Element.show('enableShareButton'); else Element.hide('enableShareButton');
        var sharedTitle;
        if (shared & 2) sharedTitle = Dict.share_inheritance;
        else sharedTitle = ((shared & 3) > 0)?Dict.share_on:Dict.share_off;
        $('sharedtitle').innerHTML = sharedTitle;
    },
    onClickShareCodeTab: function(id){
        Element.hide('url_code');
        Element.hide('linkcode_input');
        Element.hide('bblinks_input');
        Element.hide('bbthumbs_input');
        Element.show($(id).lang);
    },
    share: function(state){
        var action = 'storageController/'+ (state?'enable':'disable') + 'Share';
        var onSuccess = Actions.onSetShare;
        ajaxRequest(action, {postBody: Form.serialize('sharedataform') + '&ids[]=' + Actions.currentFileId, onSuccess: onSuccess} );
    },
    onSetShare: function(str){
    	Actions.shareLabelFX();
    	var response = str.evalJSON();
    	var id = response[0].id;
    	var shared = response[0].shared;
    	if (shared != Render.list[id].shared){
    		Cashe.remove('files' + id);
    	}
        Render.list[id].shared = shared;
        try{
            Render.list[id].paidperiod = $('sharedataform').paidperiod.selectedIndex;
            Render.list[id].price = $('sharedataform').price.value;
        }catch(e){}
        Render.list[id].password = $('sharedataform').pass.value;
        Render.render();
        $('sharenotifyemails').value = '';
        Actions.configureShareButtons(Render.list[id].shared);
    },
    shareLabelFX: function(){
    	new Effect.Morph('sharedtitle',{style:'background:#FFE8E8; color:#f00;',duration:0.6});
    	new Effect.Morph('sharedtitle',{style:'background:#fff; color:#000;', duration:1.2, queue:'end'});
    }
}
var ActionForm = {
    overlayId:'actionformoverlay',
    formId:'actionformholder',
    contentId:'actionform',
    show: function(contentid, options){
        if (options == undefined) options = {};
        if (options.onShowing != undefined){
            var toBeContinue = options.onShowing();
            if (!toBeContinue) return;
        }
        if (options.icon != undefined)
            $('actionformicon').src = 'img/' + options.icon;
        if (options.title != undefined)
            $('actionformtitle').innerHTML = options.title;
		Overlay.on();
        if (!Cashe.is(contentid)){
            Cashe.set(contentid, $(contentid).innerHTML);
            Element.remove(contentid);
        }
        $(ActionForm.contentId).innerHTML = Cashe.get(contentid);
        ActionForm.arrangeForm();
	    Event.observe(window, 'resize', ActionForm.resizeAndArrange);
	    Event.observe(window, 'scroll', ActionForm.arrangeOverlay);
        if (options.onShow != undefined){
            options.onShow();
        }
    },
    arrangeOverlay: function(){
	    var sizes = WindowUtilities.getPageSize();
	    $(ActionForm.overlayId).style.width	= sizes.windowWidth + 'px'; 
	    $(ActionForm.overlayId).style.height= sizes.windowHeight + 'px';
	    var offset = Position.cumulativeOffset(Position.offsetParent($(ActionForm.overlayId)));
	    var scroll = WindowUtilities.getPageScrolling();
	    $(ActionForm.overlayId).style.top	= parseInt(scroll.top - offset[1]) + 'px'; 
	    $(ActionForm.overlayId).style.left	= parseInt(scroll.left- offset[0]) + 'px';
    },
    arrangeForm: function(){
        Pos.centerObject(ActionForm.formId);
        Element.show(ActionForm.formId);
    },
    resizeAndArrange: function(){ActionForm.arrangeOverlay();ActionForm.arrangeForm();},
    close: function(){
        //Element.hide(ActionForm.overlayId);
        Overlay.off();
        Element.hide(ActionForm.formId);
        Event.stopObserving(window, 'resize', ActionForm.resizeAndArrange);
        Event.stopObserving(window, 'scroll', ActionForm.arrangeOverlay);
    }
}

var PopupMenu = {
    id: "popupmenu",
    fileId: 0,
    show: function(fileId, event){
        PopupMenu.fileId = fileId;
        $(PopupMenu.id).removeClassName('FOLDER');
        $(PopupMenu.id).removeClassName('FILE');
        $(PopupMenu.id).addClassName(Render.list[PopupMenu.fileId].type);
        Element.show(PopupMenu.id);
        var offset = Position.cumulativeOffset(Position.offsetParent($(PopupMenu.id)));
        $(PopupMenu.id).style.top    = parseInt(Event.pointerY(event)-4 - offset[1]) + 'px';
        $(PopupMenu.id).style.left   = parseInt(Event.pointerX(event)-4 - offset[0]) + 'px';
    },
    hide: function(){
        PopupMenu.fileId = 0;
        Element.hide(PopupMenu.id);
        PopupMenu.showing();
    },
    timerID: null,
    delay:300,
    hiding: function(){
        PopupMenu.timerID = setInterval("PopupMenu.hide();", PopupMenu.delay);
    },
    showing: function(){
        if (PopupMenu.timerID != null) clearInterval(PopupMenu.timerID);
    },
    getFileName: function(){
        return Render.list[PopupMenu.fileId].name;
    },
    getQuotedFilename: function(){
        return '"' + Render.list[PopupMenu.fileId].name + '"';
    }
}
var Organizer = {
    loaded: false,
    publicAccess:0,
    load: function(){
	    ajaxUpdate('organizePublicPage', 'PublicOrganizer/getHtml', 
		    {	onSuccess:function(){
		            try{
				    Organizer.loaded = true;
				    Organizer.createSortableList();
				    }catch(e){}
			    } 
			});
    },
	setAllFilesOption: function(state){
	    ajaxRequest('storage/setPublicAllFilesStatus', {onSuccess:Organizer.onSetAllFiles});
	},
	onSetAllFiles: function(value){
	    if (value == '1'){
	        new Insertion.Top('tagslistshared', '<li id="showallfilesli">SHOW ALL FILES</li>');
	        Organizer.createSortableList();
	    }else{
            $('showallfilesli').remove();
        }
	},
	tagOnTopOfList:0,
	updateDefaultTagSelector: function(){
	    var tags = $('tagslistshared').childNodes;
	    var selector = $('defaultTagSelector');
	    var id = 0;
	    var html = '';
	    for (var i=0; i< tags.length; i++){
	        if (tags[i].id.substr(0,4) == 'tag_'){
    	        id = tags[i].id.substr(4);
	        }else{
	            id = 0;
	        }
	        html += '<option value="' + tags[i].id + '">' + tags[i].textContent + '</option>';	        
	    }
	    $('defaultTagSelector').innerHTML = html;
	},
	setPublicAccess: function(type){
	    ajaxRequest('storage/setPublicAccess', {postBody:'type='+type, onSuccess: Organizer.onSetSharedAccess});
	    Organizer.load();
	},
	onSetSharedAccess: function(t){
		Organizer.publicAccess = t;
		if (t > 0){
			eval ("var str = Dict.publicAccess" + t);
			$('sharemodereminder').innerHTML = str;
			$('sharemodereminder').show();
		}else{
			$('sharemodereminder').hide();
		}
	},
	shareTag: function(li, id){
	    Organizer.destroySortableList();
	    var ul = li.parentNode;	    
	    var sharing = (ul.id == 'tagslistunshared');
	    ul.removeChild(li);
	    var newULname = sharing?'tagslistshared':'tagslistunshared';
        $(newULname).appendChild(li);
        if (!sharing) Event.observe(li, "onmousedown", disableSelection);
        else Event.stopObserving(li, "onmousedown", disableSelection);
        Organizer.createSortableList();
        //Organizer.updateDefaultTagSelector();
	    ajaxRequest('tags/' + (sharing?'publicTags':'unpublicTags'), {postBody:'tags='+id, onSuccess:Organizer.updateTagOrder});
	},
	deleteTag: function(a, id){
	    if (!confirm(Dict.tagToBeDeleted)) return;
	    ajaxRequest('tags/delete', {postBody:'id='+id, onSuccess:function(){a.parentNode.remove();} });
	},
	_slist:null,
	createSortableList: function(){
	    Sortable.create("tagslistshared", {dropOnEmpty:true});
	    Droppables.add('droppabletagdefault', { 
            hoverclass: 'hover',
            accepted: 'sharedtag',
            onDrop: function(tag) { 
           	    var tagId = 0;
                $('defaulttagtext').innerHTML = tag.innerHTML;
	            if (tag.id.substr(0,4) == 'tag_'){
	                tagId = tag.id.substr(4);
                    if (tagId != Organizer.tagOnTopOfList){
                        Organizer.tagOnTopOfList = tagId;
                        ajaxRequest('publicpages/setDefaultTag', {postBody:'id='+tagId});
                    }
	            }else{
	                ajaxRequest('publicpages/setDefaultTag', {postBody:'id=0'});
	            }
            }
        });
	},
	destroySortableList: function(){
	    Sortable.destroy("tagslistshared");
	}
}

var Subaccounts = {
    loaded: false,
    id: 'subaccountstable',
    getList: function(){
        if (!Subaccounts.loaded) Subaccounts.load();
    },
    load: function(){
        ajaxUpdate(Subaccounts.id, 'Subaccounts/getList', {onSuccess:function(){Subaccounts.loaded = true;} });
    },
    onCreate: function(t){
        $('createsubaccountform_step1').innerHTML = t;
        Subaccounts.loaded = false;
    }
}

function disableSelection(event){ Event.stop(event);}
