function bindPageEvents(scope)
{
    $('.edit-button', scope).each(function () {
        var icon = $(this).attr('icon') ? 'ui-icon-' + $(this).attr('icon') : null;
        $(this).button({icons: {primary: icon}});
        
    });
    
    /*
    $('.dialog-action', scope).submit(function () {
        liveDialog($(this).attr('action'), {width: 640, height: 480, title: $(this).attr('title')});
        return false;
    });
    */
    $('.edit-sort-button', scope).click(function () {
        liveDialog($(this).closest('form').attr('action'),
                   {
                    width: 640,
                    height: 480,
                    title: 'Sorting',
                    method: $(this).closest('form').attr('method') || 'get',
                    buttonName: $(this).attr('name')
                    });
        return false;    
    });

    $('.edit-move-button', scope).click(function () {
        liveDialog($(this).closest('form').attr('action'),
                   {
                    width: 640,
                    height: 480,
                    title: 'Move',
                    method: $(this).closest('form').attr('method') || 'get',
                    buttonName: $(this).attr('name'),
                    data: $(this).closest('form').serialize()
                    });
        return false;    
    });
    
    $('.edit-remove-button', scope).click(function () {
        liveDialog($(this).closest('form').attr('action'),
                   {
                    width: 640,
                    height: 480,
                    title: 'Delete',
                    method: $(this).closest('form').attr('method') || 'get',
                    buttonName: $(this).attr('name'),
                    data: $(this).closest('form').serialize()
                    });
        return false;    
    });
    
    $('.edit-add-photos-button', scope).click(function () {
        liveDialog($(this).closest('form').attr('action'),
                   {
                    width: 640,
                    height: 480,
                    title: 'Add Photos',
                    method: $(this).closest('form').attr('method') || 'get',
                    data: $(this).closest('form').serialize()
                    });
        return false;    
        
    });
    
    $('.edit-multi-upload').ezmultiupload({});
    
    $('.subnav-toggle', scope).button({icons:{primary: 'ui-icon-triangle-1-s'}});
    $('.subedit', scope).mouseenter(function () { $('.subnav',this).show(); });
    $('.subedit', scope).mouseleave(function () { $('.subnav',this).hide(); });

    $('.sortable', scope).sortable();
    $('.sortable', scope).disableSelection();
    
    if($('#ezwt-sort-form', scope))
    {
        resortList($('#ezwt-sort-form', scope));
    }
    
    $('#ezwt-sort-form .save-button',scope).click(function () {
        var form = $(this).closest('form'),
            sortMethod = $('.sort-method-dropdown', form),
            sortList=$('.sortable', form),
            sortVals = sortList.sortable('toArray'),
            data = null;
        
        //If sortmethod is manual, update priorities before sending
        if(sortMethod.val() === '8') // 8 = priority sorting
        {
            $('li', sortList).each(function (i) {
                var val = $(this).attr('id'),
                    priorityId = $('<input type="hidden" name="PriorityID[]" value="' + val.substr(4) + '" />'),
                    priority = $('<input type="hidden" name="Priority[]" value="' + ((i+1) * 10) + '" />');
                $(form).append(priority);
                $(form).append(priorityId);
            });
            
            data = form.serialize();
            data = data + '&UpdatePriorityButton=1';
            
            $.ajax({
                type: 'post',
                data: data,
                dataType: 'html',
                url: form.attr('action'),
                success: function (data) {
                    $(form).append($('<input type="hidden" name="SetSorting" value="1" />'));
                    form.trigger('submit');
                }
            });            
            
            return false;
        }
        
        $(form).append($('<input type="hidden" name="SetSorting" value="1" />'));

        return true;
        
    });
    
    $('.sort-method-dropdown, .sort-order-dropdown', scope).change(function () { resortList($(this).closest('form')); });

    $('fieldset.ezcca-collapsible legend a', scope).click( function()
    {
		var container = $( this.parentNode.parentNode ), inner = container.find('div.ezcca-collapsible-fieldset-content');
		if ( container.hasClass('ezcca-collapsed') )
		{
			container.removeClass('ezcca-collapsed');
			$('.ui-accordion-header', container).addClass('ui-state-active ui-corner-top');
			$('.ui-accordion-header', container).removeClass('ui-corner-all ui-state-default');
            $('.ui-accordion-content', container).addClass('ui-accordion-content-active');
			inner.slideDown( 150 );
	    }
		else
		{
			inner.slideUp( 150, function(){
            	$( this.parentNode ).addClass('ezcca-collapsed');
                $('.ui-accordion-header', this.parentNode).addClass('ui-state-default ui-corner-all');
                $('.ui-accordion-header', this.parentNode).removeClass('ui-corner-top ui-state-active');
                $('.ui-accordion-content', this.parentNode).removeClass('ui-accordion-content-active');

            });
        }
    });
    // Collapse by default
    $('fieldset.ezcca-collapsible', scope).addClass('ezcca-collapsed').find('div.ezcca-collapsible-fieldset-content').hide();


    
    $('.ezdateinput', scope).datepicker({
        showOtherMonths: true,
        selectOtherMonths: true,
        changeMonth: true,
        changeYear: true,
        beforeShow: function(input, inst){
            var dateBlock=$(inst.input).closest('.ezdate'),
                dayElem=$('.ezday', dateBlock),
                monthElem=$('.ezmonth', dateBlock),
                yearElem=$('.ezyear', dateBlock),
                setDate = new Date(monthElem.val() + '/' + dayElem.val() + '/' + yearElem.val());

            return {defaultDate: setDate};
        },
        onSelect: function(dateText, inst){
            var dateParts=dateText.split('/'),
                dateBlock=$(inst.input).closest('.ezdate'),
                dayElem=$('.ezday', dateBlock),
                monthElem=$('.ezmonth', dateBlock),
                yearElem=$('.ezyear', dateBlock),
                hourElem=$('.ezhour', dateBlock),
                minuteElem=$('.ezminute', dateBlock);

            dayElem.val(dateParts[1]);
            monthElem.val(dateParts[0]);
            yearElem.val(dateParts[2]);
            if(!hourElem.val())
            {
                hourElem.val('00');
            }
            if(!minuteElem.val())
            {
                minuteElem.val('00');
            }
        }
    });
    
}

