// http://docs.jquery.com/Plugins

(function(){

var dolls = window.dolls || {};

$.extend(dolls, {
    init : function() {
    },
    urls : {
        'contacts'                  : '/contacts/',
        'settings'                  : '/settings/',
        'settings_update'           : '/settings/update/',
        'settings_mail'             : '/settings/mail/',
        'account_new_confirm'       : '/account/new/confirm/',
        'account_new_register'      : '/account/new/register/',
        'accounts_edit'             : '/accounts/edit/',
        'account_update'            : '/account/update/',
        'account_delete'            : '/account/delete/',
        'channels'                  : '/channels/',
        'channel_sync'              : '/channel/sync/',
        'channel_ping_update'       : '/channel/ping/update/',
        'channel_settings'          : '/channel/settings/',
        'channel_settings_update'   : '/channel/settings/update/',
        'documents'                 : '/documents/',
        'document'                  : '/document/',
        'document_update'           : '/document/update/',
        'document_edit'             : '/document/edit/',
        'document_delete'           : '/document/delete/',
        'document_categories'       : '/document/categories/',
        'document_options'          : '/document/options/',
        'document_trackbacks'       : '/document/trackbacks/',
        'postgroup_add'             : '/postgroup/add/',
        'postgroup_new'             : '/postgroup/new/',
        'postgroup_edit'            : '/postgroup/edit/',
        'postgroup_view'            : '/postgroup/',
        'postgroup_update'          : '/postgroup/update/',
        'postgroup_delete'          : '/postgroup/delete/',
        'affiliate_search'          : '/affiliate/search/'
    },
    progressbars : [],
    dialogs : [],

    getMessage: function(key) {
        if (!this.msg_resources) {
            // TODO(valだと取れないケースがある？)
            var resources = $('#resources_message_js').html();
            this.msg_resources = eval('(' + resources + ')');
        }
        var args = {};
        if (arguments.length > 1) {
            for (var i = 1, j = 0; i < arguments.length; i++, j++) {
                args['arg' + j] = arguments[i];
            }
        }
        return this.msg_resources[key].process(args);
    },
    getServiceInfo : function(key){
        if (!this.services_resources) {
            var resources = $('#resources_services_js').val();
            this.services_resources = eval('(' + resources + ')');
        }
        for(var i = 0; i < this.services_resources.length; i++ )
        {
            service = this.services_resources[i];
            if( service['key'] == key ) return service;
        }
        return null;
    },
    showAjaxError : function(event, request, settings) {

        while(true)
        {
            var dialog = dolls.dialogs.pop();
            if(dialog)
            {
                dialog.hide();
            }
            else
            {
                break;
            }
        }

        var msg = $('#template_ajaxError').val();
        var closeHandler = function() {
            this.hide();
        };
        var dialog = new YAHOO.widget.SimpleDialog('error', {
            width: '400px',
            fixedcenter: true,
            visible: false,
            draggable: false,
            modal: true,
            close: true,
            text: msg,
            icon: YAHOO.widget.SimpleDialog.ICON_WARN,
            constraintoviewport: true,
            buttons: [
                {text: dolls.getMessage('button.close'),
                 handler: closeHandler,
                 isDefault: true}
            ]
        });
        dialog.setHeader(dolls.getMessage('title.error'));
        dialog.render(document.body)
        dialog.show();
    },
    showApplicationError: function(json) {
        var args = eval('(' + json + ')');
        var msg = $('#template_applicationError').val().process(args);
        var closeHandler = function() {
            this.hide();
        };
        var dialog = new YAHOO.widget.SimpleDialog('error', {
            width: '320px',
            fixedcenter: true,
            visible: false,
            draggable: false,
            modal: true,
            close: true,
            text: msg,
            icon: YAHOO.widget.SimpleDialog.ICON_WARN,
            constraintoviewport: true,
            buttons: [
                {text: dolls.getMessage('button.close'),
                 handler: closeHandler,
                 isDefault: true}
            ]
        });
        dialog.render(document.body);
        dialog.show();
    },
    showProgress : function(msg_id)
    {
        var msg = this.getMessage(msg_id);
        var test = $('#template_progress').val().process({'msg':msg});
        var dialog = new YAHOO.widget.SimpleDialog('progress', {
            width: '320px',
            fixedcenter: true,
            visible: false,
            draggable: false,
            modal: true,
            close: false,
            text: test,
            constraintoviewport: true,
            buttons: []
        });
        dialog.render(document.body);
        dialog.show();
        return dialog;
    },
    confirmMsgBox : function(msg, handler)
    {
        msg = $('#template_msgbox').val().process({'msg':msg});
        var dialog = new YAHOO.widget.SimpleDialog('success', {
            width: '320px',
            fixedcenter: true,
            visible: false,
            draggable: false,
            modal: true,
            close: false,
            text: msg,
            icon: YAHOO.widget.SimpleDialog.ICON_INFO,
            constraintoviewport: true,
            buttons: [
                {text: dolls.getMessage('button.ok'),
                 handler: handler,
                 isDefault: true}
            ]
        });
        dialog.render(document.body)
        dialog.show();
    },
    escapeHtml : function(text)
    {
        return text.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    },
    isDoKeyEvent : function( event )
    {
        var code = event.charCode ? event.charCode : event.keyCode;
        if( ( code==13 ) || ( code==3 ) )
        {
            return true;
        }
        return false;
    },
    post : function(url, query, callback)
    {
        var dummy = new Date().getTime();
        if(query == null) query = ''
        if(query.length > 0)
        {
            query +='&';
        }
        query += ('dummy='+dummy);
        $.post(url, query, callback);
    }
});

dolls.Window = 
{
    popup : function(e, offsetx, offsety, url, title, opts)
    {
        var x = null;
        var y = null;
        if( document.all )
        {
            if( window.event )
            {
                x = window.event.screenX;
                y = window.event.screenY;
                x += offsetx;
                y += offsety;
                p = ",left=" + x + ",screenX=" + x + ",top=" + y + ",screenY=" + y;
                opts += p;
            }
        }
        else if( document.layers || document.getElementById )
        {
            if( e )
            {
                x = e.screenX;
                y = e.screenY;
                x += offsetx;
                y += offsety;
                p = ",left=" + x + ",screenX=" + x + ",top=" + y + ",screenY=" + y;
                opts += p;
            }
        }
        var w = window.open( url, title, opts );
        w.focus();
    },
    popup2 : function(form, e, offsetx, offsety, url, title, opts)
    {
        var form = $(form);
        this.popup(e, offsetx, offsety, url, title, opts);
        form.target = title;
        form.submit();
    },
    close : function()
    {
        window.opener = window;
        var w = window.open( location.href, "_self" );
        w.close();
    }
}

dolls.OrderSelector = {
    whiteSpace: String.fromCharCode(160),
    //すべての選択肢の状態変更
    selectAll: function(element, selected) {
        var options = element.options;
        for (var i = options.length - 1; i >= 0; i--) {
            var option = options[i];
            if (option.text != this.whiteSpace && option.value != '') {
                option.selected = selected;
            }
        }
    },
    //選択肢の状態変更
    select: function(element, values, selected) {
        var options = element.options;
        for (var i = options.length - 1; i >= 0; i--) {
            for (var j = values.length - 1; j >= 0; j--) {
                if (options[i].value == values[j]) {
                    options[i].selected = selected;
                    delete values[j];
                    break;
                }
            }
        }
    },
    selectByOption: function(element, option, selected) {
        var options = element.options;
        for (var i = 0; i < options.length; i++) {
            if (options[i].value == option.value) {
                options[i].selected = selected;
                break;
            }
        }
    },
    getFirstSelected: function(element) {
        var options = element.options;
        for (var i = 0; i < options.length; i++) {
            var option = options[i];
            if (option.text != this.whiteSpace && option.value != '' &&
                option.selected ) {
                return option;
            }
        }
        return null;
    },
    getSelectedList: function(element) {
        var options = element.options;
        var selected = [];
        for (var i = 0; i < options.length; i++) {
            var option = options[i];
            if (option.text != this.whiteSpace && option.value != '' &&
                option.selected) {
                selected[j] = option;
            }
        }
        return selected;
    },
    //削除
    remove: function(element) {
        var options = element.options;
        for (var i = options.length - 1; i >= 0; i--) {
            if (options[i].selected) {
                options[i] = null;
            }
        }
        if (options.length == 0) {
            options[0] = new Option(this.whiteSpace, '');
            return true;
        }
        return false;
    },
    //先頭に移動
    orderTop: function(element) {
        var options = element.options;
        if (options.length == 0) {
            return;
        }
        if (options[0].selected) {
            return;
        }
        var selections = [];
        var others = [];
        for (var i = options.length - 1; i >= 0; i--) {
            var option = options[i];
            if (option.selected) {
                selections.push({text: option.text, value: option.value});
            } else {
                others.push({text: option.text, value: option.value});
            }
            options[i] = null;
        }
        var j = 0;
        for (var i = selections.length - 1; i >= 0; i--, j++) {
            var selection = selections[i];
            options[j] = new Option(selection.text, selection.value);
            options[j].selected = true;
        }
        for (var i = others.length - 1;i >= 0; i--, j++) {
            var other = others[i];
            options[j] = new Option(other.text, other.value);
        }
    },
    //末尾に移動
    orderBottom: function(element) {
        var options = element.options;
        if (options.length == 0) {
            return;
        }
        if (options[options.length - 1].selected) {
            return;
        }
        var selections = [];
        var others = [];
        for (var i = options.length - 1; i >= 0; i--) {
            var option = options[i];
            if (option.selected) {
                selections.push({text: option.text, value: option.value});
            } else {
                others.push({text: option.text, value: option.value});
            }
            options[i] = null;
        }
        var j = 0;
        for (var i = others.length - 1;i >= 0; i--, j++) {
            var other = others[i];
            options[j] = new Option(other.text, other.value);
        }
        for (var i = selections.length - 1; i >= 0; i--, j++) {
            var selection = selections[i];
            options[j] = new Option(selection.text, selection.value);
            options[j].selected = true;
        }
    },
    //上に移動
    orderUp: function(element) {
        var options = element.options;
        if (options.length == 0) {
            return;
        }
        if (options[0].selected) {
            return;
        }
        var selections = [];
        var others = [];
        var prevOption = null;
        for (var i = 0; i < options.length; i++) {
            var option = options[i];
            var text = option.text;
            var value = option.value;
            if (option.selected) {
                if (prevOption == null) {
                    break;
                }
                options[i - 1] = new Option(option.text, option.value);
                options[i - 1].selected = true;
                options[i] = new Option(prevOption.text, prevOption.value);
                text = prevOption.text;
                value = prevOption.value;
            }
            prevOption = {text: text, value: value};
        }
    },
    //下に移動
    orderDown: function(element) {
        var options = element.options;
        if (options.length == 0) {
            return;
        }
        if (options[options.length - 1].selected) {
            return;
        }
        var selections = [];
        var others = [];
        var prevOption = null;
        for (var i = options.length - 1; i >= 0; i--) {
            var option = options[i];
            var text = option.text;
            var value = option.value;
            if (option.selected) {
                if (prevOption == null) {
                    break;
                }
                options[i + 1] = new Option(option.text, option.value);
                options[i + 1].selected = true;
                options[i] = new Option(prevOption.text, prevOption.value);
                text = prevOption.text;
                value = prevOption.value;
            }
            prevOption = {text: text, value: value};
        }
    },
    initialize: function(element) {
        var options = element.options;
        if (options.length == 0) {
            options[0] = new Option(this.whiteSpace, '');
        }
    },
    //移動
    moveTo: function(dst, src, noDuplicate, withDummy) {
        var options = src.options;
        var selections = [];
        var existIdSet = {};
        for (var i = options.length - 1, j = 0; i >= 0; i--) {
            var option = options[i];
            if (option.selected) {
                if (option.text == this.whiteSpace && option.value == '') {
                    options[i].selected = false;
                } else {
                    selections[j++] = {text: option.text, value: option.value};
                    options[i] = null;
                }
            }
        }
        this.initialize(src);
        if (selections.length > 0) {
            options = dst.options;
            for (var i = options.length - 1; i >= 0; i--) {
                var option = options[i];
                if (option.text == this.whiteSpace && option.value == '') {
                    options[i] = null;
                } else {
                    existIdSet[option.value] = true;
                }
            }
            for (var i = selections.length - 1, j = options.length; i >= 0; i--, j++) {
                var selection = selections[i];
                if( noDuplicate && existIdSet[selection.value] == true ) continue;
                options[j] = new Option(selection.text, selection.value);
                options[j].selected = true;
            }
            if (withDummy) {
                options[j] = new Option(this.whiteSpace, '');
            }
        }
    },
    duplicate: function(dest, src, clean) {
        if (clean) {
            var options = dest.options;
            for (var i = options.length - 1; i >= 0; i--) {
                options[i] = null;
            }
        }
        var options = src.options;
        for (var i = options.length - 1; i >= 0; i-- ) {
              dest.options[i] = new Option(options[i].text, options[i].value);
              dest.options[i].selected = options[i].selected;
        }
    },
    copyTo: function(dst, src, noDuplicate) {
        var options = src.options;
        var selections = [];
        var selectIdMap = {};
        for (var i = options.length - 1, j = 0; i >= 0; i--) {
            var option = options[i];
            if (option.selected) {
                if (option.text != this.whiteSpace && option.value != '') {
                    selections[j] = {text: option.text, value: option.value};
                    selectIdMap[option.value] = j;
                    j++;
                }
            }
        }
        if (selections.length > 0) {
            options = dst.options;
            for (var i = options.length - 1; i >= 0; i--) {
                var option = options[i];
                if (option.text == this.whiteSpace && option.value == '') {
                    options[i] = null;
                }else if (noDuplicate && typeof(selectIdMap[option.value]) != 'undefined') {
                    selections[selectIdMap[option.value]] = null;
                }
            }
            for (var i = selections.length - 1, j = options.length; i >= 0; i--) {
                var selection = selections[i];
                if (selection != null) {
                    options[j] = new Option(selection.text, selection.value);
                    options[j].selected = true;
                    j++;
                }
            }
        }
    },
    //オブジェクト化
    toObject: function(element, hashes, callback) {
        if (typeof(hashes) == 'undefined') {
            hashes = {length: 0};
        }
        var options = element.options;
        for (var i = 0; i < options.length; i++) {
            var option = options[i];
            if (option.text && option.value) {
                var o =
                {
                    text: option.text,
                    value: option.value
                }
                if( typeof(callback) != 'undefined' )
                {
                    o = callback(o);
                }
                hashes[hashes.length++] = o;
            }
        }
        return hashes;
    },
    toObjectSelected: function(element, hashes, callback) {
        if (typeof(hashes) == 'undefined') {
            hashes = {length: 0};
        }
        var options = element.options;
        for (var i = 0; i < options.length; i++) {
            var option = options[i];
            if (option.text && option.value && option.selected) {
                var o =
                {
                    text: option.text,
                    value: option.value
                }
                if( typeof(callback) != 'undefined' )
                {
                    o = callback(o);
                }

                hashes[hashes.length++] = o;
            }
        }
        return hashes;
    },
    prepareSubmit: function(element, withDummy) {
        var options = element.options;
        for (var i = options.length - 1; i >= 0; i--) {
            var option = options[i];
            if (option.text == this.whiteSpace && option.value == '') {
                if (withDummy) {
                    options[i].selected = false;
                } else {
                    options[i] = null;
                }
            } else if (option) {
                option.selected = true;
            }
        }
    },
    clear: function(element) {
        var options = element.options;
        for (var i = options.length - 1; i >= 0; i--) {
            if (options[i]) {
                options[i] = null;
            }
        }
        if (options.length == 0) {
            options[0] = new Option(this.whiteSpace, '');
        }
    },
    add: function(element, hashes) {
        if (hashes == null || hashes.length == 0) {
            return;
        }
        var options = element.options;
        for (var i = options.length - 1; i >= 0; i--) {
            if (options[i].text == this.whiteSpace && options[i].value == '') {
                options[i] = null;
            }
        }
        for (var i = 0, j = options.length; i < hashes.length; i++, j++) {
            if (hashes[i].text != this.whiteSpace && hashes[i].value != '') {
                options[j] = new Option(hashes[i].text, hashes[i].value);
            }
        }
    },
    //選択肢数の取得
    count: function(element) {
        var options = element.options;
        var count = 0;
        for (var i = 0; i < options.length; i++) {
            var option = options[i];
            if (option.text != this.whiteSpace && option.value != '') {
                count++;
            }
        }
        return count;
    },
    countSelected: function(element) {
        var options = element.options;
        var count = 0;
        for (var i = 0; i < options.length; i++) {
            var option = options[i];
            if (options.text != this.whiteSpace && option.value != '' &&
                option.selected) {
                count++;
            }
        }
        return count;
    }
};

dolls.Index = 
{
    accountNodeMap : {},
    postgroupNodeMap : {},
    sendMobileMail : function()
    {
        /*
        var callback = function(html, status){
        }
        */
        var query = $('#settingForm').serialize();
        dolls.post(dolls.urls.settings_mail, query, null);
    },
    useApi : function()
    {
        var checked = $('#settings-use-api').attr('checked');
        if(checked)
        {
            $('#settings-password').attr('disabled', false);
            $('#settings-mobile-address').attr('disabled', false);
            $('#settings-mobile-address-send').attr('disabled', false);
        }
        else
        {
            $('#settings-password').attr('disabled', true);
            $('#settings-mobile-address').attr('disabled', true);
            $('#settings-mobile-address-send').attr('disabled', true);
        }
    },
    deleteAccountTreeNode : function(key)
    {
        var node = this.accountNodeMap[key];
        if(node)
        {
            this.draftNode.collapse();
            this.draftNode.children = [];
            this.draftNode.dynamicLoadComplete = false;
            this.accountTree.removeNode(node);
            this.accountTree.draw();
        }
    },
    deletePostGroupTreeNode : function(key)
    {
        var node = this.postgroupNodeMap[key];
        if(node)
        {
            this.postgroupTree.removeNode(node);
            this.postgroupTree.draw();
        }
    },
    updatePostgroupTreeNode : function(key, label)
    {
        var node = this.postgroupNodeMap[key];
        if(node)
        {
            for(var i = 0; i < dolls.Index.postgroups.length; i++)
            {
                var postgroup = dolls.Index.postgroups[i];
                if(postgroup.key == key)
                {
                    postgroup['name'] = label;
                    dolls.Index.postgroups[i] = postgroup;
                    break;
                }
            }
            var json = $.toJSON(postgroup);
            postgroup['onclick']='dolls.Index.viewDocuments(' + dolls.escapeHtml(json) + '); return false;';
            var title = $('#template_sidebar_title').val().process(postgroup);

            node.label = title;
            this.postgroupTree.draw();
        }
    },
    updateAccountTreeNode : function(key, label)
    {
        var node = this.accountNodeMap[key];
        if(node)
        {
            for(var i = 0; i < dolls.Index.accounts.length; i++)
            {
                var account = dolls.Index.accounts[i];
                if(account.key == key)
                {
                    account['name'] = label;
                    dolls.Index.accounts[i] = account;
                    break;
                }
            }
            var json = $.toJSON(account);
            account['onclick']='dolls.Index.viewDocuments(' + dolls.escapeHtml(json) + '); return false;';
            var title = $('#template_sidebar_title_with_image').val().process(account);

            node.label = title;
            this.draftNode.collapse();
            this.draftNode.children = [];
            this.draftNode.dynamicLoadComplete = false;
            this.accountTree.draw();
        }
    },
    showAccountTree : function()
    {
        var tree = new YAHOO.widget.TreeView('account-tree');
        var nodeOpen = function(node, completeCallBack)
        {
            var callback = function(json, status)
            {
                var channels = eval(json);
                for(var i = 0; i < channels.length; i++)
                {
                    var channel = channels[i];
                    var params = 
                    {
                        'type':'channel',
                        'key':channel.key,
                        'published':node.published
                    }
                    var json = $.toJSON(params)
                    channel['onclick']='dolls.Index.viewDocuments(' + dolls.escapeHtml(json) + '); return false;';
                    var title = $('#template_sidebar_title').val().process(channel);
                    new YAHOO.widget.TextNode(title, node, false);
                }
                completeCallBack();
            }
            var params = 
            {
                'type':'account',
                'key':node.key,
                'published':node.published
            };
            var query = $.param(params);
            dolls.post(dolls.urls.channels, query, callback);
        }

        for(var i = 0; i < this.accounts.length; i++)
        {
            var account = this.accounts[i];
            var params = 
            {
                'type':'account', 
                'key':account.key, 
                'published':account.published
            }
            var json = $.toJSON(params);
            account['onclick']='dolls.Index.viewDocuments(' + dolls.escapeHtml(json) + '); return false;';

            var title = $('#template_sidebar_title_with_image').val().process(account);
            var node = new YAHOO.widget.HTMLNode(title, tree.getRoot(), false, true);//TextNode(title, tree.getRoot(), false);

            node.key = account.key;
            node.published = account.published;
            node.setDynamicLoad(nodeOpen);
            this.accountNodeMap[account.key] = node;

            if(account.published == false)
            {
                this.draftNode = node;
            }
        }
        tree.draw();
        this.accountTree = tree;
    },
    showPostgroupTree : function()
    {
        var tree = new YAHOO.widget.TreeView('postgroup-tree');
        for(var i = 0; i < this.postgroups.length; i++)
        {
            var postgroup = this.postgroups[i];
            var params = 
            {
                'type':'postgroup', 
                'key':postgroup.key, 
                'published':postgroup.published
            }
            var json = $.toJSON(params);
            postgroup['onclick']='dolls.Index.viewDocuments(' + dolls.escapeHtml(json) + '); return false;';

            var title = $('#template_sidebar_title').val().process(postgroup);
            var node = new YAHOO.widget.TextNode(title, tree.getRoot(), false);
            node.key = postgroup.key;
            node.published = postgroup.published;
            this.postgroupNodeMap[postgroup.key] = node;
        }
        tree.draw();
        this.postgroupTree = tree;
    },
    initialize : function(tab)
    {
        this.menuTab = new YAHOO.widget.TabView('sidebar-tab');
        this.menuBar = new YAHOO.widget.MenuBar('appmenu', { 
                                            autosubmenudisplay: true, 
                                            hidedelay: false, 
                                            lazyload: true });
        this.showPostgroupTree();
        this.showAccountTree();
    },
    viewContacts : function()
    {
        var okHandler = function(){
            var query = $('#contactsForm').serialize();
            dolls.post(dolls.urls.contacts, query, null);
            this.hide();
        }
        var closeHandler = function() {
            this.hide();
        };
        var args = {'user': dolls.Index.user};
        var msg = $('#template_contacts').val().process(args);
        var dialog = new YAHOO.widget.SimpleDialog('error', {
            width: '500px',
            fixedcenter: true,
            visible: false,
            draggable: false,
            modal: true,
            close: true,
            text: msg,
            constraintoviewport: true,
            buttons: [
                {text: dolls.getMessage('button.ok'),
                 handler: okHandler,
                 isDefault: true},
                {text: dolls.getMessage('button.close'),
                 handler: closeHandler,
                 isDefault: true}
            ]
        });
        dialog.setHeader(dolls.getMessage('title.contacts'));
        dialog.render(document.body);
        dialog.show();
    },
    viewTrackbacks : function(key)
    {
        var okHandler = function(){
            var query = $('#trackbacksForm').serialize();
            query += ('&key='+key)
            var callback = function(json, status){
                eval(json);
            }
            dolls.post(dolls.urls.document_trackbacks, query, callback);
            this.hide();
        }
        var closeHandler = function() {
            this.hide();
        };

        var count = 0;
        var trackbacks = dolls.Index.trackbacks[key];
        if(trackbacks)
        {
            count = trackbacks.length;
        }
        var args = {'trackbacks':trackbacks, 'count':count};
        var msg = $('#template_trackbacks').val().process(args);
        var dialog = new YAHOO.widget.SimpleDialog('error', {
            width: '400px',
            fixedcenter: true,
            visible: false,
            draggable: false,
            modal: true,
            close: true,
            text: msg,
            constraintoviewport: true,
            buttons: [
                {text: dolls.getMessage('button.ok'),
                 handler: okHandler,
                 isDefault: true},
                {text: dolls.getMessage('button.close'),
                 handler: closeHandler,
                 isDefault: true}
            ]
        });
        dialog.setHeader(dolls.getMessage('title.trackbacks'));
        dialog.render(document.body);
        dialog.show();
    },
    viewChannelSettings : function(key)
    {
        var self = this;
        var callback = function(html, status){
            var okHandler = function(){
                var query = $('#channelSettingForm').serialize();
                dolls.post(dolls.urls.channel_settings_update, query, null);
                this.hide();
            }
            var closeHandler = function() {
                this.hide();
            };
            var dialog = new YAHOO.widget.SimpleDialog('error', {
                width: '600px',
                fixedcenter: true,
                visible: false,
                draggable: false,
                modal: true,
                close: true,
                text: html,
                constraintoviewport: true,
                buttons: [
                    {text: dolls.getMessage('button.ok'),
                     handler: okHandler,
                     isDefault: true}
                    /*
                    {text: dolls.getMessage('button.close'),
                     handler: closeHandler,
                     isDefault: true}
                     */
                ]
            });
            dialog.setHeader(dolls.getMessage('title.channel_settings'));
            dialog.render(document.body);
            dialog.show();
        }
        var query = $.param({'key':key});
        dolls.post(dolls.urls.channel_settings, query, callback);
    },
    viewUpdatePings : function()
    {
        var okHandler = function(){
            var query = $('#updatePingForm').serialize();
            var key = dolls.Index.channel['key'];
            query += ('&key='+key)
            var callback = function(json, status){
                eval(json);
            }
            dolls.post(dolls.urls.channel_ping_update, query, callback);
            this.hide();
        }
        var closeHandler = function() {
            this.hide();
        };
        var args = {'pings':dolls.Index.pings};
        var msg = $('#template_pings').val().process(args);
        var dialog = new YAHOO.widget.SimpleDialog('error', {
            width: '400px',
            fixedcenter: true,
            visible: false,
            draggable: false,
            modal: true,
            close: true,
            text: msg,
            constraintoviewport: true,
            buttons: [
                {text: dolls.getMessage('button.ok'),
                 handler: okHandler,
                 isDefault: true},
                {text: dolls.getMessage('button.close'),
                 handler: closeHandler,
                 isDefault: true}
            ]
        });
        dialog.setHeader(dolls.getMessage('title.update_ping'));
        dialog.render(document.body);
        dialog.show();
    },
    viewSettings : function()
    {
        var self = this;
        var callback = function(html, status){
            var okHandler = function(){
                var query = $('#settingForm').serialize();
                dolls.post(dolls.urls.settings_update, query, null);
                this.hide();
                dolls.dialogs.pop(dialog);
            }
            var closeHandler = function() {
                this.hide();
                dolls.dialogs.pop(dialog);
            };
            var dialog = new YAHOO.widget.SimpleDialog('error', {
                width: '550px',
                fixedcenter: true,
                visible: false,
                draggable: false,
                modal: true,
                close: true,
                text: html,
                constraintoviewport: true,
                buttons: [
                    {text: dolls.getMessage('button.ok'),
                     handler: okHandler,
                     isDefault: true}
                    /*
                    {text: dolls.getMessage('button.close'),
                     handler: closeHandler,
                     isDefault: true}
                     */
                ]
            });
            dialog.setHeader(dolls.getMessage('title.env'));
            dialog.render(document.body);
            dialog.show();
            self.useApi();
            dolls.dialogs.push(dialog);
        }
        dolls.post(dolls.urls.settings, null, callback);
    },
    viewAddDocument : function(document_key, e, offsetx, offsety, title, opts)
    {
        var url = dolls.urls.document_edit + '?';
        if(document_key != null)
        {
            url += $.param({'key':document_key});
        }
        dolls.Window.popup(e, offsetx, offsety, url, title, opts );
    },
    viewAddDocumentPopup : function(params, e, offsetx, offsety, title, opts)
    {
        var url = dolls.urls.document_edit + '?' + params;
        dolls.Window.popup(e, offsetx, offsety, url, title, opts );
    },
    viewDocument : function(json)
    {
        var document_key = json['key'];
        var header = $('#channel_content_header_' + document_key);
        var body = $('#channel_content_body_' + document_key);

        if(body.html().length > 0)
        {
            if(header.hasClass('open_list'))
            {
                header.removeClass('open_list');
                body.css('display', 'none');
            }
            else
            {
                header.addClass('open_list');
                body.css('display', '');
            }
        }
        else
        {
            var callback = function(html, status){
                body.html(html)
                body.css('display', '');
                header.addClass('open_list');
            }
            var query = $.param({'key':document_key});
            dolls.post(dolls.urls.document, query, callback);
        }
    },
    closeDocument : function(key)
    {
        $('#channel_content_body_' + key).css('display','none');
    },
    openDocuments : function()
    {
        var bodies = $('#main_content .channel_content_body_content');
        bodies.each(function() {
                $(this).css('display','');
            });
        $('#openDocuments').css('display','none');
        $('#closeDocuments').css('display','');
    },
    closeDocuments : function()
    {
        var bodies = $('#main_content .channel_content_body_content');
        bodies.each(function() {
                $(this).css('display','none');
            });
        $('#openDocuments').css('display','');
        $('#closeDocuments').css('display','none');
    },
    viewDocuments : function(json)
    {
        var callback = function(html, status){
            $( '#main' ).html(html)
        }

        var query = $.param(json)
        dolls.post(dolls.urls.documents, query, callback);
    },
    viewDeleteDocument : function(key)
    {
        var msg = $('#template_viewDeleteDocument').val().process({'key':key});
        var closeHandler = function() {
            this.hide();
        };
        var self = this;
        var okHandler = function()
        {
            this.hide();
            self.deleteDocument(key);
        }
        var dialog = new YAHOO.widget.SimpleDialog('error', {
            width: '400px',
            fixedcenter: true,
            visible: false,
            draggable: false,
            modal: true,
            close: true,
            text: msg,
            constraintoviewport: true,
            buttons: [
                {text: dolls.getMessage('button.ok'),
                 handler: okHandler,
                 isDefault: true},
                {text: dolls.getMessage('button.close'),
                 handler: closeHandler,
                 isDefault: true}
            ]
        });
        dialog.setHeader(dolls.getMessage('title.delete_post'));
        dialog.render(document.body);
        dialog.show();
    },
    deleteDocument : function(key)
    {
        var callback = function(html, status){
            $('#channel_content_'+key).remove();
        }
        var query = $('#deleteDocumentForm').serialize();
        dolls.post(dolls.urls.document_delete, query, callback);
    },
    syncChannel : function(key)
    {
        var callback = function(html, status){
            location.href='/';
        }
        var query = $.param({'key':key});
        dolls.post(dolls.urls.channel_sync, query, callback);
    }
}

dolls.PostGroup = 
{
    postgroupStorageMap : {},
    testSubmitPostGroup : function(form)
    {
        var name = $.trim(form['name'].value);
        if(name.length <= 0)
        {
            form['submitPostGroup'].disabled = true;
            return false;
        }
        var master_channel = form['master_channel'][0].value;
        if(!master_channel)
        {
            form['submitPostGroup'].disabled = true;
            return false;
        }

        form['submitPostGroup'].disabled = false;

        return true;
    },
    testSelectChannelButton : function(form)
    {
        // IEで不可能
        /*
        var count = dolls.OrderSelector.countSelected(form['available_channels']);
        if(count > 0)
        {
            form['addChannels'].disabled = false;
        }
        else
        {
            form['addChannels'].disabled = true;
        }
        */
        count = dolls.OrderSelector.count(form['channels']);
        if(count > 0)
        {
            form['deleteChannels'].disabled = false;
            form['addMasterChannel'].disabled = false;
            form['addSlaveChannels'].disabled = false;
        }
        else
        {
            form['deleteChannels'].disabled = true;
            form['addMasterChannel'].disabled = true;
            form['addSlaveChannels'].disabled = true;
        }

        count = dolls.OrderSelector.count(form['master_channel']);
        if(count > 0)
        {
            form['deleteMasterChannel'].disabled = false;
        }
        else
        {
            form['deleteMasterChannel'].disabled = true;
        }

        count = dolls.OrderSelector.count(form['slave_channels']);
        if(count > 0)
        {
            form['deleteSlaveChannels'].disabled = false;
        }
        else
        {
            form['deleteSlaveChannels'].disabled = true;
        }
    },
    viewAddPostGroup : function()
    {
        var self = this;
        var callback = function(html, status){
            $( '#main' ).html(html)
            var accounts = $('#resources_accounts_js').val();
            self.accounts = eval('(' + accounts + ')');

            var form = $('#addPostGroupForm').get(0);
            dolls.OrderSelector.add(form['account'], self.accounts);

            var channels = [];
            for(var i = 0; i < self.accounts.length; i++)
            {
                channels = channels.concat(self.accounts[i]['channels']);
            }
            dolls.OrderSelector.add(form['available_channels'], channels);

            var storages = $('#resources_storages_js').val();
            self.storages = eval('(' + storages + ')');
            dolls.OrderSelector.add(form['storage'], self.storages);

            $( '#postgroup-name').focus();
        }
        dolls.post(dolls.urls.postgroup_add, null, callback );
    },
    viewEditPostGroup : function(key)
    {
        var self = this;
        var callback = function(html, status){
            $( '#main' ).html(html)
            var accounts = $('#resources_accounts_js').val();
            self.accounts = eval('(' + accounts + ')');

            var storages = $('#resources_storages_js').val();
            self.storages = eval('(' + storages + ')');
        }
        dolls.post(dolls.urls.postgroup_edit, null, callback );
    },
    switchPostGroupContent : function(key)
    {
        $('#postgroup-delete-' + key).css('display','none');
        var display = $( '#postgroup-edit-' + key ).css( 'display' );
        if( display == 'none' )
        {
            var name = $('#postgroup-name-read-' +key).html();
            $('#postgroup-edit-' + key).css('display','');
            $('#postgroup-close-' + key).css('display','');
            $('#postgroup-open-' + key).css('display','none');
            $('#postgroup-name-edit-' +key).css('display','');
            $('#postgroup-name-edit-' +key).attr('value', name);
            $('#postgroup-name-read-' +key).css('display','none');
        }
        else
        {
            $('#postgroup-edit-' + key).css('display','none');
            $('#postgroup-close-' + key).css('display','none');
            $('#postgroup-open-' + key).css('display','');
            $('#postgroup-name-edit-' +key).css('display','none');
            $('#postgroup-name-read-' +key).css('display','');
        }
    },
    viewEditPostGroupContent : function(key)
    {
        var length = $('#postgroup-edit-' + key).html().length;
        if(length <= 0)
        {
            var self = this;
            var callback = function(html, status)
            {
                $( '#postgroup-edit-'+key ).html(html);

                var select_storage = $('#resources_select_storage_'+key).val();
                var form = $('#postgroup-form-' + key).get(0);
                dolls.OrderSelector.add(form['account'], self.accounts);

                var channels = [];
                for(var i = 0; i < self.accounts.length; i++)
                {
                    channels = channels.concat(self.accounts[i]['channels']);
                }
                dolls.OrderSelector.add(form['available_channels'], channels);
                dolls.OrderSelector.add(form['storage'], self.storages);
                dolls.OrderSelector.select(form['storage'], [select_storage], true);

                self.testSelectChannelButton(form);
                self.switchPostGroupContent(key);
            }
            var query = $.param({'key':key});
            dolls.post(dolls.urls.postgroup_view, query, callback);
        }
        else
        {
            this.switchPostGroupContent(key);
        }
    },
    viewDeletePostGroupContent : function(key)
    {
        $('#postgroup-edit-' +key).css('display','none');
        $('#postgroup-name-edit-' +key).css('display','none');
        $('#postgroup-name-read-' +key).css('display','');

        var display = $( '#postgroup-delete-' + key ).css( 'display' );
        if( display == 'none' )
        {
            $('#postgroup-delete-' + key).css('display','');
            $('#postgroup-close-' + key).css('display','');
            $('#postgroup-open-' + key).css('display','none');
        }
        else
        {
            $('#postgroup-delete-' + key).css('display','none');
            $('#postgroup-close-' + key).css('display','none');
            $('#postgroup-open-' + key).css('display','');
        }
    },
    addPostGroup : function()
    {
        var form = $( '#addPostGroupForm' ).get(0);
        dolls.OrderSelector.prepareSubmit(form['channels']);
        dolls.OrderSelector.prepareSubmit(form['master_channel']);
        dolls.OrderSelector.prepareSubmit(form['slave_channels']);

        var params = $( '#addPostGroupForm' ).serialize();
        var callback = function(html, status){
            var msg = dolls.getMessage('success.add_postgroup');
            var okHandler = function() {
                location.href='/';
            };
            var dialog = new YAHOO.widget.SimpleDialog('success', {
                width: '320px',
                fixedcenter: true,
                visible: false,
                draggable: false,
                modal: true,
                close: false,
                text: msg,
                icon: YAHOO.widget.SimpleDialog.ICON_INFO,
                constraintoviewport: true,
                buttons: [
                    {text: dolls.getMessage('button.ok'),
                     handler: okHandler,
                     isDefault: true}
                ]
            });
            dialog.render(document.body)
            dialog.show();
        }
        dolls.post(dolls.urls.postgroup_new, params, callback );
    },
    updatePostGroup : function(key)
    {
        var form = $( '#postgroup-form-'+key ).get(0);
        dolls.OrderSelector.prepareSubmit(form['channels']);
        dolls.OrderSelector.prepareSubmit(form['master_channel']);
        dolls.OrderSelector.prepareSubmit(form['slave_channels']);

        var name = $('#postgroup-name-edit-' +key).attr('value');
        var callback = function(html, status){

            $('#postgroup-name-read-' +key).html(name);
            $('#postgroup-name-read-' +key).css('display','');
            $('#postgroup-name-edit-' +key).css('display','none');
            $('#postgroup-edit-' +key).css('display','none');
            $('#postgroup-close-' + key).css('display','none');
            $('#postgroup-open-' + key).css('display','');
            dolls.Index.updatePostgroupTreeNode(key, name);
        }
        var query = $('#postgroup-form-'+key).serialize();
        dolls.post(dolls.urls.postgroup_update, query, callback);
    },
    deletePostGroup : function(key)
    {
        var callback = function(html, status){
            $('#postgroup-'+key).remove();
            dolls.Index.deletePostGroupTreeNode(key);
        }
        var query = $.param({'key':key});
        dolls.post(dolls.urls.postgroup_delete, query, callback);
    },
    selectAccount : function(form)
    {
        var elements = form.elements;
        var account_key = elements['account'].value;
        var channels = [];

        // 指定されたアカウントのチャネル
        if(account_key != '')
        {
            for(var i = 0; i < this.accounts.length; i++)
            {
                if( account_key == this.accounts[i]['value'] )
                {
                    channels = this.accounts[i]['channels'];
                    break;
                }
            }
        }
        else
        {
            // すべてのチャネル
            for(var i = 0; i < this.accounts.length; i++)
            {
                channels = channels.concat(this.accounts[i]['channels']);
            }
        }

        var available_channels = elements['available_channels'];
        dolls.OrderSelector.clear(available_channels);
        dolls.OrderSelector.add(available_channels, channels);

        this.testSelectChannelButton(form);
    },
    addChannel : function(form)
    {
        var elements = form.elements;
        dolls.OrderSelector.copyTo(elements['channels'], elements['available_channels'], true);
        this.testSelectChannelButton(form);
    },
    deleteChannel : function(form)
    {
        var elements = form.elements;
        dolls.OrderSelector.remove(elements['channels']);
        this.testSelectChannelButton(form);
    },
    addMasterChannel : function(form)
    {
        var elements = form.elements;
        for( var i = 0; i < elements['channels'].options.length; i++ )
        {
            var option = elements['channels'].options[i];
            if(option.selected && option.value != '')
            {
                elements['master_channel'].options[0] = new Option(option.text, option.value);
                elements['master_channel'].options[0].selected = true;
                elements['channels'].options[i] = null;
                if(elements['channels'].options.length <= 0)
                {
                    elements['channels'].options[i] = new Option(dolls.OrderSelector.whiteSpace, '');
                }
                break;
            }
        }
        this.testSubmitPostGroup(form);
        this.testSelectChannelButton(form);
    },
    deleteMasterChannel : function(form)
    {
        var elements = form.elements;
        if(elements['master_channel'].options[0].value != '')
        {
            var length = elements['channels'].options.length;
            var master_value = elements['master_channel'].options[0].value;
            var finded = false;
            for( var i = 0; i < length; i++)
            {
                if(master_value == elements['channels'].options[i].value)
                {
                    finded = true;
                    break;
                }
            }

            if(!finded)
            {
                var v = elements['master_channel'].options[0];
                var o = new Option(v.text, v.value);
                elements['channels'].options[length] = o;
                elements['channels'].options[length].selected = true;
                if(length <= 1)
                {
                    elements['channels'].options[0] = null;
                }
            }
            elements['master_channel'].options[0] = new Option(dolls.OrderSelector.whiteSpace, '');
        }
        this.testSubmitPostGroup(form);
        this.testSelectChannelButton(form);
    },
    addSlaveChannel : function(form)
    {
        var elements = form.elements;
        dolls.OrderSelector.moveTo(elements['slave_channels'], elements['channels'], true);
        this.testSelectChannelButton(form);
    },
    deleteSlaveChannel : function(form)
    {
        var elements = form.elements;
        dolls.OrderSelector.moveTo(elements['channels'], elements['slave_channels'], true);
        this.testSelectChannelButton(form);
    }
}

dolls.Account = 
{
    testSumbitConfirmAccount : function(form)
    {
        var checked = false;
        var elements = form.elements;
        for(var i = 0; i < elements.length; i++)
        {
            var element = elements[i];
            if(element.name == 'channel_id' && element.checked)
            {
                checked = true;
                break;
            }
        }
        if(!checked)
        {
            form['submitAccount'].disabled = true;
            return false;
        }

        var name = $.trim(form['account_name'].value);
        if(name.length <= 0)
        {
            form['submitAccount'].disabled = true;
            return false;
        }

        form['submitAccount'].disabled = false;
    },
    testSubmitAddAccount : function(form)
    {
        var name = $.trim(form['username'].value);
        if(name.length <= 0)
        {
            form['submitAccount'].disabled = true;
            return false;
        }
        var index = form['service'].selectedIndex;
        var key = form['service'][index].value;
        if(!key)
        {
            form['submitAccount'].disabled = true;
            return false;
        }

        var service = dolls.getServiceInfo(key);
        if( service.type != 0 )
        {
            var end_point = $.trim(form['end_point'].value);
            if(!end_point)
            {
                form['submitAccount'].disabled = true;
                return false;
            }
        }

        form['submitAccount'].disabled = false;
        return true;
    },
    selectService : function(key)
    {
        var s = $( '#service' ).get(0);
        if(s.options[0].value == '')
        {
            s.options[0] = null;
        }

        var service = dolls.getServiceInfo(key);

        // 要カスタマイズ
        if( service.type != 0 )
        {
            $( '#account-custom-area' ).css( 'display', '' );
            $( '#endpoint' ).attr( 'value', service.end_point );
            var api_key = service.api;
            var apis = $('#api option');
            apis.each(function() {
                if ($(this).val() == api_key) {
                    $(this).attr('selected', 'selected');
                    return true;
                }
            });

            // フルカスタマイズ
            if( service.type == 2 )
            {
                $( '#account-api-area' ).css( 'display', 'none' );
                $( '#account-auth-area' ).css( 'display', 'none' );
            }
            else
            {
                $( '#account-api-area' ).css( 'display', '' );
                $( '#account-auth-area' ).css( 'display', '' );
            }
        }
        else
        {
            $( '#account-custom-area' ).css( 'display', 'none' )
        }

        if( service.notice.length > 0 )
        {
            $( '#account-notice-area' ).css( 'display', '' );
            $( '#account-notice-area' ).html(service.notice);
        }
        else
        {
            $( '#account-notice-area' ).css( 'display', 'none' );
        }

        if( service.url_address.length > 0 )
        {
            $( '#account-url-address-area' ).css( 'display', '' );
            $( '#url-address' ).html($('#template_account_url_address').val().process(service));
        }
        else
        {
            $( '#account-url-address-area' ).css( 'display', 'none' );
        }

        var form = $('#addAccountForm').get(0);
        this.testSubmitAddAccount(form);
    },
    checkChannels : function(form)
    {
        var checked = false;
        var inputs = $( '#addAccountForm input' );
        inputs.each(function() {
            if($(this).attr('name') == 'channel_id' && 
               $(this).attr('checked') == false)
            {
                checked = true;
                return true;
            }
        });
        inputs.each(function() {
            $(this).attr('checked', checked)
        });
        this.testSumbitConfirmAccount(form);
    },
    viewAddAccount : function()
    {
        var t = $( '#template_addAccount' ).val();
        $( '#main' ).html(t);
        $('#service').focus();
    },
    viewEditAccount : function()
    {
        var callback = function(html, status){
            $( '#main' ).html(html);
        }
        dolls.post(dolls.urls.accounts_edit, null, callback );
    },
    viewEditAccountContent : function(key)
    {
        $('#account-delete-' + key).css('display','none');

        var display = $( '#account-edit-' + key ).css( 'display' );
        if( display == 'none' )
        {
            var name = $('#account-name-read-' +key).html();
            $('#account-edit-' + key).css('display','');
            $('#account-close-' + key).css('display','');
            $('#account-open-' + key).css('display','none');
            $('#account-name-edit-' +key).css('display','');
            $('#account-name-edit-' +key).attr('value', name);
            $('#account-name-read-' +key).css('display','none');
        }
        else
        {
            $('#account-edit-' + key).css('display','none');
            $('#account-close-' + key).css('display','none');
            $('#account-open-' + key).css('display','');
            $('#account-name-edit-' +key).css('display','none');
            $('#account-name-read-' +key).css('display','');
        }
    },
    viewDeleteAccountContent : function(key)
    {
        $('#account-edit-' +key).css('display','none');
        $('#account-name-edit-' +key).css('display','none');
        $('#account-name-read-' +key).css('display','');

        var display = $( '#account-delete-' + key ).css( 'display' );
        if( display == 'none' )
        {
            $('#account-delete-' + key).css('display','');
            $('#account-close-' + key).css('display','');
            $('#account-open-' + key).css('display','none');
        }
        else
        {
            $('#account-delete-' + key).css('display','none');
            $('#account-close-' + key).css('display','none');
            $('#account-open-' + key).css('display','');
        }
    },
    confirmAccount : function()
    {
        var params = $( '#addAccountForm' ).serialize();
        var callback = function(html, status){
            $( '#main' ).html(html);
        }
        dolls.post(dolls.urls.account_new_confirm, params, callback);
    },
    registerAccount :  function()
    {
        var params = $( '#addAccountForm' ).serialize();
        var callback = function(html, status){

            msg = $('#template_successAddAccount').val();
            var okHandler = function() {
                location.href='/';
            };
            var dialog = new YAHOO.widget.SimpleDialog('success', {
                width: '320px',
                fixedcenter: true,
                visible: false,
                draggable: false,
                modal: true,
                close: false,
                text: msg,
                icon: YAHOO.widget.SimpleDialog.ICON_INFO,
                constraintoviewport: true,
                buttons: [
                    {text: dolls.getMessage('button.ok'),
                     handler: okHandler,
                     isDefault: true}
                ]
            });
            dialog.render(document.body)
            dialog.show();
        }
        dolls.post(dolls.urls.account_new_register, params, callback);
    },
    updateAccount : function(key)
    {
        var name = $('#account-name-edit-' +key).attr('value');
        var callback = function(html, status){

            $('#account-name-read-' +key).html(name);
            $('#account-name-read-' +key).css('display','');
            $('#account-name-edit-' +key).css('display','none');
            $('#account-edit-' +key).css('display','none');
            $('#account-close-' + key).css('display','none');
            $('#account-open-' + key).css('display','');
            dolls.Index.updateAccountTreeNode(key, name);
        }
        var query = $('#account-form-'+key).serialize();
        dolls.post(dolls.urls.account_update, query, callback);
    },
    deleteAccount : function(key)
    {
        var callback = function(html, status){
            $('#account-'+key).remove();
            dolls.Index.deleteAccountTreeNode(key);
        }
        var query = $.param({'key':key});
        dolls.post(dolls.urls.account_delete, query, callback);
    }
}

dolls.Document = 
{
    setuped : false,
    isOpenArea : function(key)
    {
        var opened = $(key+'-img-open').css('display');
        if(opened == 'none')
        {
            return true;
        }
        return false;
    },
    closeArea : function(key)
    {
        $(key+'-body').css('display','none');
        $(key+'-img-open').css('display','');
        $(key+'-img-close').css('display','none');
    },
    openArea : function(key)
    {
        $(key+'-body').css('display','');
        $(key+'-img-open').css('display','none');
        $(key+'-img-close').css('display','');
    },
    switchArea : function(key)
    {
        if(this.isOpenArea(key))
        {
            this.closeArea(key);
        }
        else
        {
            this.openArea(key);
        }
    },
    viewCategories : function()
    {
        var self = this;
        var key = '#doc-category-area';
        var body = $(key+'-body');
        if(body.html().length > 0)
        {
            body.css('display','');
            self.switchArea(key);
        }
        else
        {
            var form = $('#editDocumentForm').get(0);
            var callback = function(html, status){
                body.html(html);
                self.openArea(key);
            }
            var document_key = form['key'].value;
            var post = $('#post').val();
            var query = $.param({'key':document_key, 'post':post});
            dolls.post(dolls.urls.document_categories, query, callback);
        }
    },
    addCategory : function(form)
    {
        var elements = form.elements;
        dolls.OrderSelector.copyTo(elements['post_categories'], elements['available_categories'], true);
    },
    deleteCategory : function(form)
    {
        var elements = form.elements;
        dolls.OrderSelector.remove(elements['post_categories']);
    },
    viewTags : function()
    {
        var self = this;
        var key = '#doc-tag-area';
        var body = $(key+'-body');
        if(body.html().length > 0)
        {
            body.css('display','');
            self.switchArea(key);
            $('#tag_value').focus();
        }
        else
        {
            var form = $('#editDocumentForm').get(0);
            var callback = function(html, status){
                body.html(html);
                self.openArea(key);
                $('#tag_value').focus();
            }
            var document_key = form['key'].value;
            var query = $.param({'key':document_key});
            dolls.post(dolls.urls.document_categories, query, callback);
        }
    },
    addTag : function()
    {
        var tag = $.trim($('#tag_value').val());
        if(tag.length <= 0) return false;

        var tags = $('#tag_list .tags');
        var comma = true;
        if(tags.length == 0)
        {
            comma = false;
        }
        var args = {
            'comma':comma,
            'tag':tag
        };

        var v = $('#template_tag').val().process(args);
        var h = $('#tag_list').html();
        h += v;
        $('#tag_list').html(h);
        $('#tag_value').val('');
    },
    viewOptions : function()
    {
        var self = this;
        var key = '#doc-option-area';
        var body = $(key+'-body');
        if(body.html().length > 0)
        {
            body.css('display','');
            self.switchArea(key);
            $('#trackbacks').focus();
        }
        else
        {
            var form = $('#editDocumentForm').get(0);
            var callback = function(html, status){
                body.html(html);
                self.openArea(key);
                $('#trackbacks').focus();
            }
            var document_key = form['key'].value;
            var query = $.param({'key':document_key});
            dolls.post(dolls.urls.document_options, query, callback);
        }
    },
    updateDocument : function(publish)
    {
        var callback = function(html, status){
            // TODO
            // jsonデータからそれぞれのステータス表示
            var handler = function()
            {
                this.hide();
            }
            var dialog = new YAHOO.widget.SimpleDialog('success', {
                width: '320px',
                fixedcenter: true,
                visible: false,
                draggable: false,
                modal: true,
                close: false,
                text: html,
                icon: YAHOO.widget.SimpleDialog.ICON_INFO,
                constraintoviewport: true,
                buttons: [
                    {text: dolls.getMessage('button.ok'),
                     handler: handler,
                     isDefault: true}
                ]
            });
            dialog.render(document.body);
            dialog.show();
        }

        var query = $('#editDocumentForm').serialize();
        query += ('&publish='+publish);

        var editor = FCKeditorAPI.GetInstance('description');
        var description = encodeURIComponent(editor.GetHTML());
        query += ('&description='+description);

        dolls.post(dolls.urls.document_update, query, callback);
    },
    closeWindow : function()
    {
        window.close();
    },
    selectPost : function(init)
    {
        if(!this.setuped)
        {
            if(init != true)
            {
                var post = $('#post').get(0);
                post.options[0] = null;
            }

            $('#content-header').css('z-index', 0);
            $('input').attr('disabled', false);
            $('select').attr('disabled', false);
            $('textarea').attr('disabled', false);

            var form = $('#editDocumentForm').get(0);
            this.usePublishDateTime(form);
            this.setuped = true;

            $('#setup').css('display', 'none');
        }

        this.closeArea('#doc-category-area');
        $('#doc-category-area-body').html('');
    },
    setCurrentDateTime : function(form)
    {
        var now = new Date();
        form.year.value = now.getFullYear();
        form.month.value = now.getMonth() + 1;
        form.day.value = now.getDate();
        form.hour.value = now.getHours();
        form.minute.value = now.getMinutes();
    },
    usePublishDateTime : function(form)
    {
        if(form.use_pub_date.checked)
        {
            form.year.disabled = false;
            form.month.disabled = false;
            form.day.disabled = false;
            form.hour.disabled = false;
            form.minute.disabled = false;
            dolls.Document.setCurrentDateTime(form);
        }
        else
        {
            form.year.disabled = true;
            form.month.disabled = true;
            form.day.disabled = true;
            form.hour.disabled = true;
            form.minute.disabled = true;
        }
    },
    initialize : function()
    {
        var form = $('#editDocumentForm').get(0);
        this.setCurrentDateTime(form);

        $('input').attr('disabled', true);
        $('select').attr('disabled', true);
        //$('textarea').attr('disabled', true);
        $('#post').attr('disabled', false);

        $('#spinner').css('display','none');
        $('#content-header').css('z-index', 15);
        var post = $('#post').val();
        if(post)
        {
            this.selectPost(true);
        }
    }
}

dolls.Affiliate = {
    initialize : function()
    {
        dolls.Affiliate.selectType();
    },
    search : function(page)
    {
        $('#affiliate_page').attr('value', page);
        var query = $('#affiliateForm').serialize();
        var callback = function(html, status){
            $('#contentArea').html(html);
        }
        dolls.post(dolls.urls.affiliate_search, query, callback);
    },
    selectType : function()
    {
        var type = $('#affiliate_type').val();
        var v = $('#template_affiliate_region_'+type).val();
        $('#affiliateRegionArea').html(v);

        v = $('#template_affiliate_search_index_'+type).val();
        $('#affiliateSearchIndexArea').html(v);
    },
    selectProduct : function(id)
    {
      var map_key = $('#affiliate_map_key').val();
      var parent = window.opener.document;
      if( parent )
      {
        var name = 'affiliate_'+id;
        var mapping = parent.templateTableForm.elements[map_key + '_mapping'].value;
        var json = eval('(' + mapping + ')');
        for(var key in json)
        {
            var to = json[key];
            var value = document.forms[name][key].value;
            if(!parent.templateTableForm.elements[to])
            {
                alert(key);
                alert(to);
            }
            parent.templateTableForm.elements[to].value=value;
        }
        window.close();
      }
    }
}

$().ajaxStart(function() {
    var progressbar = dolls.showProgress('progress.wait');
    progressbar.show();
    dolls.progressbars.push(progressbar);
});

$().ajaxStop(function() {
    var progressbar = dolls.progressbars.pop();
    if(progressbar)
    {
        progressbar.hide();
    }
});

$().ajaxComplete(function(event, request, settings) {
    var progressbar = dolls.progressbars.pop();
    if(progressbar)
    {
        progressbar.hide();
    }

    if (request == null) {
        return;
    }

    //TODO ログインが必要ならログイン画面にリダイレクト
    if (request.getResponseHeader('X-Login') == 1) {
        var href = location.href;
        //TODO 簡易フラグメント除去（URLを再構築すべきかも。。）
        var index = href.indexOf('#');
        if (index != -1) {
            href = href.substring(0, index);
        }
        location.href = href;
        return true;
    }
    if (request.status > 300 && request.status < 304) {
        location.href = reqeust.getResponseHeader('Location');
        return true;
    }
    /*
    if (request.getResponseHeader('X-Error')) {
        var args = eval('(' + request.responseText + ')');
        alert(11111);
        return dolls.showApplicationError(args);
    }
    */
});
$().ajaxError(dolls.showAjaxError);

dolls.init();
window.dolls = dolls;

})();