function resortList(form)
{
    var sortMethod = $('.sort-method-dropdown', form),
        sortOrder = $('.sort-order-dropdown', form),
        sortHelp = $('.sort-help', form),
        sortList = $('.sortable', form),
        sortOrderVal = sortOrder.val() == '0' ? -1 : 1;
        tmpSort = [];
        
    
    switch(sortMethod.val())
    {
        case '9': //Sort by name
            $('li', sortList).each(function (i){
                tmpSort.push($(this).detach());
            });
            tmpSort = tmpSort.sort(function(a, b) {
                if (a.text() < b.text())
                {
                    return -1 * sortOrderVal;
                }
                else
                {
                    return 1 * sortOrderVal;
                }
            });
            $.each(tmpSort, function (i, elem) {
                sortList.append(elem);
            });
            sortList.sortable('refresh');
            sortHelp.css('visibility', 'hidden');
            sortList.sortable('disable');
            sortOrder.show();
        break;
        case '8':
            sortHelp.css('visibility', 'visible');
            sortList.sortable('enable');
            sortOrder.hide();
        break;
    }
}


function liveDialog(url, options)
{
//    /layout/set/dialog/
    var dlg = $('<div class="dialog-container" style="display: none"></div>'),
        data = options.data || {};
        
    if(options.buttonName)
    {
        data = data + '&' + options.buttonName + '=1';
    }
    
    $(document).append(dlg);
    
    $.ajax({
        type: options.method || 'get',
        data:  data,
        dataType: 'html',
        url: '/layout/set/dialog' + url,
        success: function(data, status) {
            dlg.html(data);
            dlg.dialog(options);
            bindDialogEvents(dlg);
            bindPageEvents(dlg);
        }
    });
    
    /*
    dlg.load('/layout/set/dialog' + url, {}, function (data){
        bindDialogEvents(dlg);
        dlg.dialog(options);
        bindPageEvents(dlg);
    });
    */
    
}

function bindDialogEvents(dlg)
{
    //Hijack form submissions
    $('form',dlg).submit(function(){
        var data = $(this).serialize(),
            form = $(this);
        //data = data + '&SetSorting=Set';
        $.ajax({
            type: $(this).attr('method'),
            data: data,
            dataType: 'html',
            url: $(this).attr('action'),
            success: function (data) {
                if(data.redirect)
                {
                    dlg.load(data.redirect, {}, function (data){
                        bindDialogEvents(dlg);
                        bindPageEvents(dlg);
                    });
                }
                else
                {
                    form.trigger('dialogFormComplete', [data]);
                    if(form.hasClass('close-on-complete'))
                    {
                        dlg.dialog('close');
                    }
                    else
                    {
                        dlg.html(data);
                        bindDialogEvents(dlg);
                        bindPageEvents(dlg);
                    }
                    
                }
            }
        });
            
        return false;
    });
    
    //Hijack links
    $('a',dlg).click(function () {
        $.ajax({
            type: 'get',
            dataType: 'html',
            url: $(this).attr('href'),
            success: function (data) {
                if(data.redirect)
                {
                    dlg.load(data.redirect, {}, function (data){
                        bindDialogEvents(dlg);
                        bindPageEvents(dlg);
                    });                    
                }
                else
                {
                    dlg.html(data);
                    bindDialogEvents(dlg);
                    bindPageEvents(dlg);
                }
            }
        });
        
        
        return false;
    });
    
    $('.cancel-button', dlg).click(function () {
        dlg.dialog('close');
        return false;
    });
    
    $('.remove-form', dlg).bind('dialogFormComplete', function (ev, data){
        var parts = window.location.toString().split('/'),
            newUrl = null;
        //Move the location up one level.
        parts.pop();
        newUrl = parts.join('/');
        window.location = newUrl;
        
    });
    
}

$(document).ready(function () {
    bindPageEvents(document);
});

jQuery.fn.ezmultiupload = function (opts) {
    var swfUrl = opts.swfUrl || null,
        uploadUrl = opts.uploadUrl || null,
        postVars = opts.postVars || {},
        formPostVars = $('.post-var', this),
        swfInstance = null,
        button = $('.edit-upload-button', this)[0],
        doneButton = $('.done-button', this),
        thumbnailArea = $(opts.thumbnailArea || '.edit-thumbnails', this),
        progressArea = $(opts.progressArea || '.edit-progress-indicator', this),
        elem = null;
    
    if(!this || this.length == 0)
    {
        return;
    }
    
    if(!swfUrl)
    {
        swfUrl = $('.swf-url', elem).val();
    }
    if(!uploadUrl)
    {
        uploadUrl = $('.upload-url', elem).val();
    }
    
    $.each(formPostVars, function (i, elem){
        postVars[$(elem).attr('name')]=$(elem).val();
        //swfInstance.addPostParam($(elem).attr('name'), $(elem).val());
    });

    doneButton.hide();
    doneButton.click(function () { window.location.reload(true); return false; });


    elem = $(this).swfupload({
        upload_url: uploadUrl,
        file_post_name: 'Filedata',
        file_types: '*.jpg;*.png;*.gif',
        file_types_description: 'Images',
        flash_url: swfUrl,
        button_placeholder: $('.upload-button-overlay', elem)[0],
        button_width: $(button).width(),
        button_height: $(button).height(),
        post_params: postVars,
        button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT
        
    });

    swfInstance = $.swfupload.getInstance(elem);
    
    /*
    console.log('postvars');
    $.each(postVars, function (key, val) {
        swfInstance.addPostParam(key, val);        
    });
    
    console.log('formpostvars');
    $.each(formPostVars, function (i, elem){
        swfInstance.addPostParam($(elem).attr('name'), $(elem).val());
    });
    console.log('bind');
    */
    
    elem.bind('fileQueued', function (ev, file) {
        var html = '',
            status = null;
            
            html = '<div class="upload-status" id="edit_status_' + file.id + '">';
            html += '<em>' + file.name + '</em> (' + Math.round(file.size/1024) + ' KB)';
            html += '<div class="progress-bar"></div>';
            html += '<div class="thumbnail"></div>';
            html += '</div>';
            
        console.log('file queued');
            
        status = $(html);
        
        progressArea.append(status);
        
        $('.progress-bar',status).progressbar();
        $('.progress-bar',status).progressbar('value',0);
        
        $(this).swfupload('startUpload');
        
    });
    
    elem.bind('fileDialogComplete', function(event, numFilesSelected, numFilesQueued){
        console.log('file dialog complete');
        //$(this).swfupload('startUpload');
    });

    elem.bind('fileQueueError', function(event, file, errorCode, message){
		console.log('QUEUE ERROR: ' + message);
        console.log(file);
	});

    elem.bind('uploadStart', function(event, file){
        console.log('Upload Start');
	});
    
    elem.bind('uploadSuccess', function (event, file, serverData) {
        var progress = $('#edit_status_' + file.id + ' .progress-bar', elem),
            thumbspace = $('#edit_status' + file.id + ' .thumbnail', elem),
            result = $.parseJSON(serverData);
        progress.progressbar('value', 100);
        progress.progressbar('disable');
        
        console.log('Upload Success');
        console.log($(result.data));
        thumbspace.append($(result.data));
    });
    
    elem.bind('uploadProgress', function (ev, file, bytesLoaded){
        var pct = Math.round((bytesLoaded/file.size) * 100),
            progress = $('#edit_status_' + file.id + ' .progress-bar', elem);

        console.log('progress: ' + pct);
        
        progress.progressbar('value', pct);
    });
    
    elem.bind('uploadComplete', function (ev, file) {
        console.log('upload complete');
        $(this).swfupload('startUpload');
        doneButton.show();
    });
    
        
    return elem;
};

/*
$.fn.button = function () {};
$.fn.sortable = function () {};
$.fn.datepicker = function () {};
*/
